詳解InnoDB Cluster
-
InnoDB Cluster組件介紹
InnoDB Cluster組件介紹.jpg MGR的兩種模式
- 單主模式
自動選出一個主,每次只能接受一個節(jié)點的更新。生成環(huán)境建議使用單主模式
- 多主模式
所有節(jié)點都可以更新,并且可以并發(fā)更新
- MGR的主要特點
- 彈性復(fù)制
- 多寫能力
- 自動故障轉(zhuǎn)移
- MGR的主要限制
- 僅支持InnoDB存儲引擎
- 要求表具有主鍵或唯一非空字段
- 必須啟用GTID
- 多主模式下不支持SERIALIZABLE隔離級別
- 節(jié)點數(shù)量上限9個
- 網(wǎng)絡(luò)延遲影響性能
-
MGR與傳統(tǒng)復(fù)制的區(qū)別
MGR與傳統(tǒng)復(fù)制的區(qū)別.jpg
InnoDB Cluster部署
-
部署的架構(gòu)介紹
部署的架構(gòu)介紹.jpg
在生產(chǎn)環(huán)境建議每臺機器都不熟MySQL shell,MySQL router 單獨搭一套高可用環(huán)境
準(zhǔn)備階段
- 修改hosts
# 在三臺機器
vim /etc/hosts
# 新增配置
192.168.12.165 martin-05
192.168.12.166 martin-06
192.168.12.167 martin-07
- 安裝MySQL并修改配置
# 安裝好三臺MySQL后,修改配置文件server-id 不一樣
vim /data/mysql/conf/my.cnf
server-id = 12165
# 確認gtid開啟,Binlog開啟
# 新增參數(shù)
# LOGICAL_CLOCK 表示基于事務(wù)間的沖突關(guān)系來決定哪些事務(wù)可以并行執(zhí)行,在MGR中建議設(shè)置為 LOGICAL_CLOCK
slave_parallel_type=LOGICAL_CLOCK
# 表示用于生成事務(wù)寫集的哈希算法,XXHASH64 一種高新能的哈希算法
transaction_write_set_extraction=XXHASH64
# 表示二進制日志事務(wù)依賴跟蹤的模式,WRITESET表示基于寫集來跟蹤
binlog_transaction_dependency_tracking=WRITESET
# 表示確保從服務(wù)上的事務(wù)與主服務(wù)器上的相同順序來提交,在MGR中建議設(shè)置為1
slave_preserve_commit_order=l
# 表示要禁用哪些存儲引擎,禁用一些不支持事務(wù)的存儲引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 表示是否對有super權(quán)限的用戶也禁止執(zhí)行寫操作,off不禁止,在MGR中建議設(shè)置為off
super-read-only=off
#組復(fù)制相關(guān)參數(shù)
# 服務(wù)器啟動時是否自動啟動組復(fù)制
group_replication_start_on_boot=off
# 當(dāng)前實例用于組通信的本地地址,此配置三臺機器要不一樣
group_replication_local_address="martin-05:33061"
# 所有成員的地址
group_replication_group_seeds="martin-05:33061,martin-06:33061,martin-07:33061"
# on 表示以這臺服務(wù)器來引導(dǎo)這個組,只能在一臺服務(wù)器設(shè)置為on,一般建議設(shè)置為off
group_replication_bootstrap_group=off
#Plugin
# 表示增加插件
plugin-load-add="mysql_clone.so;group_replication.so"
clone=FORCE_PLUS_PERMANENT
# 重啟
/etc/init.d/mysql.server start
- 安裝MySQL Shell
選擇版本和系統(tǒng)
MySQL Shell的官網(wǎng)下載鏈接
# 在第三臺機器安裝MySQL Shell,可以安裝和管理MGR
cd /usr/src/
wget xxxxxxxx
yum install mysql-shell-8.0.25-1.el7.x86_64.rpm -y
# 測試是否安裝成功
mysqlsh --version
安裝階段
- 創(chuàng)建集群用戶
# 在每臺機器的mysql內(nèi)創(chuàng)建用戶和權(quán)限
create user 'mgr_user'@'%' identified by '123456';
GRANT CLONE_ADMIN, CONNECTION_ADMIN, CREATE USER, EXECUTE, FILE, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SELECT, SHUTDOWN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'mgr_user'@'%' WITH GRANT OPTION;
- 用MySQL Shell創(chuàng)建MGR集群
# 在第一臺機器
# -h192.168.12.165 這一臺機器的ip地址
mysqlsh -umgr_user -p'123456' -h192.168.12.165
# 創(chuàng)建集群, Cluster01集群名字
dba.createCluster('Cluster01')
# 退出重新登陸
mysqlsh -umgr_user -p'123456' -h192.168.12.165
# 執(zhí)行
var cluster = dba.getCluster('Cluster01');
- 加入其他節(jié)點
cluster.addInstance('mgr_user@192.168.12.166:3306')
# 輸入C
# 更新集群內(nèi)元數(shù)據(jù)信息
cluster.rescan()
# 輸入y
# 查看集群信息
cluster.status()
# 加入第二臺MySQL
cluster.addInstance('mgr_user@192.168.12.167:3306')
# 輸入C
# 更新集群內(nèi)元數(shù)據(jù)信息
cluster.rescan()
# 輸入y
# 查看集群信息
cluster.status()
測試階段
- MySQL Router安裝
選擇版本和系統(tǒng)
MySQL Router的官網(wǎng)下載鏈接
wget xxx
yum install mysql-router-ccommunity-8.0.25-l.el.x86_64.rpm -y
- 生成Router配置文件
mkdir /data/mysqlroute
mysqlrouter -B mgr_user@192.168.12.165:3306 --directory=/data/mysqlroute -u root --force
- 啟動MySQL Router并測試
/data/mysqlroute/start.sh
# 測試 ,-P6446 讀寫端口,-P6447讀端口
mysql -umgr_user -p'123456' -P6446 -h192.168.12.165 -e "select @@hostname"
mysql -umgr_user -p'123456' -P6447 -h192.168.12.165 -e "select @@hostname"
InnoDB Cluster管理命令
- 查看集群狀態(tài)
mysqlsh -umgr_user -p'123456' -h192.168.12.165
# 定義集群變量
var cluster = dba.getCluster('Cluster01')
cluster.status()
- 顯示集群結(jié)構(gòu)
cluster.describe();
- 顯示集群配置選項
cluster.options()
- 刪除和增加成員
cluster.status()
cluster.removeInstance('mgr_user@martin-07:3306')
cluster.status()
# 增加成員
cluster.addInstance('mgr_user@martin-07:3306')
cluster.status()
- 手動切換主節(jié)點
cluster.setPrimaryInstance('martin-07:3306')
cluster.status()
- 顯示復(fù)制統(tǒng)計信息
# 在隨便每個MySQL實例執(zhí)行
select * from performance_schema.replication_group_member_stats;
- 關(guān)閉組復(fù)制
# 登錄到具體的節(jié)點上
stop group_replication;
# 再回到MySQL Shell查看集群狀態(tài)
cluster.status()
- 啟動組復(fù)制
start group_replication;
# 再回到MySQL Shell查看集群狀態(tài)
cluster.status()
- 切換成多主模式
cluster.switchToMultiPrimaryMode()
- 切換成單主模式
cluster.switchToSinglePrimaryMode('martin-05:3306')
cluster.status()
- 查看集群成員信息
# 在隨便一個MySQL實例執(zhí)行
select * from performance_schema.replication_group_members;
- 列出和集群相關(guān)的Router實例
cluster.listRouters()
InnoDB Cluster高可用測試
- 編輯并允許數(shù)據(jù)寫入腳本
- 查看集群狀態(tài)
- 停掉primary節(jié)點
- 啟動關(guān)閉的節(jié)點
- 關(guān)閉primary節(jié)點所在的機器
- 啟動關(guān)閉的機器
MGR事務(wù)同步原理
- 事務(wù)在MGR中的執(zhí)行流程
- 事務(wù)執(zhí)行
- 提交和二進制日志寫入
- 事務(wù)打包和發(fā)送
- 全局排序和沖突檢測
- 各節(jié)點確認
- 異步應(yīng)用
- 完成事務(wù)
- MGR沖突檢測機制
- write set計算與沖突檢測
- 檢查事務(wù)執(zhí)行過程中的GTID
- GTID集合比較
- 提交事務(wù)
- MGR一致性選項
group_replication_consistency的配置 | 對應(yīng)的一致性級別 |
---|---|
EVENTUAL | 事務(wù)提交后會廣播到集群的多數(shù)節(jié)點,然后節(jié)點檢查是否有沖突,如果沒有沖突,則事務(wù)在本地提交,其他節(jié)點異步處理,可能導(dǎo)致讀取到稍舊的數(shù)據(jù) |
BEFORE_ON_PRIMARY_FAILOVER | 在主節(jié)點故障時,必須等待新主處理完待處理的事務(wù),才能開始響應(yīng)業(yè)務(wù)的讀寫請求,這樣可以保證業(yè)務(wù)讀寫請求不會讀取到舊數(shù)據(jù) |
BEFORE | 一個事務(wù)會等待之前的事務(wù)執(zhí)行完后再開始執(zhí)行,確保讀取到的數(shù)據(jù)是最新的。 |
AFTER | 寫事務(wù)會等待其更改在所有其他節(jié)點應(yīng)用后才提交,保證后續(xù)事務(wù)讀取已寫入或其他節(jié)點上最新值。對只讀事務(wù)沒有影響 |
BEFORE_AND_AFTER | 會等待之前的事務(wù)執(zhí)行完后才開始執(zhí)行新事物,并等到事務(wù)在所有節(jié)點應(yīng)用后才提交,確保讀取和提交都具有強一致性。 |
- MGR事務(wù)一致性的選擇
- 在通常情況下,不建議設(shè)置為AFTER模式
- 選擇BEFOR模式的場景
- 選擇BEFORE_AND_AFTER模式的場景
- MGR事務(wù)一致性的修改
- 查看當(dāng)前會話的一致性級別
mysql -uroot -p
select @@session.group_replication_consistency;
- 修改當(dāng)前會話的一致性級別
set @@session.group_replication_consistency='BEFORE';
- 修改全局的一致性級別
set @@global.group_replication_consistency='BEFORE';
MGR故障檢測和選主算法
-
MGR故障檢測
MGR故障檢測.jpg MGR選主算法
- 哪個節(jié)點運行的是最低的MySQL版本
- 哪個節(jié)點的權(quán)重最高
# 0 ~ 100
show global variables like "group_replication_member_weight"
- 哪個節(jié)點的UUID排序最靠前
- MGR故障轉(zhuǎn)移
- 可靠性優(yōu)先
- 可用性優(yōu)先
- 如何設(shè)置可靠性優(yōu)先
show global variables like "group_replication_consistency";
MGR流控
- 流控的作用
- 平衡節(jié)點處理速度差異
- 維持數(shù)據(jù)一致性和避免沖突
- 避免節(jié)點超載和維持整體穩(wěn)定性
- 如何開啟流控
- group_replication_flow_control_mode值設(shè)置為QUOTA
show global variables like "group_replication_flow_control_mode";
- 認證隊列中等待的事務(wù)數(shù)超過group_replication_flow_control_certifier_threshold參數(shù)配置的值時
# 查看認證隊列中等待的事務(wù)數(shù)
select member_id,count_transactions_in_queue from performance_schema.replication_group_member_stats;
show global variables like "group_replication_flow_control_certifier_threshold";
- 應(yīng)用程序隊列中等待的事務(wù)數(shù)超過group_replication_flow_control_applier_threshold參數(shù)配置的值時
# 查看應(yīng)用程序隊列中等待的事務(wù)數(shù)
select member_id,count_transactions_in_applier_queue from performance_schema.replication_group_member_stats;
show global variables like "group_replication_flow_control_applier_threshold";