MGR主從復(fù)制

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ù)制單主就可以了

2、單主故障處理

(1)非主數(shù)據(jù)庫掛掉
(2)主數(shù)據(jù)庫掛掉
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容