老司機(jī)帶你在MySQL領(lǐng)域“大吉大利,晚上吃雞”
最近絕地求生這個(gè)游戲太火了,當(dāng)我問(wèn)我的朋友們你們閑時(shí)在干嘛,基本上告訴我的答案都是在"吃雞"?。∠氡睾芏嗬翔F們也玩,那一定應(yīng)該知道絕地求生中有把槍叫AWM。此槍傷害裸132點(diǎn),爆頭330,即使三級(jí)頭爆頭必死,無(wú)防彈衣或者防彈衣有破損,一槍死。是這個(gè)游戲中威力最大的狙擊×××,足足是98K的兩倍。
那么在MySQL領(lǐng)域有沒(méi)有這么一把威力超大的“槍”呢~答案是必須有?。〉蠌埾葐?wèn)你們一個(gè)問(wèn)題。
請(qǐng)問(wèn)你搭建MySQL復(fù)制的時(shí)候,還在執(zhí)行備份恢復(fù),在從庫(kù)進(jìn)行change master to的操作嘛?如果是那你可就真的落后了。
本章介紹MySQL官方推薦的一款高可用集群方案MySQL Group Replication。簡(jiǎn)稱(chēng):MGR(組復(fù)制)。它是官方推出的一種基于Paxos協(xié)議的狀態(tài)機(jī)復(fù)制,徹底解決了基于傳統(tǒng)的異步復(fù)制和半同步復(fù)制中數(shù)據(jù)一致性問(wèn)題無(wú)法保證的情況。也讓MySQL數(shù)據(jù)庫(kù)涉及的領(lǐng)域更廣,徹底擁有了打開(kāi)互聯(lián)網(wǎng)金融行業(yè)的大門(mén)。2016年12月 MySQL Group Replication推出了第一個(gè)GA版本發(fā)布在MySQL5.7.17中。但目前直接投入到生產(chǎn)環(huán)境中使用,風(fēng)險(xiǎn)還是比較大。建議等其越來(lái)越成熟之后,我們?cè)僬嬲度胧褂谩?/p>
隨著MySQL8.0版本即將與我們見(jiàn)面,再配合官方逐漸成熟的高可用集群 Group Replication方案,到那時(shí)再看看誰(shuí)還是我們MySQL的對(duì)手,全都不在了!MySQL數(shù)據(jù)庫(kù)就是作者的信仰,愛(ài)你無(wú)怨無(wú)悔。
MGR組復(fù)制原理
先來(lái)談?wù)勈裁唇凶鼋M復(fù)制。組復(fù)制是一種可用于實(shí)現(xiàn)容錯(cuò)系統(tǒng)的技術(shù)。復(fù)制組是一個(gè)通過(guò)消息傳遞相互交互的server集群。復(fù)制組由多個(gè)server成員組成,如下圖的master1,master2,master3,所有成員獨(dú)立完成各自的事務(wù)。當(dāng)客戶(hù)端先發(fā)起一個(gè)更新事務(wù),該事務(wù)先在本地執(zhí)行,執(zhí)行完成之后就要發(fā)起對(duì)事務(wù)的提交操作了。在還沒(méi)有真正提交之前需要將產(chǎn)生的復(fù)制寫(xiě)集廣播出去,復(fù)制到其他成員。如果沖突檢測(cè)成功,組內(nèi)決定該事務(wù)可以提交,其他成員可以應(yīng)用,否則就回滾。最終,這意味著所有組內(nèi)成員以相同的順序接收同一組事務(wù)。因此組內(nèi)成員以相同的順序應(yīng)用相同的修改,保證組內(nèi)數(shù)據(jù)強(qiáng)一致性。
MGR組復(fù)制模式
組復(fù)制可以在兩種模式下運(yùn)行。 在單主模式下,組復(fù)制具有自動(dòng)選主功能,每次只有一個(gè) server成員接受更新,其他成員只提供讀服務(wù)。在多主模式下運(yùn)行時(shí),所有的 server 成員都可以同時(shí)接受更新,沒(méi)有主從之分,成員角色是完全對(duì)等的。 組復(fù)制默認(rèn)情況下是單主模式,我們可以通過(guò)設(shè)置參數(shù)group_replication_single_primary_mode=off,讓其變成多主模式。本章的實(shí)戰(zhàn)部分就是以多主模式進(jìn)行MGR復(fù)制的搭建。
MGR特性介紹
- 完成了真正的多節(jié)點(diǎn)讀寫(xiě)的集群方案。
- 基于原生復(fù)制及paxos協(xié)議的組復(fù)制技術(shù),并以插件的方式提供,實(shí)現(xiàn)了數(shù)據(jù)的強(qiáng)一致性
- 由于是多節(jié)點(diǎn)讀寫(xiě),failover切換變得更加簡(jiǎn)單
- 增加刪除節(jié)點(diǎn),自動(dòng)完成同步數(shù)據(jù)和更新組內(nèi)信息的操作。擴(kuò)展性地增強(qiáng)
雖然在MGR的多主模式下,受到不能支持串行隔離級(jí)別和不支持外鍵級(jí)聯(lián)操作的限制條件。而且目前MySQL版本中對(duì)DDL語(yǔ)句操作無(wú)法實(shí)現(xiàn)回滾,導(dǎo)致MGR無(wú)法對(duì)DDL語(yǔ)句做數(shù)據(jù)沖突檢驗(yàn),所以DDL語(yǔ)句在MGR中并發(fā)執(zhí)行存在隱患。但這些都不能阻擋MGR的發(fā)布所帶來(lái)的開(kāi)創(chuàng)新時(shí)代的意義。讓我們一起期待這個(gè)追求極致完美的MySQL數(shù)據(jù)庫(kù),未來(lái)更加璀璨奪目。
MGR搭建實(shí)戰(zhàn)演練
環(huán)境介紹:這里我們準(zhǔn)備三個(gè)節(jié)點(diǎn),數(shù)據(jù)庫(kù)版本使用MySQL5.7.17
數(shù)據(jù)庫(kù)IP地址 數(shù)據(jù)庫(kù)版本信息 主機(jī)名 Server-id
192.168.56.101 MySQL-5.7.17 node2 1013306 192.168.56.102 MySQL-5.7.17 node3 1023306 192.168.56.103 MySQL-5.7.17 proxysql 1033306
實(shí)戰(zhàn)第1步:
在三個(gè)節(jié)點(diǎn)上執(zhí)行安裝MySQL5.7操作。(此步省略,詳情請(qǐng)見(jiàn)書(shū)中第一部分第二章)
實(shí)戰(zhàn)第2步:
在三個(gè)節(jié)點(diǎn)上分別設(shè)置hostname和ip地址的映射關(guān)系
實(shí)戰(zhàn)第3步:
在三個(gè)節(jié)點(diǎn)上分別創(chuàng)建復(fù)制賬號(hào),命令如下
- GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.56.%' IDENTIFIED BY '123456';
實(shí)戰(zhàn)第4步:
在三個(gè)節(jié)點(diǎn)上分別安裝GR插件,命令如下
- INSTALL PLUGIN group_replication SONAME 'group_replication.so';
組件安裝完成之后,展示結(jié)果:
- root@db 13:23: [(none)]> show plugins;
實(shí)戰(zhàn)第5步:
在三個(gè)節(jié)點(diǎn)分別配置各自的集群參數(shù)文件,配置完成之后重啟數(shù)據(jù)庫(kù)
192.168.56.101參數(shù)文件配置展示:(剩下兩個(gè)節(jié)點(diǎn)同理)
Group Replication
- server_id = 1013306
- gtid_mode = ON
- enforce_gtid_consistency = ON
- master_info_repository = TABLE
- relay_log_info_repository = TABLE
- binlog_checksum = NONE
- log_slave_updates = ON
- log_bin = binlog
- binlog_format= ROW
- transaction_write_set_extraction = XXHASH64
- loose-group_replication_group_name = '1f2cee29-f9a2-11e7-8cbb-08002783b39d'
- loose-group_replication_start_on_boot = off
- loose-group_replication_local_address = 'node2:33061'
- loose-group_replication_group_seeds ='node2:33061,node3:33062,proxysql:33063'
- loose-group_replication_bootstrap_group = off
- loose-group_replication_single_primary_mode=off
- loose-group_replication_enforce_update_everywhere_checks=true
重點(diǎn)參數(shù)詳解:(一定要記住這些)
MGR一定要開(kāi)啟GTID功能gtid_mode = ON,enforce_gtid_consistency = ON
MGR在當(dāng)前MySQL版本中,必須要設(shè)置binlog_checksum=none,并且binlog_format=row
MGR需要多源復(fù)制功能,所以需要將主從庫(kù)之間的信息記錄到表中。設(shè)置master_info_repository = TABLE和relay_log_info_repository = TABLE
MGR中開(kāi)啟主鍵信息采集功能:transaction_write_set_extraction= XXHASH64
MGR中把該參數(shù)group_replication_single_primary_mode關(guān)閉目的是搭建多主模式。如果搭建單主模型,保持默認(rèn)參數(shù)即可。
MGR中需要設(shè)置組的名字,該group_replication_group_name是通過(guò)select uuid()來(lái)生成的。
MGR中本地成員的地址由該參數(shù)group_replication_local_address決定,本例中當(dāng)前節(jié)點(diǎn)是node2。后面的端口是每個(gè)節(jié)點(diǎn)都需要一個(gè)獨(dú)立的tcp端口號(hào),節(jié)點(diǎn)之間通過(guò)這個(gè)端口號(hào)進(jìn)行通信。
MGR中其他成員的地址由這個(gè)參數(shù)group_replication_group_seeds決定
MGR采取多主模式時(shí),需要讓該參數(shù)group_replication_single_primary_mode=off(默認(rèn)是單主模式)。
于此同時(shí)需要將該參數(shù)group_replication_enforce_update_everywhere_checks=true。目的是為了做多主模式限制檢測(cè)。
注:加載到參數(shù)文件里面,需要在每個(gè)參數(shù)的前面加loose。
這里再?gòu)?qiáng)調(diào)一個(gè)參數(shù)group_replication_auto_increment_increment。該參數(shù)代表自增屬性,默認(rèn)值為7。我們要保證每個(gè)成員的該值相同,并且建議該參數(shù)的設(shè)置盡量比組內(nèi)成員的個(gè)數(shù)大一些,方便后期集群的擴(kuò)展。
實(shí)戰(zhàn)第6步:
在192.168.56.101上啟動(dòng)首個(gè)節(jié)點(diǎn)的MGR集群服務(wù)。命令如下:
- CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery'
(MGR需要該異步復(fù)制通道,實(shí)現(xiàn)新節(jié)點(diǎn)加入集群自動(dòng)從其他節(jié)點(diǎn)復(fù)制數(shù)據(jù)的目的,不需要手工指定從哪個(gè)節(jié)點(diǎn)復(fù)制,master_host和master_port信息。都是自動(dòng)完成)
- SET GLOBAL group_replication_bootstrap_group = ON;
(執(zhí)行初始化操作,只有首個(gè)節(jié)點(diǎn)需要這一步操作)
- START GROUP_REPLICATION;
啟動(dòng)成功之后,查看節(jié)點(diǎn)狀態(tài)信息。命令如下
- SELECT * FROM performance_schema.replication_group_members;
關(guān)閉初始化操作 命令如下:
- SET GLOBAL group_replication_bootstrap_group = off;
注:replication_group_members表中MEMBER_STATE字段狀態(tài)為ONLINE,再執(zhí)行關(guān)閉初始化命令。
實(shí)戰(zhàn)第7步:
在192.168.56.102上面啟動(dòng)第二個(gè)節(jié)點(diǎn)的mgr集群服務(wù)。命令如下
- CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
- set global group_replication_allow_local_disjoint_gtids_join=ON;
- START GROUP_REPLICATION;
啟動(dòng)成功之后,查看節(jié)點(diǎn)狀態(tài)信息。命令如下
- SELECT * FROM performance_schema.replication_group_members;
實(shí)戰(zhàn)第8步:
在192.168.56.103上面啟動(dòng)第三個(gè)節(jié)點(diǎn)的mgr集群服務(wù)。命令如下
- CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
- set global group_replication_allow_local_disjoint_gtids_join=ON;
- START GROUP_REPLICATION;
啟動(dòng)成功之后,查看節(jié)點(diǎn)狀態(tài)信息。命令如下:
- SELECT * FROM performance_schema.replication_group_members;
可見(jiàn)啟動(dòng)成功之后,三個(gè)成員的狀態(tài)都是ONLINE,證明已經(jīng)開(kāi)始正常工作了。真正可以實(shí)現(xiàn)多節(jié)點(diǎn)的讀寫(xiě)操作了。
以上就是對(duì)于MGR多主模式的原理介紹及其搭建過(guò)程。我們要有一種學(xué)習(xí)新知識(shí)的能力,多實(shí)操,多演練,從中得到其真諦,感受MySQL給我們帶來(lái)的簡(jiǎn)單快樂(lè)!今后還會(huì)多發(fā)布更多技術(shù)的文章,大家多溝通交流!