1.MGR簡(jiǎn)介
MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引進(jìn)的一個(gè)數(shù)據(jù)庫(kù)高可用與高擴(kuò)展的解決方案,以插件形式提供。MGR基于分布式paxos協(xié)議,實(shí)現(xiàn)組復(fù)制,保證數(shù)據(jù)一致性。內(nèi)置故障檢測(cè)和自動(dòng)選主功能,只要不是集群中的大多數(shù)節(jié)點(diǎn)都宕機(jī),就可以繼續(xù)正常工作。提供單主模式與多主模式,多主模式支持多點(diǎn)寫入。
2.原理簡(jiǎn)單介紹
組復(fù)制是一種可用于實(shí)現(xiàn)容錯(cuò)系統(tǒng)的技術(shù)。復(fù)制組是一個(gè)通過消息傳遞相互交互的Server集群。復(fù)制組由多個(gè)Server成員組成,如下圖的Master1、Master2、Master3,所有成員獨(dú)立完成各自的事務(wù)。

當(dāng)客戶端發(fā)起一個(gè)更新事務(wù)時(shí),該事務(wù)先在本地執(zhí)行,執(zhí)行完成之后就要發(fā)起對(duì)事務(wù)的提交操作。在還沒有真正提交之前,需要將產(chǎn)生的復(fù)制寫集廣播出去,復(fù)制到其它成員。如果沖突檢測(cè)成功,組內(nèi)決定該事務(wù)可以提交,其它成員可以應(yīng)用,否則就回滾。
最終,所有組內(nèi)成員以相同的順序接收同一組事務(wù)。因此組內(nèi)成員以相同的順序應(yīng)用相同的修改,保證組內(nèi)數(shù)據(jù)強(qiáng)一致性。
3.使用限制
3.1 僅支持innodb引擎
? 為什么需要使用innodb引擎呢?在MySQL Group Replication中,事務(wù)以樂觀形式執(zhí)行,但是在提交時(shí)檢查沖突,如果存在沖突,則會(huì)在某些實(shí)例上回滾事務(wù),保持各個(gè)實(shí)例的數(shù)據(jù)一致性,那么,這就需要使用到 事務(wù)存儲(chǔ)引擎,同事Innodb提供一些額外的功能,可以更好的管理和處理沖突,所以建議 業(yè)務(wù)使用表格使用inndb存儲(chǔ)引擎,類似于系統(tǒng)表格mysql.user使用MyISAM引擎的表格,因?yàn)闃O少修改及添加,極少出現(xiàn)沖突情況。
3.2 主鍵
? 每個(gè)需要復(fù)制的表格都必須定義一個(gè)顯式主鍵,注意跟隱式主鍵區(qū)分(使用Innodb引擎的表格,如果沒有指定主鍵,默認(rèn)選擇第一個(gè)非空的唯一索引作為主鍵,如果沒有,則自動(dòng)創(chuàng)建一個(gè)6個(gè)字節(jié)的rowid隱式主鍵)。這個(gè)主鍵能在沖突發(fā)生時(shí)啟動(dòng)極其重要的作用,同時(shí),能夠有效提高relay log的執(zhí)行效率。
3.3 隔離級(jí)別
? 官網(wǎng)建議使用READ COMMITTED級(jí)別,除非應(yīng)用程序依賴于REPLEATABLE READ,RC模式下沒有GAP LOCK,比較好支持Innodb本身的沖突檢測(cè)機(jī)制何組復(fù)制的內(nèi)部分布式檢測(cè)機(jī)制一起協(xié)同工作。不支持SERIALIZABLE隔離級(jí)別。
3.4 外鍵
? 不建議使用級(jí)聯(lián)外鍵,如果舊庫(kù)本身有外鍵,業(yè)務(wù)上無法去除并且使用的是多主模式,那么,請(qǐng)配置 group_replication_enforce_update_everywhere_check ,強(qiáng)制檢查每個(gè)組成員的級(jí)聯(lián)檢查,避免多主模式下執(zhí)行級(jí)聯(lián)操作造成的檢測(cè)不到的沖突。
4.參數(shù)規(guī)范
因前期創(chuàng)建實(shí)例大多采取默認(rèn)配置 導(dǎo)致開發(fā),測(cè)試,生產(chǎn)等環(huán)境間數(shù)據(jù)庫(kù)參數(shù)不同 對(duì)程序運(yùn)行有一定的影響。 以后創(chuàng)建實(shí)例將會(huì)參數(shù)規(guī)范化 對(duì)已有的實(shí)例后續(xù)也會(huì)慢慢修正 。
下面簡(jiǎn)單解釋下幾個(gè)改動(dòng)的參數(shù)
sql_mode去除了ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE等限制 采取了較為寬松的模式lower_case_table_names統(tǒng)一設(shè)置為1 即不區(qū)分大小寫 有些實(shí)例還沒更改 大家建表建庫(kù)的時(shí)候不要大寫character-set-server統(tǒng)一設(shè)置為utf8 不要用latin1字符集wait_timeout和interactive_timeout參數(shù)控制空閑連接的時(shí)長(zhǎng) 當(dāng)連接空閑時(shí)間超過此參數(shù)則會(huì)被斷開 以后會(huì)統(tǒng)一設(shè)置為1800s即30分鐘transaction_isolation事務(wù)隔離級(jí)別 MySQL官方默認(rèn)是可重復(fù)讀(repeatable-read)目前單實(shí)例及主從架構(gòu)的mysql采用了此級(jí)別,MGR集群將采取讀已提交(read-committed)級(jí)別。Oracle默認(rèn)是讀已提交 。