溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL多組復(fù)制的優(yōu)勢(shì)以及單主模式和多主模式的區(qū)別

發(fā)布時(shí)間:2021-09-08 18:16:53 來(lái)源:億速云 閱讀:210 作者:chen 欄目:建站服務(wù)器

本篇內(nèi)容主要講解“MySQL多組復(fù)制的優(yōu)勢(shì)以及單主模式和多主模式的區(qū)別”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“MySQL多組復(fù)制的優(yōu)勢(shì)以及單主模式和多主模式的區(qū)別”吧!

“MySQL group replication”

group replication是MySQL官方開(kāi)發(fā)的一個(gè)開(kāi)源插件,是實(shí)現(xiàn)MySQL高可用集群的一個(gè)工具。第一個(gè)GA版本正式發(fā)布于MySQL5.7.17中;想要使用group replication只需要從官網(wǎng)上下載MySQL5.7.17及以后的版本即可

group replication發(fā)布以后,有3種方法來(lái)實(shí)現(xiàn)MySQL的高可用集群:

①:異步復(fù)制

②:半同步復(fù)制

③:group replication

---注意:

  異步復(fù)制是實(shí)現(xiàn)最早也是最簡(jiǎn)單的高可用方法。相比異步復(fù)制而言,半同步復(fù)制提高了MySQL集群的可靠性。group replication則是MySQL復(fù)制今后發(fā)展的方向,與前兩者相比,不僅是可靠性更好,在易用性上也有巨大提高;

1、組的概念:

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

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

①:創(chuàng)建組:當(dāng)組的第一個(gè)成員啟動(dòng)時(shí),需要對(duì)組進(jìn)行初始化

②:加入組:將MySQL服務(wù)器加入到一個(gè)村子的group replication組內(nèi)

③:離開(kāi)組:從一個(gè)group replication組內(nèi)移除一臺(tái)MySQL服務(wù)器;

---當(dāng)組初始化后,組的第一個(gè)成員會(huì)自動(dòng)成為master,新加入的成員會(huì)自動(dòng)從組內(nèi)的master上復(fù)制數(shù)據(jù)。這些使用到的通道由group replication插件自動(dòng)控制,不需要用戶的干預(yù)。特別是當(dāng)MySQL服務(wù)器出現(xiàn)故障需要做切換的時(shí)候,選擇新的master之后,整個(gè)切換過(guò)程會(huì)自動(dòng)完成,不必像主從那樣使用命令手動(dòng)來(lái)完成切換;

2、多主復(fù)制:

   group replication支持像異步、半同步復(fù)制一樣可以做一主多從的復(fù)制,group replication稱為單主復(fù)制。除此之外,group replication還提供了一種更高級(jí)的復(fù)制技術(shù),叫 多主復(fù)制。在多主模式下,所有成員同時(shí)對(duì)外提供的讀寫(xiě)服務(wù)都是master,彼此之間會(huì)自動(dòng)進(jìn)行數(shù)據(jù)復(fù)制。這是一種真正意義的多主并發(fā)復(fù)制,用戶可以向一個(gè)MySQL上更新數(shù)據(jù)一樣,并發(fā)的多個(gè)成員上更新數(shù)據(jù)。group replication插件能夠?qū)⑦@些并發(fā)事務(wù)的更新操作同步到每個(gè)成員上,使他們數(shù)據(jù)保持一致;

2.1、多主復(fù)制的優(yōu)勢(shì):

①:當(dāng)一個(gè)成員發(fā)生故障時(shí),只會(huì)造成一部分連接失效,對(duì)應(yīng)用程序的影響會(huì)小一些;

②:當(dāng)需要關(guān)閉某個(gè)MySQL服務(wù)器時(shí),可以先將其上的連接平滑的轉(zhuǎn)移到其他成員上后關(guān)閉這個(gè)成員,不會(huì)造成應(yīng)用的瞬時(shí)中斷;

③:多主模式的性能很好,對(duì)瞬時(shí)的高并發(fā)有著很好的承載能力;

