MGR主从复制

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; 

如图所示便是安装成功


1647960426(1).png

单主模式

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;
1647960997(1).png

查询数据读写

 show variables like '%read_on%';

mysql1


1647961213(1).png

mysql2和mysql3

1647961264(1).png

到这里MGR主从复制单主就可以了

2、单主故障处理

(1)非主数据库挂掉
(2)主数据库挂掉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容