MYSQL 8 發佈有一段時間了,關於MGR 哦不現在叫MGR,雅緻的名字 innodb cluster 的官方解決方案也是有一段時間了。雖然解決方案不止這個,但官方的方案還是要熟悉瞭解的。(注意:一定要用官方的社區版,如果使用percona最新的8.019版本依然在使用 mysqlsh 會報用戶權限的錯誤,但這個錯誤是在官方版本8.014發生的問題,所以使用官方的解決方案,需要配合官方的社區版,另外使用 MYSQL 8.019的percona版本用傳統方式安裝也會有問題,唉)
基本上用了半天的時間,研究了mysql shell 的方式安裝,也看了很多其他的文章,但實際上基本按照上面去做,成功的概率......
下面是踩坑實錄
以下安裝環境均已官方社區最新版 8.019為基準
【實驗環境
192.168.198.100
192.168.198.101
192.168.198.102
】
當然官方的架構圖如下
作為計劃的一部分 mysql shell 除了上次講的主要的功能,還有一個上次沒有說的,就是對集群的管理和安裝。
在使用mysql shell 之前還要給你的帳號(這裡我們用 admin),賦予相關的權限,否則是無法進行工作的,如果不賦予相關的權限,mysql shell也會在你使用的時候,報錯。(這裡僅僅是指安裝集群時)
下面是相關的權限。
CREATE USER admin@'%' identified by 'admin';
GRANT BACKUP_ADMIN, CLONE_ADMIN, CREATE USER, EXECUTE, FILE, PERSIST_RO_VARIABLES_ADMIN, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHUTDOWN, SUPER, SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'%' WITH GRANT OPTION;GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'admin'@'%' 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 'admin'@'%' 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 'admin'@'%' 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 'admin'@'%' WITH GRANT OPTION;
以上的帳號也是我們在操作mysql innodb cluster 的帳號
直接下載mysqlshell 的rpm 安裝包,直接鍵入 mysqlsh ,每臺MYSQL 都要安裝,以後如果採用這一方案 mysql shell 將是你必要的工具
就進入到了mysql shell ,其中mysql shell中有很多關於DBA 的命令集合,可以看出,這些命令基本都是圍繞我們的 innodb cluster
checkInstanceConfiguration()
createReplicaSet()
getReplicaSet()
stopSandboxInstance()configureInstance()
deleteSandboxInstance()
help()
upgradeMetadata()configureLocalInstance()
deploySandboxInstance()
killSandboxInstance() configureReplicaSetInstance()
dropMetadataSchema()
rebootClusterFromCompleteOutage()createCluster()
getCluster()
startSandboxInstance()
1 我們先對我們的單機的 mysql 進行檢查,看看我們的配置哪裡還有問題(針對innodb cluster)
dba.checkInstanceConfiguration('[email protected]:3306')
我們可以很明顯的看出來,我當前如果要使用 innodb cluster 中在配置有一個錯誤,我的 binlog_checksum 當前的設置是有問題的。我需要將其改為none
三臺機器,在均ok的情況下,可以進行下一步的配置 (當然這裡很可能有不會OK ,可能的問題 ,GTID 開沒有開, 你設置那個帳號是要進行innodb cluster 集群操作的帳號,權限是否有,你的 enforce_gtid_consistency 開沒有看,如果這些都不知道,建議先百度一下)
這裡假設,你一切都是OK 的
我們直接通過剛才 admin 帳號來進行操作,進入mysqlsh
通過 \\connect 命令來連接進來你的第一個 mysql innodb cluster ,這裡我連接了100
dba.createCluster('cluster') 通過這個命令我們開始建立我們的 innodb cluster
var cluster = dba.getCluster()cluster.status()
目前到這裡是一切OK ,坑就就在下面了,而且看了一輪文章,包括中文的,英文的,一概不談。
按照文檔,下面我們直接使用cluster.addInstance('admin@mgr2:3306'),將第二個節點加入到集群中。
報錯了,原因也找到了,是我其中一臺機器和其他的機器(primary 和standby 的小版本不同導致,雖然都是8.019,但percona 和 社區版是無法之間是無法使用 clone的功能的)。
OK 我們將所有的節點都更換成,官方的社區版,再次添加節點,依然報錯
卡在哪裡,卡在clone 裡,這也是最浪費時間的排錯的問題,因為無論在官方的文檔,還是第三方的中文,英文的文檔都沒有談這個問題,所以耗費了一點時間。
實際上我們只要在standby節點做以下兩個工作即可(按正常的邏輯說,系統是應該在操作clone之前判斷的,但實際上,根本沒有,導致操作的過程系統是克隆了,但對方的機器根本不接受這個clone的文件)
INSTALL PLUGIN clone SONAME 'mysql_clone.so';SET GLOBAL clone_valid_donor_list = 'mgr1:3306';
關鍵就是差者兩句,應該是所有的節點都要安裝插件,然後需要在standby節點設置,允許standby節點能接受來自mgr1節點的數據,否則無法添加節點,進入到集群中。做完這兩句在mgr 2 mgr 3 後,整體的工作就很順利了。
所以到此為止,我的集群通過mysql shell 的方式來安裝是成功的。
整體的感官就是MYSQL 的集群安裝通過mysql shell的方式來安裝,很方便,但你要有一些基本的知識
1 JS 的簡單語法
2 CLONE 的基本知識
否則你的安裝很難順利。
當然上面的安裝整體的過程,以及後續的故障轉移過程,上面的方式還會有漏洞。
1 需要設置整體集群的clone 的參數設置,這樣在故障轉移時就會遊刃有餘
2 每個節點要添加除自己以外的所有節點的 clone_valid_donor_list 否則故障轉移成功後,故障節點重新加入不會那麼順利。
另外根據以上操作,以後通過mysqlshell + 程序的方式來對 INNODB CLUSTER 進行管理,將比以前管理MYSQL 的集群要方便,並且可以進行更多的高度自動化。
對8.017的clone 功能不熟悉的可以按去年的一篇,下方鏈接
https://mp.weixin.qq.com/s?__biz=Mzg4NDA0NTEwNA==&mid=2247487298&idx=1&sn=68cac3a74b2c19479e8792a0810bd606&chksm=cfbf6b1df8c8e20b69e6d19fede969a31d010dc069fb38862bd01c1294942a7c813eeb8b89e0&token=1927311027&lang=zh_CN#rd
閱讀更多 Austin的數據庫 的文章