3、group replication在傳輸數(shù)據(jù)時(shí),使用了paxos協(xié)議。

   paxos協(xié)議保證了數(shù)據(jù)傳輸?shù)囊恢滦院驮有浴roup replication基于paxos協(xié)議構(gòu)建了一個(gè)分布式的狀態(tài)復(fù)制機(jī)制,這是實(shí)現(xiàn)多主復(fù)制的核心技術(shù)。這個(gè)技術(shù)為group replication帶來(lái)3個(gè)主要優(yōu)點(diǎn),如下:

①:group replication中不會(huì)出現(xiàn)腦裂現(xiàn)象

②:group replication的冗余能力很好,能夠保證binlog event至少被復(fù)制到超過(guò)一半的成員上,只要同時(shí)宕機(jī)的成員不超過(guò)半數(shù)就不會(huì)導(dǎo)致數(shù)據(jù)丟失;

③:group replication還保證只要binlog event沒(méi)被傳輸?shù)桨霐?shù)以上的成員,本地成員不會(huì)將事務(wù)的binlog event寫(xiě)入binlog文件和提交事務(wù),從而保證宕機(jī)的服務(wù)器上不會(huì)有組內(nèi)在線成員上不存在的數(shù)據(jù)。因此宕機(jī)的服務(wù)器重啟后,不再需要特殊的處理就可以加入組;

4、group replication服務(wù)模式:

group replication組對(duì)外提供服務(wù)的時(shí)候有2種服務(wù)模式:?jiǎn)沃髂J?   多主模式 

4.1、單主模式:

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

①:主成員的自動(dòng)選取和切換:

  單主模式下,組內(nèi)的成員會(huì)自動(dòng)選舉出主成員。初始化時(shí),被初始化的成員自動(dòng)選舉為主成員,其他成員稱為從成員。當(dāng)主成員出現(xiàn)故障的時(shí)候,會(huì)從組內(nèi)的其他成員選出一個(gè)新的主成員。選取的方法就是對(duì)所有在線的成員的UUID進(jìn)行排序,然后選取UUID最小的成員作為主成員;

  在任何一個(gè)成員的服務(wù)器上都能使用命令查看主成員的UUID:

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

②:讀寫(xiě)模式的自動(dòng)切換:

  當(dāng)一個(gè)成員加入組時(shí),group replication插件會(huì)自動(dòng)將MySQL變成只讀模式,只有被選取為主成員后才會(huì)自動(dòng)切換回讀寫(xiě)模式。對(duì)MySQL只讀模式的控制是通過(guò)下面的sql語(yǔ)句進(jìn)行的:

  set global super_read_only=1;

  set global super_read_only=0;

注意:當(dāng)主成員故障時(shí),組內(nèi)會(huì)自動(dòng)選出新的主成員,復(fù)制也能正常進(jìn)行。因此組內(nèi)的failover是完全自動(dòng)化的,不需要用戶干預(yù);

4.2、多主模式

   多主模式下,組中所有的成員同時(shí)對(duì)外提供查詢和更新服務(wù),且沒(méi)有主從之分,成員之間是完全對(duì)等的。客戶端連接到任何一個(gè)成員上,都能進(jìn)行讀寫(xiě)操作,就好像在操作同一個(gè)MySQL服務(wù)器;

①:自增段的處理:

  當(dāng)使用多主模式時(shí),需要設(shè)置autoincrement相關(guān)的參數(shù)來(lái)保證自增字段在每個(gè)成員上產(chǎn)生不同的值。group replication提供了兩種配置方式,分別如下:

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

  “通過(guò)group replication插件來(lái)配置”:set group_replication_auto_increment_increment=N; (默認(rèn)值是7,一般不用修改)

注意:在實(shí)踐中,server_id  最好是使用:1,2,3,之類的自增值,如果不是,就需要手動(dòng)來(lái)配置MySQL的自增變量;(auto_increment_increment代表段的大小,自增字段的大小依賴于group replication組中成員的多少。auto_increment_increment最小要等于group replication組內(nèi)成員的數(shù)量。如果段的大小等于組內(nèi)成員的數(shù)量,則所有的自增值都會(huì)被使用)

②:多主模式的限制:

