1、為什么需要集群
單臺數據庫服務器存在并發能力低、存在單點故障風險等局限,集群能夠很好的通過多臺服務器的協作,實現互為主備、高可用/故障轉移、負載均衡、讀寫分離等特性。
MySQL InnoDB Cluster集群基于MGR(MySQL Group Replication,MySQL組復制)技術,支持單主(Single-Primary)和多主(Multi-Primary)兩種模式,且可以隨時切換。集群中只有主節點可以讀寫,從節點只讀,所以單主模式適合做讀寫分離;多主模式因為每個節點都是主節點,所以只要做負載均衡就可以了。
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等),這里也不多講了。