天天看點

一分鐘搭建MySQL InnoDB Cluster高可用叢集

作者:spbdev

1、為什麼需要叢集

單台資料庫伺服器存在并發能力低、存在單點故障風險等局限,叢集能夠很好的通過多台伺服器的協作,實作互為主備、高可用/故障轉移、負載均衡、讀寫分離等特性。

MySQL InnoDB Cluster叢集基于MGR(MySQL Group Replication,MySQL組複制)技術,支援單主(Single-Primary)和多主(Multi-Primary)兩種模式,且可以随時切換。叢集中隻有主節點可以讀寫,從節點隻讀,是以單主模式适合做讀寫分離;多主模式因為每個節點都是主節點,是以隻要做負載均衡就可以了。

一分鐘搭建MySQL InnoDB Cluster高可用叢集

2、快速搭建InnoDB Cluster叢集

2.1、預備知識

配置InnoDB Cluster需要借助工具MySQL Shell,主要涉及Shell的兩個對象:dba和cluster,可以通過以下語句擷取幫助:

\h dba
\h cluster
cluster.help(<方法名>) //要先var cluster=dba.getCluster([clusterName]);           

2.2、搭建叢集

作業系統選擇ubuntu server22.04LTS,用其他linux系統請自行轉換安裝指令。

# 下載下傳安裝mysql server,以下指令在每台伺服器執行
sudo apt install -y mysql-server
# 修改bind_address為0.0.0.0或本機IP;修改server_id值,每個節點唯一即可
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
# 添加以下3行配置
binlog_transaction_dependency_tracking = WRITESET
enforce_gtid_consistency                           = ON
gtid_mode                                                  = ON
# 重新開機生效
sudo systemctl restart mysql
# 下載下傳安裝mysql-shell
sudo wget -4 --no-check-certificate https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell_8.0.32-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-shell_8.0.32-1ubuntu22.04_amd64.deb
# 啟動mysql shell,注意-S參數預設值是/var/lib/mysql/mysql.sock,檔案不存在
sudo mysqlsh --mysql -u icadmin -S /var/run/mysqld/mysqld.sock
# 檢查資料庫是否已為InnoDB Cluster進行了必要的配置,包括賬戶
dba.configureInstance()
# 按互動提示,選Create a new admin account,建立賬戶(icadmin密碼icadmin123!)
# 退出,并用剛剛建立的賬戶icadmin重新登入mysqlsh
\quit
sudo mysqlsh --mysql -u icadmin -S /var/run/mysqld/mysqld.sock
# 開啟配置持久化
dba.configureLocalInstance()

# 以下指令在主節點執行(任選一台作為主節點)即可,其它節點不執行
# 建立叢集。如果退出mysqlsh重登入,可以var cluster = dba.getCluster('testCluster')
var cluster = dba.createCluster('testCluster')
# 添加其它節點,例如mysql2、mysql3,注意必須在已加入(而非待加入)叢集的節點執行
cluster.addInstance('icadmin@mysql2')
cluster.addInstance('icadmin@mysql3')
# 檢視叢集狀态
cluster.status()
# 檢視指定節點的狀态
cluster.checkInstanceState('icadmin@mysql3')           

完成以上操作,叢集就搭建起來了,這是一個單主叢集,可以在主節點建立資料庫、表、插入資料,在從節點檢視是否同步過來了,驗證效果。

2.3、單主和多主模式切換

要切換單主和多主模式也很簡單,通過mysql shell一行指令就可以切換:

# 切換叢集到Multi-Primary模式
Cluster.switchToMultiPrimaryMode()
# 切換叢集到Single-Primary模式,[instance]參數可選,例如:'icadmin@mysql2'
Cluster.switchToSinglePrimaryMode([instance])           

2.4、叢集管理

常用的管理功能還包括移除節點、節點重新加入叢集、切換主節點、解散叢集等,如下:

# 将叢集節點從叢集移除。Instance格式為<user>@<host>[:<port>],例如icadmin@mysql3
Cluster.removeInstance(<instance>)
# 節點重新加入叢集
Cluster.rejoinInstance(<instance>)
# 切換主節點
Cluster. setPrimaryInstance(instance[, options])
# 切換叢集到Multi-Primary模式
Cluster.switchToMultiPrimaryMode()
# 切換叢集到Single-Primary模式
Cluster.switchToSinglePrimaryMode([instance])
# 解散叢集
Cluster.dissolve()           

2.5、高可用和負載均衡

  • 單主模式

可以配合MySQL Router實作高可用和負載均衡,MySQL Router相當于一個透明代理,用戶端通路MySQL Router,由MySQL Router将請求分流到不同伺服器節點實作負載均衡;如果某節點故障,MySQL Router會自動将請求分流到其它可用節點,實作故障轉移。

具體配置和使用這裡就不詳述了。

  • 多主模式

多主模式每個節點都可以讀寫,是以代理就有很多選擇了,比如MySQL Router、四層反向代理(LVS、Nginx等),這裡也不多講了。

繼續閱讀