不支持串行的隔離級(jí)別。單個(gè)MySQL服務(wù)器中,通過(guò)鎖的方式來(lái)實(shí)現(xiàn)串行化的隔離級(jí)別。而多主模式時(shí),多個(gè)成員之間的并發(fā)操作無(wú)法通過(guò)鎖來(lái)實(shí)現(xiàn)串行的隔離級(jí)別;

不支持外鍵的級(jí)聯(lián)操作;

參數(shù):group_replication_enforce_update_everywhere_checks=TRUE 是用來(lái)控制是否做以上限制的檢測(cè),如果開(kāi)啟了這個(gè)參數(shù),當(dāng)發(fā)現(xiàn)這些情況時(shí)就會(huì)報(bào)錯(cuò);

③:DDL語(yǔ)句并發(fā)執(zhí)行問(wèn)題:

MySQL5.7上的DDL不是原子操作無(wú)法回滾,因此group replication沒(méi)有對(duì)DDL做沖突檢測(cè)。換句話說(shuō),DDL語(yǔ)句不會(huì)和其他任何語(yǔ)句沖突(包括DML和DDL)。如果DDL和有沖突的語(yǔ)句在不同的成員上同時(shí)執(zhí)行,可能導(dǎo)致錯(cuò)誤或數(shù)據(jù)不一致;

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

應(yīng)用或中間件要能夠把寫(xiě)請(qǐng)求分發(fā)到多個(gè)成員上

要能夠控制DDL的使用,當(dāng)DDL要執(zhí)行時(shí),能夠把所有的寫(xiě)請(qǐng)求轉(zhuǎn)移到同一臺(tái)MySQL上去執(zhí)行;

注意:group replication將單主模式設(shè)為了默認(rèn)模式。如果要使用多主模式,則需要在加入組前將這個(gè)變量設(shè)置為OFF。服務(wù)模式是不能在線切換的,必須使組內(nèi)的所有成員退出組,然后重新初始化組為要使用的服務(wù)模式,再把其他成員加進(jìn)來(lái);

set global group_replication_single_primary_mode=OFF;

5、binlog event的多線程執(zhí)行:

5.1、group_replication_applier通道:

   group replication插件會(huì)自動(dòng)創(chuàng)建一個(gè)通道來(lái)執(zhí)行接收到的binlog event,通道的名字是group_replication_applier。當(dāng)加入組是,group replication插件會(huì)自動(dòng)啟動(dòng)group_replication_applier通道的執(zhí)行線程。如果用戶需要調(diào)整group_replication_applier執(zhí)行線程的參數(shù),

也可以手動(dòng)停止和啟動(dòng)這個(gè)通道的執(zhí)行線程,操作命令如下:

start slave sql_thread  for  channel 'group_replication_applier';

stop slave sql_thread  for  channel 'group_replication_applier';

5.2、基于主鍵的并行執(zhí)行:

group replication中的binlog event的執(zhí)行也支持多線程并行執(zhí)行,配置方法:

set global slave_parallel_type='logical_clock';

set global slave_parallel_workers=N;

set global slave_preserve_commit_order=ON;

---注意:

  group replication的并行復(fù)制算法和異步復(fù)制中的 logical_clock算法并不相同。group replication并發(fā)策略中的邏輯時(shí)間是基于主鍵計(jì)算出來(lái)的,比異步復(fù)制基于鎖計(jì)算出來(lái)的邏輯時(shí)間的并發(fā)性能要好很多。

基于主鍵的并發(fā)復(fù)制有以下兩個(gè) 特點(diǎn):

①:如果兩個(gè)事物更新了同一行數(shù)據(jù),則要按順序執(zhí)行,否則,就可以并發(fā)執(zhí)行;

②:DDL不能和任何事物并發(fā)執(zhí)行,必須等待它前門(mén)的所有事務(wù)執(zhí)行完畢后才能開(kāi)始執(zhí)行。后面的事務(wù)也必須要等待DDL執(zhí)行完畢后,才能開(kāi)始執(zhí)行;

注意:為了保證同一個(gè)session中的事務(wù)按照同樣的順序提交,group replication在開(kāi)啟并行復(fù)制時(shí),要求必須設(shè)置slave_preserve_commit_order的值為ON;

到此,相信大家對(duì)“MySQL多組復(fù)制的優(yōu)勢(shì)以及單主模式和多主模式的區(qū)別”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI