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)主数据库挂掉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容