老司機帶你在MySQL領域“大吉大利,晚上吃雞”

老張superzs來更新博客啦,大家新年好啊,好久沒有跟大家見面了。說句走心的話,很想你們!最近因爲要出版自己的第一本書《MySQL王者晉級之路》一直在忙於宣傳。實在抱歉,沒能及時更博。今後還是會多奉獻精彩文章!

最近絕地求生這個遊戲太火了,當我問我的朋友們你們閒時在幹嘛,基本上告訴我的答案都是在"吃雞"啊!想必很多老鐵們也玩,那一定應該知道絕地求生中有把槍叫AWM。此槍傷害裸132點,爆頭330,即使三級頭爆頭必死,無防彈衣或者防彈衣有破損,一槍死。是這個遊戲中威力最大的狙擊×××,足足是98K的兩倍。

那麼在MySQL領域有沒有這麼一把威力超大的“槍”呢~答案是必須有啊!但老張先問你們一個問題。

請問你搭建MySQL複製的時候,還在執行備份恢復,在從庫進行change master to的操作嘛?如果是那你可就真的落後了。

本章介紹MySQL官方推薦的一款高可用集羣方案MySQL Group Replication。簡稱:MGR(組複製)。它是官方推出的一種基於Paxos協議的狀態機複製,徹底解決了基於傳統的異步複製和半同步複製中數據一致性問題無法保證的情況。也讓MySQL數據庫涉及的領域更廣,徹底擁有了打開互聯網金融行業的大門。2016年12月 MySQL Group Replication推出了第一個GA版本發佈在MySQL5.7.17中。但目前直接投入到生產環境中使用,風險還是比較大。建議等其越來越成熟之後,我們再真正投入使用。

隨着MySQL8.0版本即將與我們見面,再配合官方逐漸成熟的高可用集羣 Group Replication方案,到那時再看看誰還是我們MySQL的對手,全都不在了!MySQL數據庫就是作者的信仰,愛你無怨無悔。

MGR組複製原理

先來談談什麼叫做組複製。組複製是一種可用於實現容錯系統的技術。複製組是一個通過消息傳遞相互交互的server集羣。複製組由多個server成員組成,如下圖的master1,master2,master3,所有成員獨立完成各自的事務。當客戶端先發起一個更新事務,該事務先在本地執行,執行完成之後就要發起對事務的提交操作了。在還沒有真正提交之前需要將產生的複製寫集廣播出去,複製到其他成員。如果衝突檢測成功,組內決定該事務可以提交,其他成員可以應用,否則就回滾。最終,這意味着所有組內成員以相同的順序接收同一組事務。因此組內成員以相同的順序應用相同的修改,保證組內數據強一致性。

老司機帶你在MySQL領域“大吉大利,晚上吃雞”

MGR組複製模式

組複製可以在兩種模式下運行。 在單主模式下,組複製具有自動選主功能,每次只有一個 server成員接受更新,其他成員只提供讀服務。在多主模式下運行時,所有的 server 成員都可以同時接受更新,沒有主從之分,成員角色是完全對等的。 組複製默認情況下是單主模式,我們可以通過設置參數group_replication_single_primary_mode=off,讓其變成多主模式。本章的實戰部分就是以多主模式進行MGR複製的搭建。

MGR特性介紹

  1. 完成了真正的多節點讀寫的集羣方案。
  2. 基於原生複製及paxos協議的組複製技術,並以插件的方式提供,實現了數據的強一致性
  3. 由於是多節點讀寫,failover切換變得更加簡單
  4. 增加刪除節點,自動完成同步數據和更新組內信息的操作。擴展性地增強
    雖然在MGR的多主模式下,受到不能支持串行隔離級別和不支持外鍵級聯操作的限制條件。而且目前MySQL版本中對DDL語句操作無法實現回滾,導致MGR無法對DDL語句做數據衝突檢驗,所以DDL語句在MGR中併發執行存在隱患。但這些都不能阻擋MGR的發佈所帶來的開創新時代的意義。讓我們一起期待這個追求極致完美的MySQL數據庫,未來更加璀璨奪目。

MGR搭建實戰演練

環境介紹:這裏我們準備三個節點,數據庫版本使用MySQL5.7.17

