1、MGR主從復(fù)制
什么是MGR,或者對MGR不了解可以自己了解下。或者看這里:https://www.51cto.com/article/615706.html?mobile, 這些文章大多差距不大。
2、Docker部署3臺MySQL服務(wù)
這次環(huán)境還是通過Docker部署,講道理學(xué)習(xí)這些集群環(huán)境docker真的太好用的。直接復(fù)制下面的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會把他當(dāng)成一個目錄,對于掛載的文件需要先創(chuàng)建
#mysql8默認(rèn)加密方式cahing_sha2_password,舊版navicate不支持,可以使用mysql5.7的加密方式mysql_native_password
#也可以在mysql中執(zhí)行
#ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; #修改加密規(guī)則
#ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #更新一下用戶的密碼
#FLUSH PRIVILEGES; #刷新權(quán)限 。%表示遠(yuǎn)程連接
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
#設(shè)置MySQL插件所在目錄,因為MGR基于插件,所以必須設(shè)置插件路徑
plugin_dir=/usr/lib64/mysql/plugin
#服務(wù)器編號,Master=1
server_id=1
#開啟binlog的GTID模式
gtid_mode=ON
#開啟后MySQL只允許能夠保障事務(wù)安全,并且能夠被日志記錄的SQL語句被執(zhí)行
enforce_gtid_consistency=ON
#關(guān)閉binlog校驗
binlog_checksum=NONE
#定義用于事務(wù)期間哈希寫入提取的算法,組復(fù)制模式下必須設(shè)置為 XXHASH64。
transaction_write_set_extraction=XXHASH64
#確定組復(fù)制恢復(fù)時是否應(yīng)該應(yīng)用 SSL,通常設(shè)置為“開”,但默認(rèn)設(shè)置為“關(guān)”。
loose‐group_replication_recovery_use_ssl=ON
#該服務(wù)器的實例所在復(fù)制組的名稱,必須是有效的 UUID,所有節(jié)點必須相同。
loose‐group_replication_group_name="bbbbbbbb‐bbbb‐cccc‐dddd‐eeeeeeeeeeee"
#確定服務(wù)器是否應(yīng)該在服務(wù)器啟動期間啟動組復(fù)制。
loose‐group_replication_start_on_boot=OFF
#大坑2:
#為復(fù)制組中其他的成員提供的網(wǎng)絡(luò)地址,指定為“主機:端口”的格式化字符串。
#很多人想當(dāng)然認(rèn)為端口應(yīng)該是3306,起始不然,MGR需要開啟新端口24901同步交換
#所以這里不要寫錯,同時,前面我們配置了hosts文件做了主機名與IP的映射,這里直接寫主機名即可
loose‐group_replication_local_address="n0:24901"
#這個參數(shù)決定primary節(jié)點到secondary節(jié)點的請求是否為基于 RSA 密鑰對的密碼交換所需的公鑰
loose‐group_replication_recovery_get_public_key=ON
#用于建立新成員到組的連接組成員列表。
#這個列表指定為由分隔號間隔的組成員網(wǎng)絡(luò)地址列表,類似 host1:port1、host2:port2 的格式。
#同樣采用n0~n2的主機名替代
loose‐group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
#配置此服務(wù)器為引導(dǎo)組,這個選項必須僅在一臺服務(wù)器上設(shè)置,
#并且僅當(dāng)?shù)谝淮螁咏M或者重新啟動整個組時。成功引導(dǎo)組啟動后,將此選項設(shè)置為關(guān)閉。
loose‐group_replication_bootstrap_group=OFF
創(chuàng)建數(shù)據(jù)庫的復(fù)制賬號(3臺都要執(zhí)行)
#創(chuàng)建rpl_user賬戶,此賬戶用于實現(xiàn)主從數(shù)據(jù)同步
CREATE USER repl@'%' IDENTIFIED BY 'repl';
#賦予主從同步權(quán)限
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
#讓剛才的修改生效
FLUSH PRIVILEGES;
#刪除已產(chǎn)生的Binlog
#一定要RESET MASTER,它會刪除剛才已產(chǎn)生的Binlog
#因為剛才Binglog包含創(chuàng)建用戶這種高權(quán)限操作,用于主從同步的rpl_user賬戶是沒有權(quán)限執(zhí)行的
#這就會導(dǎo)致RelayLog重放無法正確執(zhí)行,導(dǎo)致從屬服務(wù)器卡死在"RECEVING"狀態(tài)
#利用RESET MASTER刪除這些無法執(zhí)行的binlog,就沒問題了
安裝MySQL復(fù)制組(3臺都要執(zhí)行)
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為主節(jié)點
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';
#開啟組網(wǎng)數(shù)據(jù)同步
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;
查詢組復(fù)制成員(3臺服務(wù)服務(wù)查詢結(jié)果相同)
select * from performance_schema.replication_group_members;

1647960997(1).png
查詢數(shù)據(jù)讀寫
show variables like '%read_on%';
mysql1

1647961213(1).png
mysql2和mysql3

1647961264(1).png
到這里MGR主從復(fù)制單主就可以了