MySQL新一代HA架构:mysqlfailover + semisync of mysql5.7

使用mysql5.7 增强半同步,GTID复制,设置master wait永不超时,外加mysqlfailover自动切换。可实现新一代高可用架构,零事务丢失自动切换!

搭建步骤

  1. 搭建一主两从(至少两从)增强半同步架构(安装略)。
    master 半同步配置用不超时:
    rpl_semi_sync_master_wait_for_slave_count=1
    rpl_semi_sync_master_wait_no_slave=ON
    rpl_semi_sync_master_timeout=1000000000000000000
    rpl_semi_sync_master_wait_point=AFTER_SYNC
    
    salve 的my.cnf配置(主库也要配置,防止主库切换后,再次以从库的角色加入集群,无法被自动发现):
    report_host='172.40.0.164' # the ip of the slave
    report_port=3306
    master_info_repository=TABLE
    
    注意从库不能配置super_read_only=ON
  2. 在一台单独的监控机上安装mysqlfailover.
    wget -c https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5-1.el7.noarch.rpm
    
    #mysqlfailover脚本依赖依赖mysql python connector
    
    wget -c https://dev.mysql.com/get/Downloads/Connector-Python/mysql-connector-python-2.1.7-1.el7.x86_64.rpm
    
    #安装:
    rpm -ivh mysql-connector-python-2.1.7-1.el7.x86_64.rpm
    rpm -ivh mysql-utilities-1.6.5-1.el7.noarch.rpm 
    
    
  3. failover监控脚本账号创建。mysqlfailover脚本使用一个数据库账号去监控集群中各节点状态,如果主库故障,会启用自动切换,切换时脚本会执行change master 等操作,且所有节点需要此账号,因此需要在主库上创建。此账号权限较大,为安全起见,可使用login-path.
    create user fo@'192.168.216.146' identified by 'fo';
    grant SUPER, REPLICATION SLAVE, SELECT, RELOAD, DROP, CREATE, INSERT on *.* to fo@'192.168.216.146'  with grant option;
    
    对于mysql5.7还需要授权:
    grant update,delete on mysql.* to 'fo'@'192.168.216.146';
    
    因为mysql 5.7中对于已经存在的账号,再次使用grant ... identified by 需要修改mysql库中的相关表。
  4. 在监控节点配置login-path
mysql_config_editor set --login-path=fo --user=fo --host=192.168.216.144 --port=3306 --password
# test login
mysql --login-path=fo
  1. 启动mysqlfailover
    mysqlfailover --master=fo --discover-slaves-login=fo --log=/tmp/fo.log  --rpl-user=repl:repl  --force
    

mysqlfailover在第一次连接的时候,会在mysql库下面创建failover_console表,里面记录了所监控master的ip和端口。正常退出,这个表会被drop掉。但对于非正常退出,这个表会一直存在。如果下次再尝试连接,则会警告:

Multiple instances of failover console found for master 192.168.216.144:3306.
If this is an error, restart the console with --force. 
Failover mode changed to 'FAIL' for this instance. 
Console will start in 10 seconds..........starting Console.

上述信息是说mysqlfailover检查到已经有一个进程在运行了,因此这个进程的mode被修改为FAIL, FAIL mode的意思是该进程只监控,不会执行切换。如果确认只有一个mysqlfailover在运行,可以使用--force参数。这里需要说一下failover的三种模式:

  • auto: (默认)。 自动切换模式。该模式在切换时,首先从candicate列表中选择,如果candicate列表的主机不可用,则会从其它的从节点选择一个作为新的master. 然后把新master配置为其它从节点的从库,复制缺少的事务,直到该master包含所有的事务(most update slave)
  • elect: 该模式和auto模式类似,只是它只从candidate列表中选择。如果列表不可用则报错退出。使用该模式必须用--candidates选项。
  • fail:该模式只监控,不执行切换。

测试

  1. 停止主库,等待约10s左右,可以看到切换动作
Failed to reconnect to the master after 3 attemps.
Failover starting in 'auto' mode...
# Candidate slave 192.168.216.145:3306 will become the new master.
# Checking slaves status (before failover).
# Preparing candidate for failover.
# Creating replication user if it does not exist.
# Stopping slaves.
# Performing STOP on all slaves.
# Switching slaves to new master.
# Disconnecting new master as slave.
# Starting slaves.
# Performing START on all slaves.
# Checking slaves for errors.
# Failover complete.
# Discovering slaves for master at 192.168.216.145:3306

Failover console will restart in 5 seconds.

  1. 重新启动原来的主节点,然后将其作为从库加入集群:
mysqlreplicate --master=fo:fo@192.168.216.145:3306 --slave=fo:fo@192.168.216.144:3306 --rpl-user=repl:repl

