推荐看一下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的配置。实测。
第一台启动方式: