天天看點

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

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 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

作為計劃的一部分 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 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

就進入到了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')

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

我們可以很明顯的看出來,我目前如果要使用 innodb cluster 中在配置有一個錯誤,我的 binlog_checksum 目前的設定是有問題的。我需要将其改為none

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

三台機器,在均ok的情況下,可以進行下一步的配置 (當然這裡很可能有不會OK ,可能的問題 ,GTID 開沒有開, 你設定那個帳号是要進行innodb cluster 叢集操作的帳号,權限是否有,你的 enforce_gtid_consistency 開沒有看,如果這些都不知道,建議先百度一下)

這裡假設,你一切都是OK 的

我們直接通過剛才 admin 帳号來進行操作,進入mysqlsh

通過 \connect 指令來連接配接進來你的第一個 mysql innodb cluster ,這裡我連接配接了100

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

dba.createCluster('cluster') 通過這個指令我們開始建立我們的 innodb cluster

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

var cluster = dba.getCluster()

cluster.status()

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

目前到這裡是一切OK ,坑就就在下面了,而且看了一輪文章,包括中文的,英文的,一概不談。

按照文檔,下面我們直接使用cluster.addInstance('admin@mgr2:3306'),将第二個節點加入到叢集中。

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

報錯了,原因也找到了,是我其中一台機器和其他的機器(primary 和standby 的小版本不同導緻,雖然都是8.019,但percona 和 社群版是無法之間是無法使用 clone的功能的)。

OK 我們将所有的節點都更換成,官方的社群版,再次添加節點,依然報錯

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

卡在哪裡,卡在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 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

是以到此為止,我的叢集通過mysql shell 的方式來安裝是成功的。

MYSQL 利用 MYSQL Shell 安裝 INNODB Cluster 這坑踩得

整體的感官就是MYSQL 的叢集安裝通過mysql shell的方式來安裝,很友善,但你要有一些基本的知識

1 JS 的簡單文法

2 CLONE 的基本知識

否則你的安裝很難順利。

當然上面的安裝整體的過程,以及後續的故障轉移過程,上面的方式還會有漏洞。

1 需要設定整體叢集的clone 的參數設定,這樣在故障轉移時就會遊刃有餘

2 每個節點要添加除自己以外的所有節點的 clone_valid_donor_list 否則故障轉移成功後,故障節點重新加入不會那麼順利。

另外根據以上操作,以後通過mysqlshell + 程式的方式來對 INNODB CLUSTER 進行管理,将比以前管理MYSQL 的叢集要友善,并且可以進行更多的高度自動化。