原創做者: 田帥萌html
MySQL 8.0.14版本增長了一個新特性:MGR讀寫一致性;有了此特性,「媽媽」不再用擔憂讀MGR非寫節點數據會產生不一致啦。mysql
有同窗會疑問:「MGR不是'全同步'麼,也會產生讀寫不一致?」,在此確定的告訴你們MGR會產生讀寫不一致,緣由以下:sql
MGR相對於半同步複製,在relay log前增長了衝突檢查協調,可是binlog回放仍然可能延時,也就是跟咱們熟悉的半同步複製存在io線程的回放延遲狀況相似。固然關於IO線程回放慢的緣由,跟半同步也相似,好比大事務!!數據庫
因此MGR並非全同步方案,關於如何處理一致性讀寫的問題,MySQL 在8.0.14版本中加入了「讀寫一致性」特性,並引入了參數:**group_replication_consistenc,**下面將對讀寫一致性的相關參數及不一樣應用場景進行詳細說明。服務器
group_replication_consistency 參數能夠用法SESSION,GLOBAL去進行更改。網絡
官方說明請參考:性能
https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.htmlspa
官方引入的MGR讀寫一致性既有它自身的自然優點,也不可避免的存在相應的不足,其優缺點以下:線程
優勢:MGR配合中間件,好比DBLE這類有讀寫分離功能的中間件,在MGR單主模式下,能夠根據業務場景進行讀寫分離,不用擔憂會產生延遲,充分利用了MGR主節點之外的節點。htm
缺點:使用讀寫一致性會對性能有極大影響,尤爲是網絡環境不穩定的場景下。
在實際應用中須要你們因地制宜,根據實際狀況選擇最適配的方案。
針對不一樣應用場景應當如何選擇MGR讀寫一致性的相關方式,官方提供了幾個參數以及與其相對應的應用場景:
AFTER
適用場景1:寫少讀多的場景進行讀寫分離,擔憂讀取到過時事務,可選擇AFTER。
適用場景2:只讀爲主的集羣,有RW的事務須要保證提交的事務能被其餘後序事務讀到最新讀數據,可選擇AFTER。
BEFORE
適用場景1:應用大量寫入數據,偶爾進行讀取一致性數據,應當選擇BEFORE。
適用場景2:有特定事務須要讀寫一致性,以便對敏感數據操做時,始終讀取最新的數據;應當選擇BEFORE。
BEFORE_AND_AFTER
適用場景:有一個讀爲主的集羣,有RW的事務既要保證讀到最新的數據,又要保證這個事務提交後,被其餘後序事務讀到;在這種狀況下可選擇BEFORE_AND_AFTER。
在特定會話上設置一致性
舉例1:某一事務語句,須要其餘節點的數據強一致性。可使用SET@@SESSION.group_replication_consistency= ‘AFTER’進行設置。
舉例2:跟例1類似,在天天執行分析語句事務而且須要得到讀取新數據的狀況下。
可使用SET @@SESSION.group_replication_consistency= ‘BEFORE’ 進行設置
參考文檔: