MySQL組復(fù)制

一. 什么是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 masterreset slave 通常用于第一次創(chuàng)建或加入數(shù)據(jù)庫集群時使用景用。

是為了避免下次重啟組復(fù)制插件功能時再次引導(dǎo)創(chuàng)建一個組惭蹂,group_replication_bootstrap_group變量臨時啟用。當(dāng)啟動組復(fù)制功能后盾碗,將生成通道的binloggroup_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ù)制

【2】Chapter 18 Group Replication

【3】MySQL 8.0.13 Group Replication Recovery Error MY-002061

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末购岗,一起剝皮案震驚了整個濱河市门粪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乾吻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绎签,死亡現(xiàn)場離奇詭異瞭郑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)屈张,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門阁谆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人场绿,你說我怎么就攤上這事。” “怎么了咒林?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵爷光,是天一觀的道長。 經(jīng)常有香客問我蛀序,道長,這世上最難降的妖魔是什么遣鼓? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任重贺,我火速辦了婚禮,結(jié)果婚禮上气笙,老公的妹妹穿的比我還像新娘。我一直安慰自己抒巢,他們只是感情好秉犹,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崇堵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狰贯。 梳的紋絲不亂的頭發(fā)上赏廓,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音幔摸,去河邊找鬼。 笑死驱负,一個胖子當(dāng)著我的面吹牛嗦玖,可吹牛的內(nèi)容都是我干的跃脊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捞稿,長吁一口氣:“原來是場噩夢啊……” “哼拼缝!你這毒婦竟也來了彰亥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤任斋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘟檩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澈蟆,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年睹簇,在試婚紗的時候發(fā)現(xiàn)自己被綠了寥闪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片太惠。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡凿渊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埃脏,到底是詐尸還是另有隱情秋忙,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布翰绊,位于F島的核電站旁壮,受9級特大地震影響谐檀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桐猬,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望免胃。 院中可真熱鬧惫撰,春花似錦羔沙、人聲如沸厨钻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诱建。三九已至,卻和暖如春俺猿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辜荠。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留造烁,地道東北人午笛。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像药磺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子癌佩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 環(huán)境 : CentOS 7.7 丶Docker 19.03.4丶MySQL 8.0.16本教程僅用于對MyS...
    x0e閱讀 1,106評論 0 1
  • 1 安裝mysql5.72 配置hosts映射cat /etc/hosts172.19.84.44 mgr1...
    羽霖z閱讀 1,108評論 0 0
  • 風(fēng)起于青萍之末我碟,止于草莽之間。人生短短不過數(shù)十寒暑矫俺。就像這風(fēng)說起就起。說止則止厘托。人生雖短卻不乏精彩。俗話說的好啊:...
    冷月霜天閱讀 548評論 6 34
  • 剛?cè)氚鄷r的模樣還在眼前 你押赊、你、還有你 花兒般,扎著辮的策精,短發(fā)的 愛說話的,嘰嘰喳喳像是精靈 沉默寡言的咽袜,靜靜坐著...
    荷塘戀雨閱讀 322評論 0 5
  • 《稻盛哲學(xué)學(xué)習(xí)會》打卡第132天 姓名:嚴(yán)娜 部門:分水碶 組別:待定 【知~學(xué)習(xí)】 誦讀《京瓷哲學(xué)》 6 思考人...
    NinaYanWellin閱讀 513評論 0 0