1. 程式人生 > >MySQL group replication

MySQL group replication

出現 上下 art 處理 自動創建 mit 排序 主從 同時

本篇文章主要講解MySQL group replication介紹,文中有關MySQL,group的內容,希望對大家有所幫助。

“MySQL group replication”

group replication是MySQL官方開發的一個開源插件,是實現MySQL高可用集群的一個工具。第一個GA版本正式發布於MySQL5.7.17中;想要使用group replication只需要從官網上下載MySQL5.7.17及以後的版本即可

group replication發布以後,有3種方法來實現MySQL的高可用集群:

①:異步復制

②:半同步復制

③:group replication

---註意:

異步復制是實現最早也是最簡單的高可用方法。相比異步復制而言,半同步復制提高了MySQL集群的可靠性。group replication則是MySQL復制今後發展的方向,與前兩者相比,不僅是可靠性更好,在易用性上也有巨大提高;

1、組的概念:

group replication插件中有組(group)的概念,被group replication插件連接在一起的MySQL服務器是一個高可用組,組內的MySQL服務器被稱為成員。組的概念貫穿與group replication的使用和內部實現之中。group replication內部集成了組管理服務,實現了很多組內成員的自動化管理功能,這使得group replication的使用和管理變得非常簡單。

用戶對group replication組的管理有三種操作,分別如下:

①:創建組:當組的第一個成員啟動時,需要對組進行初始化

②:加入組:將MySQL服務器加入到一個村子的group replication組內

③:離開組:從一個group replication組內移除一臺MySQL服務器;

---當組初始化後,組的第一個成員會自動成為master,新加入的成員會自動從組內的master上復制數據。這些使用到的通道由group replication插件自動控制,不需要用戶的幹預。特別是當MySQL服務器出現故障需要做切換的時候,選擇新的master之後,整個切換過程會自動完成,不必像主從那樣使用命令手動來完成切換;

2、多主復制:

group replication支持像異步、半同步復制一樣可以做一主多從的復制,group replication稱為單主復制。除此之外,group replication還提供了一種更高級的復制技術,叫 多主復制。在多主模式下,所有成員同時對外提供的讀寫服務都是master,彼此之間會自動進行數據復制。這是一種真正意義的多主並發復制,用戶可以向一個MySQL上更新數據一樣,並發的多個成員上更新數據。group replication插件能夠將這些並發事務的更新操作同步到每個成員上,使他們數據保持一致;

2.1、多主復制的優勢:

①:當一個成員發生故障時,只會造成一部分連接失效,對應用程序的影響會小一些;

②:當需要關閉某個MySQL服務器時,可以先將其上的連接平滑的轉移到其他成員上後關閉這個成員,不會造成應用的瞬時中斷;

③:多主模式的性能很好,對瞬時的高並發有著很好的承載能力;

3、group replication在傳輸數據時,使用了paxos協議。

paxos協議保證了數據傳輸的一致性和原子性。group replication基於paxos協議構建了一個分布式的狀態復制機制,這是實現多主復制的核心技術。這個技術為group replication帶來3個主要優點,如下:

①:group replication中不會出現腦裂現象

②:group replication的冗余能力很好,能夠保證binlog event至少被復制到超過一半的成員上,只要同時宕機的成員不超過半數就不會導致數據丟失;

③:group replication還保證只要binlog event沒被傳輸到半數以上的成員,本地成員不會將事務的binlog event寫入binlog文件和提交事務,從而保證宕機的服務器上不會有組內在線成員上不存在的數據。因此宕機的服務器重啟後,不再需要特殊的處理就可以加入組;

4、group replication服務模式:

group replication組對外提供服務的時候有2種服務模式:單主模式 多主模式

4.1、單主模式:

單主模式下只有一個成員提供更新服務,其他成員只提供查詢服務。提供更新服務的成員叫做 主成員,只提供查詢服務的叫做 從成員。group replication的單主模式是異步復制和半同步復制的替代方案。單主復制模式的特點如下:

①:主成員的自動選取和切換:

單主模式下,組內的成員會自動選舉出主成員。初始化時,被初始化的成員自動選舉為主成員,其他成員稱為從成員。當主成員出現故障的時候,會從組內的其他成員選出一個新的主成員。選取的方法就是對所有在線的成員的UUID進行排序,然後選取UUID最小的成員作為主成員;

在任何一個成員的服務器上都能使用命令查看主成員的UUID:

show global status like "group_replication_primary_member"; 或 select * from performance_schema.global_status where variable_name=‘group_replication_primary_member‘;

