集群有三个成员memberA、B、C成,其中memberB意外故障停掉了,然后memberA 执行stop group_replication退去集群.此时整个集群不可用了(不能更新数据)。
集群中唯一剩余的成员memberC上看到的成员状态为:
但是memberA看到的状态为:
查看最后的存活的memberC的错误日志发现:
"Plugin group_replication reported: 'This server is not able to reach a majority of members in the group. This server will now block all updates. The server will remain blocked until contact with the majority is restored. It is possible to use group_replication_force_members to force a new group membership.' "
大概意思是当前的服务没法获取到成员的投票数,当前服务将会阻塞所有的更新,直到能够获取到投票数。可以使用group_replication_force_members 来强制组成一个新的组。
开始认为这是MGR功能的一个bug,不过后来想想这样的设定也是合理的,因为如果是当前的服务成员自身网络或其他问题导致的无法与其他成员的通信成功,那么这样的情况下这种设定也是合理的,因为不能让它自动重新组成一个组,否则就会可能出现多个重复的组。对于为什么组成员A执行stop group_replication后,剩余的memberC的视图中memberA还是online状态,可能是因为memberB已经unreachable,所以memberC去请求是否同意memberA退去时没有得到结果,一直阻塞等待造成的。此时,memberA的退出结果应该是无法多数投票通过的,因此memberA的退出结果应该是失败的。查看memberA的error日志,结果确实如此:
解决的方法是memberC也执行stop group_replication停掉这个组,再重新组成一个新的组。
此时memberA再重新加入就成功了:
结果:
以此类推,当有多个server组成的group而有多数成员已经意外故障时,导致整个组的停止更新,目前想到的解决的方法就是停掉现在的组,重新组成新的组。
ps:
增加Group Replication System Variables中group_replication_member_expel_timeout的大小,可以避免网络问题或执行事务慢造成的错误驱逐。
MGR(组复制)两种运行模式
单主模式 下,组复制具有自动选主功能,每次只有一个
server成员接受更新。单写模式group内只有一台节点可写可读,其他节点只可以读。对于group的部署,需要先跑起primary节点(即那个可写可读的节点,read_only=0)然后再跑起其他的节点,并把这些节点一一加进group。其他的节点就会自动同步primary节点上面的变化,然后将自己设置为只读模式(read_only=1)。当primary节点意外宕机或者下线,在满足大多数节点存活的情况下,group内部发起选举,选出下一个可用的读节点,提升为primary节点。primary选举根据group内剩下存活节点的UUID按字典序升序来选择,即剩余存活的节点按UUID字典序排列,然后选择排在最前的节点作为新的primary节点。
多主模式 下, 所有的 server 成员都可以同时接受更新。group内的所有机器都是primary节点,同时可以进行读写 *** 作,并且数据是最终一致的。
相关参数 : group_replication_single_primary_mode
是否启动单主模式,如果启动,则本实例是主库,提供读写,其他实例仅提供读
多主模式切换单主模式
# 所有节点执行
mysql>stop group_replication
mysql>set global group_replication_enforce_update_everywhere_checks=OFF
mysql>set global group_replication_single_primary_mode=on
# 主节点(172.16.2.185)执行
set global group_replication_bootstrap_group=on
start GROUP_REPLICATION
set global group_replication_bootstrap_group=OFF
# 从节点(3307、3308)执行
start GROUP_REPLICATION
# 查看MGR组信息
mysql>select * from performance_schema.replication_group_members
单主切换到多主模式
MGR切换模式需要重新启动组复制,因些需要在所有节点上先关闭组复制,设置 group_replication_single_primary_mode=OFF 等参数,再启动组复制。
# 停止组复制(所有节点执行):
mysql>stop group_replication
mysql>set global group_replication_single_primary_mode=OFF
mysql>set global group_replication_enforce_update_everywhere_checks=ON
# 随便选择某个节点执行
mysql>SET GLOBAL group_replication_bootstrap_group=ON
mysql>START GROUP_REPLICATION
mysql>SET GLOBAL group_replication_bootstrap_group=OFF
# 其他节点执行
mysql>STARTGROUP_REPLICATION
msyql 5.7
# 查看MGR组信息
SELECT * FROM performance_schema.replication_group_members
查看读写权限
select @@read_only, @@super_read_only
show variables like 'read_only'
mysql 8.0
# 查看MGR组信息
mysql>SELECT * FROM performance_schema.replication_group_members
可以看到所有节点状态都是online,角色都是PRIMARY(mysql 8.0),MGR多主模式搭建成功。
验证:读写权限
写入数据测试:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)