1、MGR主从复制
什么是MGR,或者对MGR不了解可以自己了解下。或者看这里:https://www.51cto.com/article/615706.html?mobile, 这些文章大多差距不大。
2、Docker部署3台MySQL服务
这次环境还是通过Docker部署,讲道理学习这些集群环境docker真的太好用的。直接复制下面的docker-compose.yml文件。docker-compose up启动即可
version: '3.6'
services:
mysql1:
image: mysql:8.0.25
restart: always
container_name: mysql1
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
command:
--default-authentication-plugin=mysql_native_password
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
ports:
- 3320:3306
mysql2:
image: mysql:8.0.25
restart: always
container_name: mysql2
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
command:
--default-authentication-plugin=mysql_native_password
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
ports:
- 3321:3306
mysql3:
image: mysql:8.0.25
restart: always
container_name: mysql3
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
command:
--default-authentication-plugin=mysql_native_password
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
ports:
- 3322:3306
#Are you trying to mount a directory onto a file or vice-versa
#docker 挂载只能挂载目录,不能挂载文件,如果挂载的是文件,则docker会把他当成一个目录,对于挂载的文件需要先创建
#mysql8默认加密方式cahing_sha2_password,旧版navicate不支持,可以使用mysql5.7的加密方式mysql_native_password
#也可以在mysql中执行
#ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; #修改加密规则
#ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #更新一下用户的密码
#FLUSH PRIVILEGES; #刷新权限 。%表示远程连接
3、配置3台MySQL的配置文件
进入MySQL容器
docker exec -it mysql1 bash
docker exec -it mysql2 bash
docker exec -it mysql3 bash
- mysql1配置
cat >> /etc/mysql/my.cnf << EOF
server_id=1
gtid_mode=on
enforce_gtid_consistency=ON
binlog_checksum=NONE
transaction_write_set_extraction=XXHASH64
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="mysql1:24901"
loose-group_replication_group_seeds="mysql1:24901,mysql2:24901,mysql3:24901"
loose-group_replication_bootstrap_group=OFF
EOF
- mysql2配置
cat >> /etc/mysql/my.cnf << EOF
server_id=2
gtid_mode=on
enforce_gtid_consistency=ON
binlog_checksum=NONE
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="mysql2:24901"
loose-group_replication_group_seeds="mysql1:24901,mysql2:24901,mysql3:24901"
loose-group_replication_bootstrap_group=OFF
EOF
- mysql3配置
cat >> /etc/mysql/my.cnf << EOF
server_id=3
gtid_mode=on
enforce_gtid_consistency=ON
binlog_checksum=NONE
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="mysql3:24901"
loose-group_replication_group_seeds="mysql1:24901,mysql2:24901,mysql3:24901"
loose-group_replication_bootstrap_group=OFF
EOF
配置完成后重启3台mysql
docker restart mysql1 mysql2 mysql3
配置说明:
#使用mysql_native_password密码策略,防止navicat连不上mysql8
default_authentication_plugin=mysql_native_password
#设置MySQL插件所在目录,因为MGR基于插件,所以必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
#服务器编号,Master=1
server_id=1
#开启binlog的GTID模式
gtid_mode=ON
#开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
#关闭binlog校验
binlog_checksum=NONE
#定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
#确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
loose‐group_replication_recovery_use_ssl=ON
#该服务器的实例所在复制组的名称,必须是有效的 UUID,所有节点必须相同。
loose‐group_replication_group_name="bbbbbbbb‐bbbb‐cccc‐dddd‐eeeeeeeeeeee"
#确定服务器是否应该在服务器启动期间启动组复制。
loose‐group_replication_start_on_boot=OFF
#大坑2:
#为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
#很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
#所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose‐group_replication_local_address="n0:24901"
#这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose‐group_replication_recovery_get_public_key=ON
#用于建立新成员到组的连接组成员列表。
#这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
#同样采用n0~n2的主机名替代
loose‐group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
#配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
#并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose‐group_replication_bootstrap_group=OFF
创建数据库的复制账号(3台都要执行)
#创建rpl_user账户,此账户用于实现主从数据同步
CREATE USER repl@'%' IDENTIFIED BY 'repl';
#赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
#让刚才的修改生效
FLUSH PRIVILEGES;
#删除已产生的Binlog
#一定要RESET MASTER,它会删除刚才已产生的Binlog
#因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
#这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVING"状态
#利用RESET MASTER删除这些无法执行的binlog,就没问题了
安装MySQL复制组(3台都要执行)
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'group_replication' \G;
如图所示便是安装成功
单主模式
set global groupreplicationsingleprimarymode =ON
指定mysql1为主节点
mysql> set global group_replication_single_primary_mode=on;
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
#指定主从账户与指定通信频道
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
#开启组网数据同步
mysql> start group_replication;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql2和mysql3配置
mysql> set global group_replication_single_primary_mode=on;
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
mysql> start group_replication;
查询组复制成员(3台服务服务查询结果相同)
select * from performance_schema.replication_group_members;
查询数据读写
show variables like '%read_on%';
mysql1
mysql2和mysql3
到这里MGR主从复制单主就可以了