一、MySQL Group Replication
mysql官方基于组复制概念并充分参考MariaDBGalera Cluster和Percona XtraDB Cluster结合而来的新的高可用集群架构。只支持5.7以上版本
mgr 优点:
高一致性,基于原生复制及paxos协议的组复制技术.
高容错性,有自动检测机制,当出现宕机后,会自动剔除问题节点,其他节点可以正常使用(类似zk集群),当不同节点产生资源争用冲突时,会按照先到先得处理,并且内置了自动化脑裂防护机制.
高扩展性,可随时在线新增和移除节点,会自动同步所有节点上状态,直到新节点和其他节点保持一致,自动维护新的组信息.
高灵活性,直接插件形式安装(5.7.17后自带.so插件),有单主模式和多主模式,单主模式下,只有主库可以读写,其他从库会加上super_read_only状态,只能读取不可写入,出现故障会自动选主.
缺点:目前不太稳定,太新有BUG(如新加入集群宕机,并行复制有不一致bug)、管理不方便(需配合mysql-shell)
注意:多主模式下最好有三台以上的节点,单主模式则视实际情况而定,不过同个Group最多节点数为9.
服务器配置尽量保持一致,因为和PXC一样,也会有"木桶短板效应".
需要特别注意,mysql数据库的服务端口号和MGR的服务端口不是一回事,需要区分开来.
二、MGR搭建
1、配置三个docker容器,配置之前需要配置一个network方便容器间互相连接
dockernetworkcreate mysql_group
2、运行容器指令
master:
dockerrun --name master -v /Users/drmac/mysql/master:/var/lib/mysql -v /Users/drmac/mysql/master.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 --network mysql_group--network-alias master-d mysql
slave-1:
docker run --name slave-1 -v /Users/drmac/mysql/slave-1:/var/lib/mysql -v /Users/drmac/mysql/slave-1.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 --network mysql_group --network-alias slave-1-d mysql
slave-2:
dockerrun --name slave-2 -v /Users/drmac/mysql/slave-2:/var/lib/mysql -v /Users/drmac/mysql/slave-2.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 --network mysql_group --network-alias slave-2-d mysql
启动三个容器,数据文件和配置文件分别挂载到本地磁盘,方便配置管理
3.my.cnf配置
master:
[mysqld]
# 开启GTID,必须开启
gtid_mode=on
# 强制GTID的一致性
enforce-gtid-consistency=on
# binlog格式,MGR要求必须是ROW
binlog_format=row
# server-id必须是唯一的
server-id=1
# MGR使用乐观锁,所以官网建议隔离级别是RC,减少锁粒度
transaction_isolation=READ-COMMITTED
# 因为集群会在故障恢复时互相检查binlog的数据,
# 所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.
log-slave-updates=1
# binlog校验规则,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE
binlog_checksum=NONE
# 基于安全的考虑,MGR集群要求复制模式要改成slave记录记录到表中,不然就报错
master_info_repository=TABLE
# 同上配套
relay_log_info_repository=TABLE
# 记录事务的算法,官网建议设置该参数使用 XXHASH64 算法
transaction_write_set_extraction = XXHASH64
# 相当于此GROUP的名字,是UUID值,不能和集群内其他GTID值的UUID混用,可用uuidgen来生成一个新的,
# 主要是用来区分整个内网里边的各个不同的GROUP,而且也是这个group内的GTID值的UUID
loose-group_replication_group_name = 'cc5e2627-2285-451f-86e6-0be21581539f'
#是否随服务器启动而自动启动组复制,不建议直接启动,怕故障恢复时有扰乱数据准确性的特殊情况
loose-group_replication_start_on_boot = OFF
loose-group_replication_local_address = 'master:33066'
loose-group_replication_group_seeds = 'master:33066,salve-1:33066,slave-2:33066'
# 开启引导模式,添加组成员,用于第一次搭建MGR或重建MGR的时候使用,只需要在集群内的其中一台开启,
loose-group_replication_bootstrap_group = OFF
# 是否启动单主模式,如果启动,则本实例是主库,提供读写,其他实例仅提供读,如果为off就是多主模式了
#loose-group_replication_single_primary_mode = off
# 多主模式下,强制检查每一个实例是否允许该操作,如果不是多主,可以关闭
#loose-group