MGR单主多主模式的核心关键点-MGR多主模式环境搭建

推荐看一下mysql官方对于组复制的说明,用chrome翻译下看吧

https://dev.mysql.com/doc/refman/5.7/en/group-replication.html

以下言论均是本人实际测试上百次的结果。

官方的单主模式是啥:比多主多一个选举程序,第一次引导开启集群的为主,后加入的为追随者(也可以叫从机Slave),只有住的有读写权限,别的追随者在加入组的时候自动把权限禁了。(我就是通过改的这点,实现我的目标的啧啧)如果主的挂了,其他服务器会根据UUID和一个值(类似权重)进行重新选主。每次选主都会重新把权限禁一遍。

官方的多主模式是啥:不是我想要的模式。所有服务器加入组时,读写权限全部放开,大家都可以读写,但是!!但是只能更改不同行的数据,如果后加入集群的服务器改了一行数据,那前面的服务器就不能再对这行数据进行改动了,如果改动则报事务回滚取消改动,而后加入的可以改前面加入集群改过的数据。

本人改后的类多主模式:用单主模式的配置,再在ONLINE时添加set global read_only=0。经过百次测试,没有别的地方有瑕疵,能满足我的需求。不过有一点:在RW事务提交之前,官方的多主模式有个投票机制,占多数成员投票的事务,才会COMMIT,这样可以对真正同时发生的事务进行判决,不过这种事情几率小,而且我感觉单主模式没有删除掉这个机制,毕竟大家都是MGR,可能通用的。感觉没问题。

本人的工作需求说明:所有加入集群的服务器都有自由读写的权限,大家地位完全相同。我想要的是满足有些客户,几万台客户端的服务器承载压力,而不致使服务器数据库挂掉。用的是lvs+keepalived+MGR的架构。这里只讲MGR,因为有好多东西和官方的不一样。注意:官方对于多主模式只提了2句废话,没有给出配置信息和其他。感觉mysql主打的就是单主模式。

最终我实现的结果是:1台服务器,不开启集群就行,配置可以用集群的配置,可以正常使用。

    2台服务器,还是用集群的配置,开启集群,可以当主备模式使用。

3台及以上服务器,还是同样的配置,开启集群后,把从机的权限放开。set global read_only=0。

配置文件1my.cnf如下:

[mysqld]

port  = 3306

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

tmp_table_size  = 256M

pid-file=/var/lib/mysql/mysql.pid

log-error=/var/log/mysqld.log

#log=/tmp/logs/mysqld.log

sql-mode=ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

symbolic-links=0

validate_password = off


# 集群配置

gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
#loose-group_replication_single_primary_mode=off
#loose-group_replication_enforce_update_everywhere_checks = on
loose-group_replication_bootstrap_group= off
server_id=1
report-host=192.168.50.20
loose-group_replication_local_address="192.168.50.20:24901"
loose-group_replication_group_seeds="192.168.50.20:24901,192.168.50.50:24901"
#auto_increment_increment=1
auto_increment_offset=9


配置文件2my.cnf如下:

[mysqld]

port            = 3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
tmp_table_size  = 256M

pid-file=/var/lib/mysql/mysql.pid
log-error=/var/log/mysqld.log
#log=/tmp/logs/mysqld.log
sql-mode=ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
symbolic-links=0
validate_password = off

# 集群配置
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
#loose-group_replication_single_primary_mode=off
#loose-group_replication_enforce_update_everywhere_checks = on
loose-group_replication_bootstrap_group= off
server_id=2
report-host=192.168.50.50
loose-group_replication_local_address="192.168.50.50:24901"
loose-group_replication_group_seeds="192.168.50.20:24901,192.168.50.50:24901"
#auto_increment_increment=1
auto_increment_offset=9

// auto_increment_offset=9是为了自增值保证每次递增1的配置。实测。

第一台启动方式:

mysql>  SET   GLOBAL  group_replication_bootstrap_group =  ON ;
START GROUP_REPLICATION;  
SELECT  *  FROM  performance_schema.replication_group_members; 

后加入的启动方式:
mysql>  set   global  group_replication_allow_local_disjoint_gtids_join= ON ;  
start group_replication;
set global read_only=0;

引导者开启集群,然后再进来的成员的数据从引导者即第一台同步过来,前提是大家的表结构要一致。数据发生改动就会进行投票,投票成功后就改动数据,改动的数据在binlog里记录着。MGR中,有定时的监测机制,定时的成员之间进行交流,如果发现有成员联系不上了,多尝试几次后,就T出去。
最后再把自动化脚本一写,MGR完事。
我实践了挺久,但官方的多主模式我还是感觉怪怪的,是我没配好才不能写同一行数据?如果有多主模式可以用的大手子,请留言告诉我一下。有怀疑有问题的也可以留言我。






评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值