DBA數據庫筆記之(十一)MySQL高可用方案之InnoDB Cluster

詳解InnoDB Cluster

  • InnoDB Cluster組件介紹


    InnoDB Cluster組件介紹.jpg
  • MGR的兩種模式

  1. 單主模式

自動選出一個主,每次只能接受一個節(jié)點的更新深碱。生成環(huán)境建議使用單主模式

  1. 多主模式

所有節(jié)點都可以更新嗤谚,并且可以并發(fā)更新

  • MGR的主要特點
  1. 彈性復制
  2. 多寫能力
  3. 自動故障轉移
  • MGR的主要限制
  1. 僅支持InnoDB存儲引擎
  2. 要求表具有主鍵或唯一非空字段
  3. 必須啟用GTID
  4. 多主模式下不支持SERIALIZABLE隔離級別
  5. 節(jié)點數量上限9個
  6. 網絡延遲影響性能
  • MGR與傳統(tǒng)復制的區(qū)別


    MGR與傳統(tǒng)復制的區(qū)別.jpg

InnoDB Cluster部署

  • 部署的架構介紹


    部署的架構介紹.jpg

在生產環(huán)境建議每臺機器都不熟MySQL shell棺蛛,MySQL router 單獨搭一套高可用環(huá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開啟

# 新增參數

# LOGICAL_CLOCK 表示基于事務間的沖突關系來決定哪些事務可以并行執(zhí)行,在MGR中建議設置為 LOGICAL_CLOCK
slave_parallel_type=LOGICAL_CLOCK
# 表示用于生成事務寫集的哈希算法桦踊,XXHASH64 一種高新能的哈希算法
transaction_write_set_extraction=XXHASH64
# 表示二進制日志事務依賴跟蹤的模式椅野,WRITESET表示基于寫集來跟蹤
binlog_transaction_dependency_tracking=WRITESET

# 表示確保從服務上的事務與主服務器上的相同順序來提交,在MGR中建議設置為1
slave_preserve_commit_order=l
# 表示要禁用哪些存儲引擎籍胯,禁用一些不支持事務的存儲引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 表示是否對有super權限的用戶也禁止執(zhí)行寫操作竟闪,off不禁止,在MGR中建議設置為off
super-read-only=off

#組復制相關參數

# 服務器啟動時是否自動啟動組復制
group_replication_start_on_boot=off
# 當前實例用于組通信的本地地址杖狼,此配置三臺機器要不一樣
group_replication_local_address="martin-05:33061"
# 所有成員的地址
group_replication_group_seeds="martin-05:33061,martin-06:33061,martin-07:33061"
# on 表示以這臺服務器來引導這個組炼蛤,只能在一臺服務器設置為on,一般建議設置為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的官網下載鏈接

# 在第三臺機器安裝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內創(chuàng)建用戶和權限
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

# 更新集群內元數據信息
cluster.rescan()
# 輸入y

# 查看集群信息
cluster.status()


# 加入第二臺MySQL
cluster.addInstance('mgr_user@192.168.12.167:3306')
# 輸入C

# 更新集群內元數據信息
cluster.rescan()
# 輸入y

# 查看集群信息
cluster.status()

測試階段

  • MySQL Router安裝

選擇版本和系統(tǒng)
MySQL Router的官網下載鏈接

 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()
  • 顯示集群結構
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()
  • 顯示復制統(tǒng)計信息
# 在隨便每個MySQL實例執(zhí)行
select * from performance_schema.replication_group_member_stats;
  • 關閉組復制
# 登錄到具體的節(jié)點上
stop group_replication;

# 再回到MySQL Shell查看集群狀態(tài)
cluster.status()
  • 啟動組復制
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;
  • 列出和集群相關的Router實例
cluster.listRouters()

InnoDB Cluster高可用測試

  1. 編輯并允許數據寫入腳本
  2. 查看集群狀態(tài)
  3. 停掉primary節(jié)點
  4. 啟動關閉的節(jié)點
  5. 關閉primary節(jié)點所在的機器
  6. 啟動關閉的機器

MGR事務同步原理

  • 事務在MGR中的執(zhí)行流程
  1. 事務執(zhí)行
  2. 提交和二進制日志寫入
  3. 事務打包和發(fā)送
  4. 全局排序和沖突檢測
  5. 各節(jié)點確認
  6. 異步應用
  7. 完成事務
  • MGR沖突檢測機制
  1. write set計算與沖突檢測
  2. 檢查事務執(zhí)行過程中的GTID
  3. GTID集合比較
  4. 提交事務
  • MGR一致性選項
group_replication_consistency的配置 對應的一致性級別
EVENTUAL 事務提交后會廣播到集群的多數節(jié)點,然后節(jié)點檢查是否有沖突绿聘,如果沒有沖突嗽上,則事務在本地提交,其他節(jié)點異步處理熄攘,可能導致讀取到稍舊的數據
BEFORE_ON_PRIMARY_FAILOVER 在主節(jié)點故障時兽愤,必須等待新主處理完待處理的事務,才能開始響應業(yè)務的讀寫請求,這樣可以保證業(yè)務讀寫請求不會讀取到舊數據
BEFORE 一個事務會等待之前的事務執(zhí)行完后再開始執(zhí)行浅萧,確保讀取到的數據是最新的逐沙。
AFTER 寫事務會等待其更改在所有其他節(jié)點應用后才提交,保證后續(xù)事務讀取已寫入或其他節(jié)點上最新值洼畅。對只讀事務沒有影響
BEFORE_AND_AFTER 會等待之前的事務執(zhí)行完后才開始執(zhí)行新事物酱吝,并等到事務在所有節(jié)點應用后才提交,確保讀取和提交都具有強一致性土思。
  • MGR事務一致性的選擇
  1. 在通常情況下务热,不建議設置為AFTER模式
  2. 選擇BEFOR模式的場景
  3. 選擇BEFORE_AND_AFTER模式的場景
  • MGR事務一致性的修改
  1. 查看當前會話的一致性級別
mysql -uroot -p
select @@session.group_replication_consistency;
  1. 修改當前會話的一致性級別
set @@session.group_replication_consistency='BEFORE';
  1. 修改全局的一致性級別
set @@global.group_replication_consistency='BEFORE';

MGR故障檢測和選主算法

  • MGR故障檢測


    MGR故障檢測.jpg
  • MGR選主算法

  1. 哪個節(jié)點運行的是最低的MySQL版本
  2. 哪個節(jié)點的權重最高
# 0 ~ 100
show global variables like "group_replication_member_weight"
  1. 哪個節(jié)點的UUID排序最靠前
  • MGR故障轉移
  1. 可靠性優(yōu)先
  2. 可用性優(yōu)先
  3. 如何設置可靠性優(yōu)先
show global variables like "group_replication_consistency";

MGR流控

  • 流控的作用
  1. 平衡節(jié)點處理速度差異
  2. 維持數據一致性和避免沖突
  3. 避免節(jié)點超載和維持整體穩(wěn)定性
  • 如何開啟流控
  1. group_replication_flow_control_mode值設置為QUOTA
show global variables like "group_replication_flow_control_mode";
  1. 認證隊列中等待的事務數超過group_replication_flow_control_certifier_threshold參數配置的值時
# 查看認證隊列中等待的事務數
select member_id,count_transactions_in_queue from performance_schema.replication_group_member_stats;

show global variables like "group_replication_flow_control_certifier_threshold";
  1. 應用程序隊列中等待的事務數超過group_replication_flow_control_applier_threshold參數配置的值時
# 查看應用程序隊列中等待的事務數
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";
?著作權歸作者所有,轉載或內容合作請聯系作者
禁止轉載,如需轉載請通過簡信或評論聯系作者己儒。
  • 序言:七十年代末崎岂,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子闪湾,更是在濱河造成了極大的恐慌冲甘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異备蚓,居然都是意外死亡默责,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門陶夜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裆站,你說我怎么就攤上這事条辟。” “怎么了宏胯?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵羽嫡,是天一觀的道長。 經常有香客問我肩袍,道長杭棵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任氛赐,我火速辦了婚禮魂爪,結果婚禮上,老公的妹妹穿的比我還像新娘鹰祸。我一直安慰自己甫窟,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布蛙婴。 她就那樣靜靜地躺著粗井,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浇衬,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天懒构,我揣著相機與錄音,去河邊找鬼耘擂。 笑死胆剧,一個胖子當著我的面吹牛,可吹牛的內容都是我干的醉冤。 我是一名探鬼主播秩霍,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚁阳!你這毒婦竟也來了铃绒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤螺捐,失蹤者是張志新(化名)和其女友劉穎颠悬,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體定血,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡赔癌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了澜沟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灾票。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖倔喂,靈堂內的尸體忽然破棺而出铝条,到底是詐尸還是另有隱情,我是刑警寧澤席噩,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贤壁,受9級特大地震影響悼枢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜脾拆,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一馒索、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧名船,春花似錦绰上、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春百揭,著一層夾襖步出監(jiān)牢的瞬間爽哎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工器一, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留课锌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓祈秕,卻偏偏與公主長得像渺贤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子请毛,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容