MySQL group replication介紹

zping發表於2018-06-07

“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;

 

相關文章