數據庫IP地址 數據庫版本信息 主機名 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

實戰第1步:
在三個節點上執行安裝MySQL5.7操作。(此步省略,詳情請見書中第一部分第二章)
實戰第2步:
在三個節點上分別設置hostname和ip地址的映射關係
老司機帶你在MySQL領域“大吉大利,晚上吃雞”
實戰第3步:
在三個節點上分別創建複製賬號,命令如下

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.56.%' IDENTIFIED BY '123456';

實戰第4步:
在三個節點上分別安裝GR插件,命令如下

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

組件安裝完成之後,展示結果:

root@db 13:23:  [(none)]> show plugins;

老司機帶你在MySQL領域“大吉大利,晚上吃雞”
實戰第5步:
在三個節點分別配置各自的集羣參數文件,配置完成之後重啓數據庫
192.168.56.101參數文件配置展示:(剩下兩個節點同理)

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

重點參數詳解:(一定要記住這些)
MGR一定要開啓GTID功能gtid_mode = ON,enforce_gtid_consistency = ON
MGR在當前MySQL版本中,必須要設置binlog_checksum=none,並且binlog_format=row
MGR需要多源複製功能,所以需要將主從庫之間的信息記錄到表中。設置master_info_repository = TABLErelay_log_info_repository = TABLE
MGR中開啓主鍵信息採集功能:transaction_write_set_extraction= XXHASH64
MGR中把該參數group_replication_single_primary_mode關閉目的是搭建多主模式。如果搭建單主模型,保持默認參數即可。
MGR中需要設置組的名字,該group_replication_group_name是通過select uuid()來生成的。
MGR中本地成員的地址由該參數group_replication_local_address決定,本例中當前節點是node2。後面的端口是每個節點都需要一個獨立的tcp端口號,節點之間通過這個端口號進行通信。
MGR中其他成員的地址由這個參數group_replication_group_seeds決定
MGR採取多主模式時,需要讓該參數group_replication_single_primary_mode=off(默認是單主模式)。
於此同時需要將該參數group_replication_enforce_update_everywhere_checks=true。目的是爲了做多主模式限制檢測。
注:加載到參數文件裏面,需要在每個參數的前面加loose。
這裏再強調一個參數group_replication_auto_increment_increment。該參數代表自增屬性,默認值爲7。我們要保證每個成員的該值相同,並且建議該參數的設置儘量比組內成員的個數大一些,方便後期集羣的擴展。

實戰第6步:
在192.168.56.101上啓動首個節點的MGR集羣服務。命令如下:

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery'

(MGR需要該異步複製通道,實現新節點加入集羣自動從其他節點複製數據的目的,不需要手工指定從哪個節點複製,master_host和master_port信息。都是自動完成)
SET GLOBAL group_replication_bootstrap_group = ON;
(執行初始化操作,只有首個節點需要這一步操作)
START GROUP_REPLICATION;
啓動成功之後,查看節點狀態信息。命令如下

SELECT * FROM performance_schema.replication_group_members;

關閉初始化操作 命令如下:

SET GLOBAL group_replication_bootstrap_group = off;

注:replication_group_members表中MEMBER_STATE字段狀態爲ONLINE,再執行關閉初始化命令。
老司機帶你在MySQL領域“大吉大利,晚上吃雞”
實戰第7步:
在192.168.56.102上面啓動第二個節點的mgr集羣服務。命令如下

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; 

啓動成功之後,查看節點狀態信息。命令如下

 SELECT * FROM performance_schema.replication_group_members;

老司機帶你在MySQL領域“大吉大利,晚上吃雞”
實戰第8步:
在192.168.56.103上面啓動第三個節點的mgr集羣服務。命令如下

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; 

啓動成功之後,查看節點狀態信息。命令如下:

 SELECT * FROM performance_schema.replication_group_members;

可見啓動成功之後,三個成員的狀態都是ONLINE,證明已經開始正常工作了。真正可以實現多節點的讀寫操作了。

以上就是對於MGR多主模式的原理介紹及其搭建過程。我們要有一種學習新知識的能力,多實操,多演練,從中得到其真諦,感受MySQL給我們帶來的簡單快樂!今後還會多發佈更多技術的文章,大家多溝通交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章