GreatSQL特性 | 深入淺出MGR
本文介紹GreatSQL的一些關(guān)鍵新特性,相關(guān)特性主要針對(duì)GreatSQL 8.0.x版本(不含GreatSQL 5.7.x版本中的相關(guān)特性)。
1. 地理標(biāo)簽
可以對(duì)每個(gè)節(jié)點(diǎn)設(shè)置地理標(biāo)簽,主要用于解決多機(jī)房數(shù)據(jù)同步的問(wèn)題。
新增選項(xiàng) group_replication_zone_id,用于標(biāo)記節(jié)點(diǎn)地理標(biāo)簽。該選項(xiàng)值支持范圍 0 ~ 8,默認(rèn)值為0。
當(dāng)集群中各節(jié)點(diǎn)該選項(xiàng)值設(shè)置為不同的時(shí)候,就被認(rèn)定為設(shè)置了不同的地理標(biāo)簽。
在同城多機(jī)房部署方案中,同一個(gè)機(jī)房的節(jié)點(diǎn)可以設(shè)置相同的數(shù)值,另一個(gè)機(jī)房里的節(jié)點(diǎn)設(shè)置另一個(gè)不同的數(shù)值,這樣在事務(wù)提交時(shí)會(huì)要求每組 group_replication_zone_id 中至少 有個(gè)節(jié)點(diǎn)確認(rèn)事務(wù),然后才能繼續(xù)處理下一個(gè)事務(wù)。這就可以確保每個(gè)機(jī)房的某個(gè)節(jié)點(diǎn)里,總有最新的事務(wù)。
System Variable Name | group_replication_zone_id |
Variable Scope | global |
Dynamic Variable | YES |
Permitted Values | [0 ~ 8] |
Default | 0 |
Description | 設(shè)置MGR各節(jié)點(diǎn)不同的地理標(biāo)簽,主要用于解決多機(jī)房數(shù)據(jù)同步的問(wèn)題。 修改完該選項(xiàng)值之后,要重啟MGR線程才能生效。 |
引入版本 | 8.0.25-15 |
2. 仲裁節(jié)點(diǎn)
該節(jié)點(diǎn)僅參與MGR投票仲裁,不存放實(shí)際數(shù)據(jù),也無(wú)需執(zhí)行DML操作,因此可以用一般配置級(jí)別的服務(wù)器,在保證MGR可靠性的同時(shí)還能降低服務(wù)器成本。
新增參數(shù)group_replication_arbitrator用于設(shè)置仲裁節(jié)點(diǎn)。
若想新增一個(gè)仲裁節(jié)點(diǎn),只需在 my.cnf 配置文件中添加如下配置:group_replication_arbitrator = true
當(dāng)集群中只剩下 Arbitrator 節(jié)點(diǎn)時(shí),則會(huì)自動(dòng)退出。
注意:
在有仲裁節(jié)點(diǎn)的情況下,將單主切換成多主模式時(shí),需要把投票節(jié)點(diǎn)先關(guān)閉再機(jī)型切換,否則可能會(huì)導(dǎo)致切換失敗,并且仲裁節(jié)點(diǎn)報(bào)錯(cuò)退出MGR。
即便是在關(guān)閉MGR服務(wù)狀態(tài)下,仲裁節(jié)點(diǎn)中也無(wú)法執(zhí)任何有數(shù)據(jù)變更的操作。
System Variable Name | group_replication_arbitrator |
Variable Scope | global |
Dynamic Variable | NO |
Permitted Values | 0 |
Default | 0 |
Description | 設(shè)置本節(jié)點(diǎn)是否為仲裁節(jié)點(diǎn)。實(shí)例啟動(dòng)前先設(shè)置好,不可動(dòng)態(tài)修改 |
引入版本 | 8.0.25-16 |
3. 快速單注
GreatSQL中增加一個(gè)新的工作模式:?jiǎn)沃骺焖倌J剑谶@個(gè)模式下,不再采用MySQL MGR原有的認(rèn)證數(shù)據(jù)庫(kù)方式。新增選項(xiàng) group_replication_single_primary_fast_mode 用于 設(shè)置是否啟用,以及具體采用哪種模式。
快速單主模式特別適合在跨機(jī)房部署,壓力測(cè)試以及內(nèi)存要求不高等多種場(chǎng)景。這種模式弱于傳統(tǒng)的異步復(fù)制,但強(qiáng)于半同步復(fù)制,且沒(méi)有MGR默認(rèn)的認(rèn)證數(shù)據(jù)庫(kù)可能消耗較大內(nèi)存的問(wèn) 題。
提醒,啟用快速單主模式時(shí),不支持采用多主模式;所有節(jié)點(diǎn)都得設(shè)置必須相同,否則無(wú)法啟動(dòng)。
選項(xiàng) group_replication_single_primary_fast_mode 可選值有:0、1、2,不同值分別表示如下:
- 0,表示不采取快速單主模式,這是默認(rèn)值。
- 1,表示采用快速單主模式,支持并并回放。**強(qiáng)烈建議設(shè)置為1,即啟用快速單主模式。**- 2,表示采用快速單主模式,但不支持并行回放,加速relay log落盤(pán),且讓從庫(kù)消耗更少的資源。
System Variable Name | group_replication_single_primary_fast_mode |
Variable Scope | Global |
Dynamic Variable | NO |
Permitted Values | 0 1 2 |
Default | 0 |
Description | 設(shè)置是否啟用快速單主模式,強(qiáng)烈建議啟用(即設(shè)置為1)。 |
引入版本 | 8.0.25-16 |
4. 自定義選主策略
完善自動(dòng)選主機(jī)制,增加基于最新GTID判斷來(lái)選主,避免自動(dòng)選擇沒(méi)有最新GTID的節(jié)點(diǎn)作為新主。
默認(rèn)地,MGR根據(jù)以下規(guī)則選主:
- 當(dāng)有MySQL 5.7和MySQL 8.0不同版本的節(jié)點(diǎn)混合部署時(shí),只會(huì)選擇運(yùn)行5.7的節(jié)點(diǎn)作為主節(jié)點(diǎn)。此外,在 <= MySQL 8.0.16 版本時(shí),以主版本號(hào)進(jìn)行排序,也就是說(shuō) 5.7 排在 8.0 前面。在 > MySQL 8.0.17版本中,則是以補(bǔ)丁版本號(hào)排序,也就是 8.0.17 排在 8.0.25 前面。
- 當(dāng)所有節(jié)點(diǎn)版本號(hào)一致時(shí),則根據(jù)節(jié)點(diǎn)權(quán)重值(選項(xiàng) group_replication_member_weight 定義權(quán)重值,這個(gè)選項(xiàng)5.7版本沒(méi)有,8.0開(kāi)始新增)排序,權(quán)重值高的節(jié)點(diǎn)排在前面。
- 根據(jù)節(jié)點(diǎn) server_uuid 排序。
在一些情況下,在MGR所有節(jié)點(diǎn)都發(fā)生意外要重新拉起時(shí),不會(huì)檢查各節(jié)點(diǎn)事務(wù)應(yīng)用狀態(tài),而錯(cuò)誤選擇新的主節(jié)點(diǎn),這時(shí)可能會(huì)導(dǎo)致丟失一些事務(wù)數(shù)據(jù)。或者當(dāng)原來(lái)的主節(jié)點(diǎn)crash需要 重新投票選擇新的主節(jié)點(diǎn)時(shí),可能也會(huì)選擇一個(gè)權(quán)重值較高,但沒(méi)有最新事務(wù)的節(jié)點(diǎn),也會(huì)存在丟失一部分事務(wù)數(shù)據(jù)的風(fēng)險(xiǎn)。
在GreatSQL中,新增選項(xiàng) group_replication_primary_election_mode 用于自定義選主策略,可選值有以下幾個(gè):
- WEIGHT_ONLY,還是按照上述傳統(tǒng)模式自動(dòng)選主,這是默認(rèn)值。
- GTID_FIRST,優(yōu)先判斷各節(jié)點(diǎn)事務(wù)應(yīng)用狀態(tài),自動(dòng)選擇擁有最新事務(wù)的節(jié)點(diǎn)作為新的主節(jié)點(diǎn)。推薦設(shè)置為該模式。
- WEIGHT_FIRST,傳統(tǒng)模式優(yōu)先,如果沒(méi)有合適的結(jié)果再判斷各節(jié)點(diǎn)事務(wù)狀態(tài)。
提醒,所有節(jié)點(diǎn)都的設(shè)置必須相同,否則無(wú)法啟動(dòng)。
System Variable Name | group_replication_primary_election_mode |
Variable Scope | Global |
Dynamic Variable | NO |
Permitted Values | WEIGHT_ONLY GTID_FIRST WEIGHT_FIRST |
Default | WEIGHT_ONLY |
Description | 當(dāng)MGR集群需要投票選主時(shí),采用何種投票策略。 |
引入版本 | 8.0.25-16 |
5. 并行查詢(xún)
根據(jù)B+樹(shù)的特點(diǎn),可以將B+樹(shù)劃分為若干子樹(shù),此時(shí)多個(gè)線程可以并行掃描同一張InnoDB表的不同部分。對(duì)執(zhí)行計(jì)劃進(jìn)行多線程改造,每個(gè)子線程執(zhí)行計(jì)劃與MySQL原始執(zhí)行計(jì)劃一致, 但每個(gè)子線程只需掃描表的部分?jǐn)?shù)據(jù),子線程掃描完成后再進(jìn)行結(jié)果匯總。通過(guò)多線程改造,可以充分利用多核資源,提升查詢(xún)性能。
優(yōu)化后,在TPC-H測(cè)試中表現(xiàn)優(yōu)異,最高可提升30倍,平均提升15倍。該特性適用于周期性數(shù)據(jù)匯總報(bào)表之類(lèi)的SAP、財(cái)務(wù)統(tǒng)計(jì)等業(yè)務(wù)。
使用限制:
暫不支持子查詢(xún),可想辦法改造成JOIN。
暫時(shí)只支持ARM架構(gòu)平臺(tái),X86架構(gòu)平臺(tái)優(yōu)化也會(huì)盡快完成。
System Variable Name | force_parallel_execute |
Variable Scope | Global |
Dynamic Variable | YES |
Permitted Values | ON |
Default | OFF |
Description | 是否啟用InnoDB并行查詢(xún)特性 |
引入版本 | 8.0.25-15 |
更多關(guān)于InnoDB并行查詢(xún)相關(guān)選項(xiàng)參考文檔 InnoDB并行查詢(xún)優(yōu)化參考(https://gitee.com/GreatSQL/GreatSQL-Doc/blob/master/docs/innodb-parallel-execute.md)。
6. GreatSQL VS MySQL社區(qū)版
特性 | GreatSQL 8.0.25-16 | MySQL 8.0.25 社區(qū)版 |
投票節(jié)點(diǎn)/仲裁節(jié)點(diǎn) | ? | ? |
快速單主模式 | ? | ? |
地理標(biāo)簽 | ? | ? |
全新流控算法 | ? | ? |
InnoDB并行查詢(xún)優(yōu)化 | ? | ? |
線程池(Thread Pool) | ? | ? |
審計(jì) | ? | ? |
InnoDB事務(wù)鎖優(yōu)化 | ? | ? |
SEQUENCE_TABLE(N)函數(shù) | ? | ? |
InnoDB表?yè)p壞異常處理 | ? | ? |
強(qiáng)制只能使用InnoDB引擎表 | ? | ? |
殺掉空閑事務(wù),避免長(zhǎng)時(shí)間鎖等待 | ? | ? |
Data Masking(數(shù)據(jù)脫敏/打碼) | ? | ? |
InnoDB碎片頁(yè)統(tǒng)計(jì)增強(qiáng) | ? | ? |
支持MyRocks引擎 | ? | ? |
InnoDB I/O性能提升 | ?????????? | ???? |
網(wǎng)絡(luò)分區(qū)異常應(yīng)對(duì) | ?????????? | ?? |
完善節(jié)點(diǎn)異常退出處理 | ?????????? | ?? |
一致性讀性能 | ?????????? | ?? |
提升MGR吞吐量 | ?????????? | ?? |
統(tǒng)計(jì)信息增強(qiáng) | ?????????? | ?? |
slow log增強(qiáng) | ?????????? | ?? |
大事務(wù)處理 | ???????? | ?? |
修復(fù)多寫(xiě)模式下可能丟數(shù)據(jù)風(fēng)險(xiǎn) | ?????????? | / |
修復(fù)單主模式下切主丟數(shù)據(jù)風(fēng)險(xiǎn) | ?????????? | / |
MGR集群?jiǎn)?dòng)效率提升 | ?????????? | / |
集群節(jié)點(diǎn)磁盤(pán)滿(mǎn)處理 | ?????????? | / |
修復(fù)TCP self-connect問(wèn)題 | ?????????? | / |
PROCESSLIST增強(qiáng) | ?????????? | / |