MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第1张图片

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 这坑踩得_第2张图片

作为计划的一部分 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 这坑踩得_第3张图片

就进入到了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 这坑踩得_第4张图片

我们可以很明显的看出来,我当前如果要使用 innodb cluster 中在配置有一个错误,我的 binlog_checksum 当前的设置是有问题的。我需要将其改为none

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第5张图片

三台机器,在均ok的情况下,可以进行下一步的配置 (当然这里很可能有不会OK ,可能的问题 ,GTID 开没有开, 你设置那个帐号是要进行innodb cluster 集群操作的帐号,权限是否有,你的 enforce_gtid_consistency 开没有看,如果这些都不知道,建议先百度一下)

这里假设,你一切都是OK 的

我们直接通过刚才 admin 帐号来进行操作,进入mysqlsh 

通过 \connect 命令来连接进来你的第一个  mysql  innodb cluster ,这里我连接了100

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第6张图片

dba.createCluster('cluster')    通过这个命令我们开始建立我们的 innodb cluster

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第7张图片

var cluster = dba.getCluster()
cluster.status()


MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第8张图片

目前到这里是一切OK ,坑就就在下面了,而且看了一轮文章,包括中文的,英文的,一概不谈。

按照文档,下面我们直接使用cluster.addInstance('admin@mgr2:3306'),将第二个节点加入到集群中。

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第9张图片

报错了,原因也找到了,是我其中一台机器和其他的机器(primary 和standby 的小版本不同导致,虽然都是8.019,但percona 和 社区版是无法之间是无法使用 clone的功能的)。

OK 我们将所有的节点都更换成,官方的社区版,再次添加节点,依然报错

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第10张图片

卡在哪里,卡在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 这坑踩得_第11张图片

所以到此为止,我的集群通过mysql shell 的方式来安装是成功的。

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第12张图片

整体的感官就是MYSQL 的集群安装通过mysql shell的方式来安装,很方便,但你要有一些基本的知识

1 JS 的简单语法

2 CLONE 的基本知识

否则你的安装很难顺利。

当然上面的安装整体的过程,以及后续的故障转移过程,上面的方式还会有漏洞。

1 需要设置整体集群的clone 的参数设置,这样在故障转移时就会游刃有余

2 每个节点要添加除自己以外的所有节点的 clone_valid_donor_list 否则故障转移成功后,故障节点重新加入不会那么顺利。

另外根据以上操作,以后通过mysqlshell + 程序的方式来对 INNODB CLUSTER 进行管理,将比以前管理MYSQL 的集群要方便,并且可以进行更多的高度自动化。

对8.017的clone 功能不熟悉的可以按去年的一篇,下方链接

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第13张图片

https://mp.weixin.qq.com/s?__biz=Mzg4NDA0NTEwNA==&mid=2247487298&idx=1&sn=68cac3a74b2c19479e8792a0810bd606&chksm=cfbf6b1df8c8e20b69e6d19fede969a31d010dc069fb38862bd01c1294942a7c813eeb8b89e0&token=1927311027&lang=zh_CN#rd

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第14张图片

MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得_第15张图片

你可能感兴趣的:(MYSQL 利用 MYSQL Shell 安装 INNODB Cluster 这坑踩得)