admin

  • MySQL MHA

    ·

    7月份YOSHINORI MATSUNOBU在Blog上Release了第一个版本的MySQL Master High Availability manager and tools(简称MHA)。

    1. Overview

    用于自动主备切换(Master的Failover),切换时间大约是10-30秒,MHA主要的优势是解决了主备的一致性问题,是第三方脚本的方式,对原来的MySQL没有任何影响,也不需要改变任何原来的架构部署。当然也支持在线的计划切换,切换时间大约也就0.5-2秒【可读,不可写】

    是一种简单、优雅的高可用解决方案,有一些功能:

    1.1 主库监控和Failover

    在一个配好的主从环境中,MHA能够实时的监控MySQL主库,如果探测到主库失败,则会启动自动的切换程序(master failover)。这时,MHA能够保证所有的备库上的数据都一致。MHA会检查所有备库上的relay log,并使用最靠前的relay log,来同步所有其他的备库,保证各个备库的数据一致。MHA一般能够很快完成切换工作:9-12秒来探测主库失败,7-10秒来关闭master来避免脑裂(可选的),然后在各个落后的备库上应用最新的日志(某一个备库上受到的最新的日志)。整个downtime大概是10-30秒。可以设置某一个备库,总是优先成为主库(可以通过在配置文件中设置优先级来实现),因为各个备库会全部同步,所以任何一个备库都可以成为主库。由于不一致导致的备库失败,这里都可以避免。

    1.2 命令行交互式切换(手动切换)

    不监控,直接进行切换操作。

    1.3 直接切换(非交互式)

    1.4 在线切换主库

    有时候,需要更换主库,例如原主库有已知的硬件故障(RAM、RAID control等)或者换上更好的硬件等等。这是一种计划切换,MHA能够非常快速、并且“一致的”的完成切换。所谓“一致的”,即避免在切换时,原主库上还存在存活的Session,在做一些事务,导致数据的不一致。MHA完成这个“一致的”切换,大概会有0.5-2秒的写阻塞,一般这都是可以接受的维护时间。

    2. Master Failover的挑战

    主库Failover并没有想象的那么繁琐。我们看看最典型的MySQL部署情况:单个主库拖多个备库。当主库挂了,则需要先找到“最新”的Slave,将其升级为新的主库,并且让其他的备库都指向这个新主库。这并不复杂。当找到“最新”的slave,很容易确定其他备库哪些event还没有收到,如果这些非“最新”的备库不问青红皂白就直接连到新主库上的话,则会导致一些数据不一致。为了避免这种不一致,则需要确定哪些是丢失的events,然后apply到这些备库上,再连新主库。如果手动来做这些事儿的话,那就十分繁琐而且复杂。在这个Slide里面详细描述了这个细节:Automated master failover

    Fig: Master Failover: What makes it difficult?

    “最新”的slave表示:获得最多binlog的备库。

    Currently most MySQL Replication users have no choice but to perform failover manually on master crashes.
    在主库crash的时候,目前还没有什么好办法保证各个备库的一致。所以,很多时候需要手动去做这些操作,虽然主库crash的时候不多,但是一旦出现,那将是“相当”(用宋丹丹的口气说)的痛苦。

    MHA目标就是实现这样的自动恢复。这个恢复包括选定新主库、确定各个备库relay log的差异、在新主库上应用差异的relay log,然后将其他备库指向新主库。一般MHA10-30秒可以完成全部的操作(可能更久如果你的备库延迟了很久的话)。

    MHA有自动和命令行切换工具,自动切换命令”masterha_manager (MHA Manager)”由主库监控和主库Failover两部分组成。masterha_manager一直监控主库是否可用,如果发现无法连接主库,则可以立即执行一个非交互是的切换过程。

    手动切换命令:masterha_master_switch先检查主库是否确实挂了,如果真挂了,masterha_master_switch选一个备库作为新主库(也可以指定一个),然后做恢复和切换。命令行把前面的复杂操作全部都封装起来了。

    当已经有了自己的监控系统时(例如,你可以使用Pacemake之类的监控),无需使用MHA的监控功能时,这个功能可以帮你实现MySQL的切换操作。

    3. MHA使用注意事项

    注意事项:

    1. 检测Master是否挂了,可以通过两个路由来确认。详细参考:secondary_network_script
    2. MHA完成切换后,应用还需要完成切换,可以通过脚本:master_ip_failover_script parameter来帮助你做后续的工作。
    3. 为了避免脑裂,MHA提供了一个关闭原Master的脚本shutdown_script parameter
    4. 另外MHA,还提供了一个发送Email切换报告的功能:report_script parameter
    5. 需要考虑级联的情况
    6. Relay log不能再做自动清除了,否则需要的时候可能就没了。需要手动清理relay log,清理relay log时需要注意,没有应用的relay log千万不要清,否则备库就需要重新指向了。MHA有个脚本可以做这个工作:purge_relay_logs script
    7. 在SBR时不要使用LOAD DATA INFILE

    参考资料

    1. MHA Google code主页
    2. MHA 文档资源
    3. MHA download
    4. MHA 介绍: Announcing MySQL-MHA: “MySQL Master High Availability manager and tools” |
    5. MHA for MySQL 0.52 released
  • 2011年2月9日

    ·

    今天是春节后的第一天上班,在家过完了农历年才最终感觉2010的结束。

    2010年4月份曾给自己的写了一份要求,刚才简单盘点了一下。

    希望中的2011:

    1. 每天下班后,自由工作两个小时,做自己喜欢做的事情。偶尔可以工作到凌晨。

    2. 坚持写博客,看很多电影、书,写影评、书评

    3. 通关一个游戏,偶尔打Dota

    4. 关注网络,关注CCTV;每天叠好被子,保持工牌吊带干净

    5. 有想法,先实现,再迭代,不要想太多

    6. 爱己,爱人;珍惜家人,朋友

    7. 不追求多么灿烂的人生,想清楚自己想要什么,希望找到自己活着的意义(有趣的参考 updated @2011-02-11)

    路

  • idata-Forum分享

    ·

    刚刚完成在idata-forum的主题分享,介绍了一下最近一年在MySQL方面的尝试,包括性能调优,代码优化方面的内容。

    不再紧张了。

  • 一个有趣的perl函数

    ·

    入职已经489天了,新鲜事很多,不过更多应该是无趣、枯燥的日常:装很多的数据库、反复的测试、写很多的脚本…… 不过,在这繁忙工作中,还是希望自己能够保持一份趣味。

    下面这个perl函数就是帮你保持脚本有趣的一个办法。

    在你的Perl脚本中下面的函数,并在脚本的第一行调用之。函数会在你的输出前随机的输出一条“名言”,让你在枯燥的调试程序时,仍然保持一份清醒:

    use MIME::Base64; ####################################################### # This is a interesting function by orczhou@gmail.com # It outputs a random quote ####################################################### sub randomQuote{ my @quote; push(@quote,"S2VlcCBpdCBzaW1wbGUsIFN0dXBpZA=="); push(@quote,"VG9tb3Jyb3cgaXMgYW5vdGhlciBkYXk="); push(@quote,"TGlmZSBpcyBsaWtlIGEgYm94IG9mY2hvY29sYXRlcw=="); push(@quote,"VGhlIGFuZ3J5IGlzIHRoYXQgdGFraW5nIHRoZSBvdGhlcidzIG1pc3Rha2UgdG8gcHVuaXNoIG9uZXNlbGY="); push(@quote,"VGhlIGhvcGUgb2YgdG9tb3Jyb3cgbGV0cyB1cyBmb3JnZXQgdG9kYXkncyBwYWlu"); push(@quote,"VGhlIHBsYWNlIHdoaWNoIHRoZSBpZGVhbCBpcyBpbiwgdGhlIGhlbGwgbWF5YmUgYSBoZWF2ZW4="); push(@quote,"Rm9yIGhpcyBsb25nIGFuZCBub24tdmlvbGVudCBzdHJ1Z2dsZSBmb3IgZnVuZGFtZW50YWwgaHVtYW4gcmlnaHRzIGluIENoaW5h"); push(@quote,"V2hhdCBpcyBkb25lIGJ5IG5pZ2h0IGFwcGVhcnMgYnkgZGF5"); push(@quote,"SWYgeW91IHdhbnQgdG8gaGF2ZSB0aGUgcGVyZmVjdCBmcmllbmRzaGlwLCBwb3NzaWJseSB5b3UgbWF5IGZpbmQgbm8gZnJpZW5kIGZvciBhbGw gbGlmZXRpbWU="); push(@quote,"VGhlIGV4cGVyaWVuY2UgdGFrZXMgb3V0IGJ5IHRoZSBlc3NlbmNlIG9mIHBhaW4="); push(@quote,"VGhlIGJpZ2dlc3QgbWlzdGFrZSBpbiBsaWZlIGlzIHRoZSB1bmNlYXNpbmdseSB3b3JyaWVkIGFib3V0IG1ha2luZyBtaXN0YWtl"); push(@quote,"TGF6aW5lc3Mgd2lsbCBjYXVzZSB5b3UgcGFpbg=="); push(@quote,"S2VlcCB0aGUgcGFzc2lvbiBmb3IgeW91ciBqb2I="); push(@quote,"VGhlcmUgaXMgb2Z0ZW4gbGVzcyBkYW5nZXIgaW4gdGhlIHRoaW5ncyB3ZSBmZWFyIHRoYW4gaW4gdGhlIHRoaW5ncyB3ZSBkZXNpcmU="); push(@quote,"WW91IGNhbiB1c2Ugc2NyaXB0IGRvIG1vcmUgd29yayxidXQgc2FkZGx5IGl0IG1ha2UgbW9yZSBqb2JzIGNvbWUgdG8gdQ=="); push(@quote,"TXkgbmFtZSBpcyBteXNxbGRhdXRvLkkgd2FzIGNyZWF0ZWQgYnkgb3JjemhvdQ=="); #push(@quote,""); my $count = scalar(@quote); my $rand_num = int(rand($count)); print decode_base64($quote[$rand_num])."\n"; } randomQuote();

    如果觉得上面的代码,破坏了脚本的输出,可以使用参数控制其是否输出。

  • 这是在2010年,第一次淘宝数据库技术沙龙上的一次分享,包含了淘宝在MySQL技术上的探索:

    • 如何批量化管理
    • 如何监控
    • 如何测试
    • 如何保持生产环境稳定性等
    managemysqlwithopensource-100620074016-phpapp01

    下载链接:Manage MySQL with Open Source

  • 通过ssh在Linux终端下工作,有一个很烦的事情就是,如果需要执行一个长时间的命令(例如拷贝一个大文件,或者做DDL)时,如果终端意外断开(网络或者别的原因),一般命令就会终止,当然你可以使用nohup命令,这里提供另一个办法:使用screen。

    概述

    一般,我们创建一个screen会话,然后连接会话并在会话下工作,这时候,我们可以随时挂起会话,去做别的事情,而且这个挂起的会话会一直在后台执行。而后又可以重新连接会话。下面是一个简单的How-to:

    1. How-to

    1.1 创建一个screen会话

    screen -dmS supu

    该命令,创建一个名为supu的会话,当时并不立刻进入会话。

    (more…)