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

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

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

那麼在MySQL領域有沒有這麼一把威力超大的「槍」呢~答案是必須有啊!但老張先問大家一個問題。數據庫

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

本章介紹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,全部成員獨立完成各自的事務。當客戶端先發起一個更新事務,該事務先在本地執行,執行完成以後就要發起對事務的提交操做了。在尚未真正提交以前須要將產生的複製寫集廣播出去,複製到其餘成員。若是衝突檢測成功,組內決定該事務能夠提交,其餘成員能夠應用,不然就回滾。最終,這意味着全部組內成員以相同的順序接收同一組事務。所以組內成員以相同的順序應用相同的修改,保證組內數據強一致性。tcp

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

MGR組複製模式

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

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步:
在三個節點上分別建立複製帳號,命令以下ui

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給咱們帶來的簡單快樂!從此還會多發佈更多技術的文章,你們多溝通交流!

相關文章
相關標籤/搜索