一. 什么是MGR
MGR(MySQL Group Replication)是MySQL官方在MySQL 5.7.17版本中以插件形式推出的主從復(fù)制高可用技術(shù)稽物,它基于原生的主從復(fù)制核蘸,將各節(jié)點歸入到一個組中寿酌,通過組內(nèi)節(jié)點的通信協(xié)商(組通信協(xié)議基于Paxos算法)磕道,實現(xiàn)數(shù)據(jù)的強(qiáng)一致性胯甩,具有彈性復(fù)制迹辐、高可用枪孩、主從替換憔晒、自動加組等等功能。
1.1 MySQL組復(fù)制協(xié)議
這3個節(jié)點互相通信蔑舞,每當(dāng)有讀寫事件發(fā)生拒担,都會向其他節(jié)點廣播該事件,經(jīng)過沖突檢測后寫入到binglog日志然后提交攻询。
- receiver的作用類似于io線程从撼,用于接收組內(nèi)個節(jié)點之間傳播的消息和事務(wù)。也用于接收外界新發(fā)起的事務(wù)钧栖。
- applier的作用類似于sql線程低零,用于應(yīng)用relay log中的記錄。不過拯杠,組復(fù)制的relay log不再是relay log掏婶,而是這里的組復(fù)制relay log:
relay-log-group_replication_applier.00000N
。 - certifier的作用在receiver接收到消息后潭陪,驗證是否有并發(fā)事務(wù)存在沖突問題雄妥。沖突檢測通過后,這條消息就會寫入到組復(fù)制的relay log中依溯,等待applier去應(yīng)用老厌。
這些節(jié)點可以是單主模型的(single-primary),也可以是多主模型的(multi-primary)黎炉。單主模型只有一個主節(jié)點可以接受寫操作枝秤,主節(jié)點故障時可以自動選舉主節(jié)點淀弹。多主模型下所有節(jié)點都可以接受寫操作洪添,所以沒有master-slave的概念。
1.2 組復(fù)制模式
MySQL的組復(fù)制可以配置為單主模型和多主模型兩種工作模式雀费,它們都能保證MySQL的高可用干奢。以下是兩種工作模式的特性簡介:
- 單主模型:從復(fù)制組中眾多個MySQL節(jié)點中自動選舉一個master節(jié)點盏袄,只有master節(jié)點可以寫薄啥,其他節(jié)點自動設(shè)置為read only。當(dāng)master節(jié)點故障時逛尚,會自動選舉一個新的master節(jié)點垄惧,選舉成功后,它將設(shè)置為可寫绰寞,其他slave將指向這個新的master。
- 多主模型:復(fù)制組中的任何一個節(jié)點都可以寫滤钱,因此沒有master和slave的概念,只要突然故障的節(jié)點數(shù)量不太多铜靶,這個多主模型就能繼續(xù)可用。
雖然多主模型的特性很誘人争剿,但缺點是要配置和維護(hù)這種模式痊末,必須要深入理解組復(fù)制的理論,更重要的是捆蜀,多主模型限制較多幔嫂,其一致性辆它、安全性還需要多做測試履恩。
二. 配置單主模式的組復(fù)制
2.1 實驗環(huán)境
實驗前請在hosts文件中設(shè)置好解析,或者局域網(wǎng)內(nèi)搭建DNS服務(wù)器(推薦docker搭建dnsmasq)飒筑。當(dāng)然也可以不設(shè)置解析,直接在my.cnf文件中使用IP地址即可协屡。
系統(tǒng) | 默認(rèn)角色 | 主機(jī)名 | IP | MySQL版本 |
---|---|---|---|---|
CentOS 7 | Master | d1.mgr.com | 172.16.10.59 | mysql 8.0.19 |
CentOS 7 | Node1 | d2.mgr.com | 172.16.10.58 | mysql 8.0.19 |
CentOS 7 | Node2 | d3.mgr.com | 172.16.10.57 | mysql 8.0.19 |
2.2 配置第一個節(jié)點d1.mgr.com
2.2.1 創(chuàng)建復(fù)制用戶
連接donor(加組連接對象全谤,由種子節(jié)點提供)的通道憑據(jù)(channel credentials)
mysql> create user repl@'%' identified by 'P@ssword1!';
mysql> grant replication slave on *.* to repl@'%';
2.2.2 修改配置文件
vim /etc/my.cnf
server-id=10 # 必須
gtid_mode=ON # 必須,開啟GTID模式
enforce_gtid_consistency=ON # 必須补憾,不允許事務(wù)違背GTID的一致性
binlog_format=ROW # 必須,以行方式記錄
binlog_checksum=NONE # 必須盈匾,關(guān)閉事件校驗
master_info_repository=TABLE # 必須腾务,記錄加入master服務(wù)器信息到mysql.slave_master_info
relay_log_info_repository=TABLE # 必須,記錄節(jié)點中繼日志的位置到mysql.slave_relay_log_info
log_slave_updates=ON # 必須削饵,更新節(jié)點中繼日志
sync_binlog=1 # 建議岩瘦,事務(wù)同步到binlog日志
group_replication_recovery_get_public_key=ON # 授權(quán)使用caching_sha2_password插件時啟用,8.0版本默認(rèn)使用此插件
transaction_write_set_extraction=XXHASH64 # 必須葵孤,事務(wù)寫入算法
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #必須担钮,或使用uuidgen命令生成
loose-group_replication_start_on_boot=OFF # 建議,關(guān)閉啟動自開啟復(fù)制
loose-group_replication_local_address="d1.mgr.com:20001" # 必須箫津,組復(fù)制本機(jī)地址及端口
loose-group_replication_group_seeds="d1.mgr.com:20001,d2.mgr.com:20002,d3.mgr.com:20003" # 必須宰啦,組復(fù)制種子地址及端口
loose-group_replication_ip_whitelist="172.16.10.0/24" #建議,加組白名單
重啟服務(wù)
systemctl restart mysqld
重啟服務(wù)后生成通道的relay log文件赡模,group_replication_recovery
通道的relay log用于新節(jié)點加入組時,當(dāng)新節(jié)點聯(lián)系上donor后教硫,會從donor處以異步復(fù)制的方式將其binlog復(fù)制到這個通道的relay log中辆布,新節(jié)點將從這個recovery通道的relay log中恢復(fù)數(shù)據(jù)。
2.2.3 配置加組通道
mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';
2.2.4 安裝插件并啟用組復(fù)制
mysql> install plugin group_replication soname 'group_replication.so';
mysql> reset master;
mysql> reset slave;
mysql> set @@global.group_replication_bootstrap_group=ON;
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=OFF;
reset master
清空binlog.index
索引日志并新建binlog.000001
reset slave
清空relay-bin-group_replication_applier.index
索引日志并新建relay-bin-group_replication_applier.000001
reset master
和reset slave
通常用于第一次創(chuàng)建或加入數(shù)據(jù)庫集群時使用景用。
是為了避免下次重啟組復(fù)制插件功能時再次引導(dǎo)創(chuàng)建一個組惭蹂,group_replication_bootstrap_group
變量臨時啟用。當(dāng)啟動組復(fù)制功能后盾碗,將生成通道的binlog
和group_replication_applier
(類似中繼日志)相關(guān)文件。
2.2.5 查看組復(fù)制成員情況
mysql> select * from performance_schema.replication_group_members;
2.3 配置第二個節(jié)點d2.mgr.com
在新節(jié)點加入組之前耗美,應(yīng)該先通過備份恢復(fù)的方式,從組中某節(jié)點上備份目前的數(shù)據(jù)到新節(jié)點上幽歼,然后再讓新節(jié)點去加組谬盐,這樣加組的過程將非常快皇型,且能保證不會因為purge的原因而加組失敗。
2.3.1 創(chuàng)建復(fù)制用戶
連接donor(加組連接對象弃鸦,由種子節(jié)點提供)的通道憑據(jù)(channel credentials)
mysql> create user repl@'%' identified by 'P@ssword1!';
mysql> grant replication slave on *.* to repl@'%';
2.3.2 修改配置文件
vim /etc/my.cnf
#### Group Replication d2.mgr.com ####
server-id=20
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_format=ROW
binlog_checksum=NONE
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
sync_binlog=1
group_replication_recovery_get_public_key=ON
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="d2.mgr.com:20002"
loose-group_replication_group_seeds="d1.mgr.com:20001,d2.mgr.com:20002,d3.mgr.com:20003"
loose-group_replication_ip_whitelist="172.16.10.0/24"
重啟服務(wù)
systemctl restart mysqld
2.3.3 配置加組通道
mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';
2.3.4 安裝插件并加入到復(fù)制組
mysql> install plugin group_replication soname 'group_replication.so';
mysql> reset master;
mysql> reset slave;
mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';
mysql> start group_replication;
2.3.5 查看組復(fù)制成員情況
mysql> select * from performance_schema.replication_group_members;
2.4 添加第三個節(jié)點d3.mgr.com
2.4.1 創(chuàng)建復(fù)制用戶
連接donor(加組連接對象唬格,由種子節(jié)點提供)的通道憑據(jù)(channel credentials)
mysql> create user repl@'%' identified by 'P@ssword1!';
mysql> grant replication slave on *.* to repl@'%';
2.4.2 修改配置文件
#### Group Replication d3.mgr.com ####
server-id=30
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_format=ROW
binlog_checksum=NONE
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
sync_binlog=1
group_replication_recovery_get_public_key=ON
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="d3.mgr.com:20003"
loose-group_replication_group_seeds="d1.mgr.com:20001,d2.mgr.com:20002,d3.mgr.com:20003"
loose-group_replication_ip_whitelist="172.16.10.0/24"
重啟服務(wù)
systemctl restart mysqld
2.4.3 配置加組通道
mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';
2.4.4 安裝插件并加入到復(fù)制組
mysql> install plugin group_replication soname 'group_replication.so';
mysql> reset master;
mysql> reset slave;
mysql> change master to master_user='repl',master_password='P@ssword1!' for channel 'group_replication_recovery';
mysql> start group_replication;
2.4.5 查看組復(fù)制成員情況
mysql> select * from performance_schema.replication_group_members;
三. 參考
【1】MySQL高可用之組復(fù)制技術(shù)(2):配置單主模型的組復(fù)制