加入后,failover脚本很快就发现新节点,显示一主两从的架构。

  1. 重新启用原来的主节点为master
mysqlrpladmin --master=fo:fo@192.168.216.145:3306 \
> --slaves=fo:fo@192.168.216.144:3306,fo:fo@192.168.216.147:3306  \
> --rpl-user=repl:repl --new-master=fo:fo@192.168.216.144:3306 --demote-master switchover
WARNING: Using a password on the command line interface can be insecure.
# Checking privileges.
# Performing switchover from master at 192.168.216.145:3306 to slave at 192.168.216.144:3306.
# Checking candidate slave prerequisites.
# Checking slaves configuration to master.
# Waiting for slaves to catch up to old master.
# Stopping slaves.
# Performing STOP on all slaves.
# Demoting old master to be a slave to the new master.
# Switching slaves to new master.
# Starting all slaves.
# Performing START on all slaves.
# Checking slaves for errors.
# Switchover complete.
#
# Replication Topology Health:
+------------------+-------+---------+--------+------------+---------+
| host             | port  | role    | state  | gtid_mode  | health  |
+------------------+-------+---------+--------+------------+---------+
| 192.168.216.144  | 3306  | MASTER  | UP     | ON         | OK      |
| 192.168.216.145  | 3306  | SLAVE   | UP     | ON         | OK      |
| 192.168.216.147  | 3306  | SLAVE   | UP     | ON         | OK      |
+------------------+-------+---------+--------+------------+---------+
# ...done.

切换后发现,failover脚本监控失败:


Replication Health Status
+------------------+-------+---------+--------+------------+------------------------------------+
| host             | port  | role    | state  | gtid_mode  | health                             |
+------------------+-------+---------+--------+------------+------------------------------------+
| 192.168.216.145  | 3306  | MASTER  | UP     | ON         | OK                                 |
| 192.168.216.144  | 3306  | SLAVE   | WARN   |            | Slave is not connected to master.  |
| 192.168.216.147  | 3306  | SLAVE   | WARN   |            | Slave is not connected to master.  |
+------------------+-------+---------+--------+------------+------------------------------------+

看来这种情下必须重启mysqlfailover脚本!

  1. 使用sysbench 对主库压测,监控信息会显示延迟情况。
Replication Health Status
+------------------+-------+---------+--------+------------+--------------------------------------------------------------------------------------------+
| host             | port  | role    | state  | gtid_mode  | health                                                                                     |
+------------------+-------+---------+--------+------------+--------------------------------------------------------------------------------------------+
| 192.168.216.144  | 3306  | MASTER  | UP     | ON         | OK                                                                                         |
| 192.168.216.145  | 3306  | SLAVE   | UP     | ON         | Slave delay is 6 seconds behind master., No, Slave has 3916 transactions behind master.    |
| 192.168.216.147  | 3306  | SLAVE   | UP     | ON         | Slave delay is 59 seconds behind master., No, Slave has 33416 transactions behind master.  |
+------------------+-------+---------+--------+------------+--------------------------------------------------------------------------------------------+

在主从复制延迟的情况下,停掉主库,查看failover脚本切换状况。

Failed to reconnect to the master after 3 attemps.
Failover starting in 'auto' mode...
# Candidate slave 192.168.216.145:3306 will become the new master.
# Checking slaves status (before failover).
# Preparing candidate for failover.

发现切换时间明显增长,在Preparing candidate for failover.等待。查看从库状态,发现有一个尚未应用完binlog,当所有从库都应用完binglog时,才正式切换。这对保证数据一致性很重要!mysqlfailover已经做到这一点儿了。另外如果切换时主从延迟严重,切换时间会较长,这可以通过启用MTS来缓解。

问题

  1. 切换后,从库被提升为master , 但只读属性没有被取消。这会导致应用依然不能做业务。还一个问题是切换后,应该通知应用,连接新的master. (如修改DNS,或zookeeper中的masterIP,这取决于应用数据源的配置方式) 这些都可以通过脚本来实现。
    mysqlfailover 提供了两个注入脚本的接口:
    • --exec-before=script ,在切换开始前执行。
    • --exec-after=script , 在切换完成后执行。
      这意味着我们可以在切换完成后写个脚本去修改新master的只读属性,已经通知应用修改数据源地址(使用vip来解决更为优雅,但有些云环境不支持vip)。
  2. 使用--daemon=start 启动脚本时,不能使用--daemon=stop来终止。会造成从库sql_thread报错断开。须使用kill -9 pid . 启动时,加--force参数。我已向官方递交此bug (91562)

参考资料:

https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysqlfailover.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容