②:讀寫模式的自動切換:

當一個成員加入組時,group replication插件會自動將MySQL變成只讀模式,只有被選取為主成員後才會自動切換回讀寫模式。對MySQL只讀模式的控制是通過下面的sql語句進行的:

set global super_read_only=1;

set global super_read_only=0;

註意:當主成員故障時,組內會自動選出新的主成員,復制也能正常進行。因此組內的failover是完全自動化的,不需要用戶幹預;

4.2、多主模式

多主模式下,組中所有的成員同時對外提供查詢和更新服務,且沒有主從之分,成員之間是完全對等的。客戶端連接到任何一個成員上,都能進行讀寫操作,就好像在操作同一個MySQL服務器;

①:自增段的處理:

當使用多主模式時,需要設置autoincrement相關的參數來保證自增字段在每個成員上產生不同的值。group replication提供了兩種配置方式,分別如下:

“直接配置MySQL的系統變量”:set global auto_increment_offset=N; set global auto_increment_increment=N;

“通過group replication插件來配置”:set group_replication_auto_increment_increment=N; (默認值是7,一般不用修改)

註意:在實踐中,server_id 最好是使用:1,2,3,之類的自增值,如果不是,就需要手動來配置MySQL的自增變量;(auto_increment_increment代表段的大小,自增字段的大小依賴於group replication組中成員的多少。auto_increment_increment最小要等於group replication組內成員的數量。如果段的大小等於組內成員的數量,則所有的自增值都會被使用)

②:多主模式的限制:

不支持串行的隔離級別。單個MySQL服務器中,通過鎖的方式來實現串行化的隔離級別。而多主模式時,多個成員之間的並發操作無法通過鎖來實現串行的隔離級別;

不支持外鍵的級聯操作;

參數:group_replication_enforce_update_everywhere_checks=TRUE 是用來控制是否做以上限制的檢測,如果開啟了這個參數,當發現這些情況時就會報錯;

③:DDL語句並發執行問題:

MySQL5.7上的DDL不是原子操作無法回滾,因此group replication沒有對DDL做沖突檢測。換句話說,DDL語句不會和其他任何語句沖突(包括DML和DDL)。如果DDL和有沖突的語句在不同的成員上同時執行,可能導致錯誤或數據不一致;

④:使用多主模式的條件:

應用或中間件要能夠把寫請求分發到多個成員上

要能夠控制DDL的使用,當DDL要執行時,能夠把所有的寫請求轉移到同一臺MySQL上去執行;

註意:group replication將單主模式設為了默認模式。如果要使用多主模式,則需要在加入組前將這個變量設置為OFF。服務模式是不能在線切換的,必須使組內的所有成員退出組,然後重新初始化組為要使用的服務模式,再把其他成員加進來;

set global group_replication_single_primary_mode=OFF;

5、binlog event的多線程執行:

5.1、group_replication_applier通道:

group replication插件會自動創建一個通道來執行接收到的binlog event,通道的名字是group_replication_applier。當加入組是,group replication插件會自動啟動group_replication_applier通道的執行線程。如果用戶需要調整group_replication_applier執行線程的參數,

也可以手動停止和啟動這個通道的執行線程,操作命令如下:

start slave sql_thread for channel ‘group_replication_applier‘;

stop slave sql_thread for channel ‘group_replication_applier‘;

5.2、基於主鍵的並行執行:

group replication中的binlog event的執行也支持多線程並行執行,配置方法:

set global slave_parallel_type=‘logical_clock‘;

set global slave_parallel_workers=N;

set global slave_preserve_commit_order=ON;

---註意:

group replication的並行復制算法和異步復制中的 logical_clock算法並不相同。group replication並發策略中的邏輯時間是基於主鍵計算出來的,比異步復制基於鎖計算出來的邏輯時間的並發性能要好很多。

基於主鍵的並發復制有以下兩個 特點:

①:如果兩個事物更新了同一行數據,則要按順序執行,否則,就可以並發執行;

②:DDL不能和任何事物並發執行,必須等待它前門的所有事務執行完畢後才能開始執行。後面的事務也必須要等待DDL執行完畢後,才能開始執行;

註意:為了保證同一個session中的事務按照同樣的順序提交,group replication在開啟並行復制時,要求必須設置slave_preserve_commit_order的值為ON;

本文出自 “笨小孩的dba之路” 博客,請務必保留此出處http://fengfeng688.blog.51cto.com/4896812/1941341

MySQL group replication