前言
环境 :
CentOS
7.7 丶Docker
19.03.4丶MySQL
8.0.16本教程仅用于对
MySQL
的组复制搭建教程示例,其余搭建方式不在本文讨论范围内,文中提及相关知识参考自MySQL
官方文档 :MySQL组复制
个人建议使用
MySQL
版本为8.0.16
前期准备
-
服务器准备
文中采用两台
CentOS 7.7
进行测试节点 IP master-one 192.168.107.185 master-two 192.168.107.109 -
hosts
映射## 添加hosts 映射,每个MySQL节点都需要修改hosts文件 vim /etc/hosts 192.168.107.185 master-one master-one 192.168.107.109 master-two msater-two
-
多节点部署
在两个服务器主机分别部署
MySQL
,本文仅用于说明主从搭建示例,对MySQL
部署在此不过多阐述,详情请参考 :
单主模式
-
配置修改
[mysqld] # 修改三个节点 my.cnf 配置文件 # 修改默认密码验证插件 default_authentication_plugin=mysql_native_password # 禁用其他引擎,对于组复制,数据必须存储在InnoDB事务存储引擎中 disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" # 配置复制 server_id=38 # 组内唯一ID,不可重复,一般配置为IP的后几位 gtid_mode=ON # 开启gtid模式,通过全局事务标识记录DDL及DML enforce_gtid_consistency=ON # binlog_checksum=NONE # 禁用二进制日志时间校验和 # 若MySQL版本在 8.0.3之前需增加如下配置 # log_bin=binlog # 开启二进制日志 # log_slave_updates=ON # 开启存储从主库接收来的二进制日志 # binlog_format=ROW # 设置二进制日志格式为row # master_info_repository=TABLE # 复制元数据存入系统表 # relay_log_info_repository=TABLE # 复制元数据存入系统表 # 组复制配置 # 若MySQL版本在8.0.2 之前需要加入此项,对于每个事务,它必须收集写集,并使用XXHASH64哈希算法将其编码为哈希 # transaction_write_set_extraction=XXHASH64 # 将组复制插件添加到服务器在启动时加载的插件列表中 plugin_load_add='group_replication.so' # 告诉插件将其加入或创建的组命名为 group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 设置为on时,会在服务器启动时自动启动组复制 group_replication_start_on_boot=off # 设置成员用于与组中其他成员进行内部通信的网络地址和端口 group_replication_local_address= "master-one:33061" # 设置组成员的主机名和端口 group_replication_group_seeds= "master-one:33061,master-two:33061" # 是否为Group Replication的引导节点,集群中第一个节点需要设置为ON来启动Group Replication,如果不在配置文件中配置可在后面动态配置 group_replication_bootstrap_group=off # 一般配置为本机地址,如果不做映射那么要配置这个 # report_host = 172.16.146.38 # report_port=33061
多节点配置,若无特殊需求,仅根据实际情况修改如下三项即可
# 保证每个节点唯一,不可重复 server_id = 203 # 根据节点具体IP修改 loose-group_replication_local_address = 'master-one:33061' # 若修改了hosts文件进行IP映射配置,则不需修改此项 # report_host = 172.16.146.38
-
重启容器
# 重启MySQL docker restart [容器ID]
-
创建用户(
每个节点执行
)#进入MySQL容器 docker exec -it [容器ID] /bin/bash # 连接MySQL mysql -uroot -ppassword # 关闭二进制日志文件记录 SET SQL_LOG_BIN=0; # 创建用户 CREATE USER slave@'%' IDENTIFIED BY 'password'; # mysql 8.0 需修改密码使用插件 ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; # 授权用于复制 GRANT REPLICATION SLAVE ON *.* TO slave@'%'; GRANT BACKUP_ADMIN ON *.* TO slave@'%'; # 刷新权限 FLUSH PRIVILEGES; # 开启二进制日志文件记录 SET SQL_LOG_BIN=1; # 设置使用组复制的用户,配置状态转移 CHANGE MASTER TO MASTER_USER='slave', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
-
开启组复制
------------------配置主节点------------------ # 查看已安装插件 SHOW PLUGINS; # 若未安装group_replication插件,手动安装 INSTALL PLUGIN group_replication SONAME 'group_replication.so'; # 开启插件自动引用组功能 SET GLOBAL group_replication_bootstrap_group=ON; # 开启组复制 START GROUP_REPLICATION; # 关闭插件自动引用组功能 SET GLOBAL group_replication_bootstrap_group=OFF; ------------------配置从节点------------------ # 开启组复制 START GROUP_REPLICATION; -------------------状态查看------------------- # 查看主节点 SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members; # 查看组状态 SELECT * FROM performance_schema.replication_group_members; # 查看组统计信息 SELECT * FROM performance_schema.replication_group_member_stats\G;
多主模式(MySQL 8.0.16
之后 )
-
配置多主模式
# 停止组复制(所有节点执行): mysql> STOP GROUP_REPLICATION; mysql> RESET MASTER; 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> START GROUP_REPLICATION; # 查看组信息,所有节点的 MEMBER_ROLE 都为 PRIMARY SELECT * FROM performance_schema.replication_group_members;