您好,登錄后才能下訂單哦!
本篇內容主要講解“MySQL多組復制的優勢以及單主模式和多主模式的區別”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MySQL多組復制的優勢以及單主模式和多主模式的區別”吧!
“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;
到此,相信大家對“MySQL多組復制的優勢以及單主模式和多主模式的區別”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。