自动故障转移,已经与MGR接触了一段时间。随着MySQL8.0.23的到来,基于MySQLGroupReplicaion(MGR)的高可用架构提供了一种全新的架构思路。容灾机房的slave如何更好的支持机房的MGR?MGR可以损坏多少节点?这次我就基于以上两个问题,和大家简单聊聊MGR的一些思路和功能。1、MySQLGroupRelication成员数的容错能力相信大家都不陌生。我经常在采访中问:“最多4个节点的坏MGR有多少?”大多数人的回答是:“最坏的1个,坏了2个,脑子就不行了。”那我们看看MGR是怎么处理的,是不是这个答案?1)我们有一个4节点的MGR有问题:这个图看起来是Single模式,但是箭头不是单向的,是不是错了?2)这时候Second-04突然宕机了,那么MGR集群会怎么样呢?此时集群的状态会变成:每个节点都会定时交换自己的信息。当Second-04节点没有收到信息,其他成员会等待5秒,在此期间,Second-04肯定没有发送任何消息,所以健康成员认为Second-04处于可疑状态,将其标记为UNREACHABLE。那么健康成员成员根据参数继续等待:group_replication_member_expel_timeout(此时Second-04还处于UNREACHABLE状态),当超过group_replication_member_expel_timeout时间后,健康的成员会将Second-04节点驱逐出集群,那么重要的来了点,敲Second-04的黑板上,未被驱逐时:此时集群为(4个节点-3个健康-1个坏的),如果在此期间有一个节点继续坏掉,则集群变为(4个节点-2个healthy-2bad),集群不满足多数原则,每个节点无法写入(除非人工干预,强制指定集群成员列表)。在Second-04中,被逐出后:此时集群为(3节点-3健康-0坏),4节点集群退化为3节点健康集群。这时候集群仍然可以继续让一个节点失效,变成(3个节点-2个健康-1个坏)所以4节点的集群能不能坏掉还是1个还是2个取决于集群处理过程的阶段。PS:说一下刚才埋下的问题:这张图看起来是Single模式,但是箭头不是单向的,是不是错了?首先,在Single模式下,Second节点默认是不能写的,只是因为开启了Second节点的超只读。设置Second节点super-read-only=0,Second节点可以正常写入,可以同步其他节点(Primary和其他Second),传输还是基于Paxos协议。Runatrain:Second节点反向同步其他节点,不会经过冲突检测阶段(理论上效率高于多写模式),不做校验。如果你有兴趣,可以研究一下。2.异步连接故障转移MySQL8.0.22,引入了异步复制连接故障转移。很多朋友都发文介绍了。这里我只简单描述一下:1)同一机房1主1从,远程机房单独一个从节点2)Master故障,将Slave-01改为Master,Slave-02无法连接originalMaster3)如果Slave-02配置了“asynchronousconnectionfailoverDefined配置,与原来的Slave-01(新Master)建立复制关系:这个功能很好,第三方工具(如MHA的修复master)-slave关系)可以用mysql自带的函数代替。但是我测试后,有一些疑惑:1.“异步”复制故障转移不支持半同步架构吗?不能保证数据不丢失,或者不能完全替代MHA吗?答:其实是支持增强型半同步的。2.预先配置故障转移的master列表,如果机房A的结构发生变化,是否需要维护机房中的节点B房?答:是的。3、如果A机房是MGR,那么MGR的节点(master)异常,但是服务没有关闭,可以访问。机房的节点B不是一直在线吗?答:是的。随后,MySQL8.0.23发布,对该功能进行了增强:Slave可以支持MGR集群,可以动态识别MGR成员建立Master-Slave关系。最后绕一下:1)首先我们有一个3节点的MGR集群,版本8.0.22(异步连接故障转移,作用于Slave的IOThread,所以Slave是8.0.23版本)+----------------------------+------------+------------+------------+--------------------+|now(6)|member_host|member_state|member_role|VIEW_ID|+---------------------------+-------------+-------------+------------+------------------+|2021-01-2213:41:27.902251|mysql-01|在线|二级|16112906030396799:9||2021-01-2213:41:27.902251|mysql-02|在线|一级|16112906030396799:9||2021-01:22273.91mysql-03|在线|中学|16112906030396799:9|+----------------------------+------------+------------+------------+----------------------+2)然后在独立的Slave节点上,我们在Slave上指定"Masterconnectionfailoverlist"SELECTasynchronous_connection_failover_add_managed('ch1','GroupReplication','aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1','mysql-02',3306,'',80,60);简单解释一下参数:ch1:通道名GroupReplication:必选参数,目前支持MGR集群aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa1:MGR组名(参数group_replication_group_name)mysql-02:MGR成员之一80:主节点优先级(0-100),多个相同优先级的master会随机选择一个节点作为master60:第二个节点优先级(0-100),基本为Single模式做准备3)为Slave指定复制通道信息CHANGEREPLICATIONSOURCETOSOURCE_USER='rpl_user',SOURCE_PASSWORD='123456',SOURCE_HOST='mysql-02',SOURCE_PORT=3306,SOURCE_RETRY_COUNT=2,SOURCE_CONNECTION_AUTO_FAILOVER=1,CHOURCE_AUTO_FAILOVER=1,CHOURCE_AUTO_ANSIEL='4),检查“connectedtransferablelist”。如果未启用io线程,则不会自动识别MGR成员。并且复制用户rpl_user需要在MGR节点startsslave上有performance_schema的select权限;SELECT*FROMperformance_schema.replication_asynchronous_connection_failover;+------------+------------+-------+--------------------+--------+--------------------------------------+|CHANNEL_NAME|HOST|PORT|NETWORK_NAMESPACE|WEIGHT|MANAGED_NAME|+---------------+------------+------+--------------------+--------+---------------------------------------+|ch1|mysql-01|3306||60|aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1||ch1|mysql-02|3306||80|aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaa1||ch1|mysql-03|3306||60|aaaaaaaaaaaa-a-aaaaaaaaaaa1|+------------+---------+-----+-------------------+--------+-------------------------------------+5)然后我们将mysql-02停止group_replication(不关闭服务),Slave列表会自动淘汰mysql-02,重新与其他节点建立连接--mysql-02(Primary):stopgroup_replication;--Slave:SELECT*FROMperformance_schema.replication_asynchronous_connection_failover;+------------+----------+------+--------------------+--------+--------------------------------------+|CHANNEL_NAME|HOST|PORT|NETWORK_NAMESPACE|WEIGHT|MANAGED_NAME|+-------------+------------+------+-----------------+--------+------------------------------------+|ch1|mysql-01|3306||80|aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1||ch1|mysql-03|3306||60|aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaa1|+---------------+------------+------+----------------+--------+------------------------------------+showslavestatus\G****************************1.行**************************Slave_IO_State:WaitingformastertosendeventMaster_Host:mysql-01Master_User:rpl_userMaster_Port:3306Connect_Retry:60Master_Log_File:mybinlog.000003Read_Master_Log_Pos:4904Relay_Log_File:mysql-01-relay-bin-ch1.000065Relay_Log_Pos:439Relay_Master_Log_File:mybinlog.000003Slave_IO_Running:YesSlave_SQL_Running:Yes...至此,配置完成后,可以增加或减少MGR节点,Slave可以自动维护这个列表。没有发布其他用例。PS:如果想手动切换已建立的Slave的Master节点(Primary)连接到其他节点(Second),只需要删除“transferablelistofcopyconnections”,重新调整Second的优先级并添加回来了。--删除配置SELECTasynchronous_connection_failover_delete_managed('ch1','aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1');--重新添加,调整Second的优先级高于PrimarySELECTasynchronous_connection_failover_add_managed('ch1','GroupReplicationaa,'a
