利用MySQL Shell安装部署MGR集群的详细过程
来源:脚本之家
时间:2022-12-28 12:59:27 346浏览 收藏
本篇文章向大家介绍《利用MySQL Shell安装部署MGR集群的详细过程》,主要包括MySQLShell、MGR、集群,具有一定的参考价值,需要的朋友可以参考一下。
本文介绍如何利用MySQL Shell + GreatSQL 8.0.25构建一个三节点的MGR集群。
MySQL Shell是一个客户端工具,可用于方便管理和操作MySQL,支持SQL、JavaScript、Python等多种语言,也包括完善的API。MySQL Shell支持文档型和关系型数据库模式,通过X DevAPI可以管理文档型数据,通过AdminAPI可以管理InnoDB Cluster、InnoDB ClusterSet及InnoDB ReplicaSet等。
1. 安装准备
准备好下面三台服务器:
IP | 端口 | 角色 |
---|---|---|
172.16.16.10 | 3306 | mgr1 |
172.16.16.11 | 3306 | mgr2 |
172.16.16.12 | 3306 | mgr3 |
确保三个节点间的网络是可以互通的,并且没有针对3306和33061端口的防火墙拦截规则。
利用yum安装MySQL Shell,版本选择和GreatSQL相同的8.0.25:
$ yum install mysql-shell-8.0.25
假定已经参考前文 3. 安装部署MGR集群 做好MySQL Server的初始化并启动三个实例。
接下来直接利用MySQL Shell部署MGR。
2. 利用MySQL Shell构建MGR集群
利用MySQL Shell构建MGR集群比较简单,主要有几个步骤:
- 检查实例是否满足条件。
- 创建并初始化一个集群。
- 逐个添加实例。
首先,用管理员账号 root 连接到第一个节点:
#在本地通过socket方式登入 $ mysqlsh -Spath/mysql.sock root@localhost Please provide the password for 'root@.%2Fmysql.sock': ******** Save password for 'root@.%2Fmysql.sock'? [Y]es/[N]o/Ne[v]er (default No): yes MySQL Shell 8.0.25 ...
执行命令 \status
查看当前节点的状态,确认连接正常可用。
执行 dba.configureInstance()
命令开始检查当前实例是否满足安装MGR集群的条件,如果不满足可以直接配置成为MGR集群的一个节点:
MySQL localhost JS > dba.configureInstance()
Configuring local MySQL instance listening at port 3306 for use in an InnoDB cluster...This instance reports its own address as 172.16.16.10:3306
#提示当前的用户是管理员,不能直接用于MGR集群,需要新建一个账号
ERROR: User 'root' can only connect from 'localhost'. New account(s) with proper source address specification to allow remote connection from all instances must be created to manage the cluster.
1) Create remotely usable account for 'root' with same grants and password
2) Create a new admin account for InnoDB cluster with minimal required grants
3) Ignore and continue
4) Cancel
Please select an option [1]: 2 Please provide an account name (e.g: icroot@%) to have it created with the necessary
privileges or leave empty and press Enter to cancel.
Account Name: GreatSQL
Password for new account: ********
Confirm password: ********
applierWorkerThreads will be set to the default value of 4.
The instance '172.16.16.10:3306' is valid to be used in an InnoDB cluster.
Cluster admin user 'GreatSQL'@'%' created.
The instance '172.16.16.10:3306' is already ready to be used in an InnoDB cluster.
Successfully enabled parallel appliers.
完成检查并创建完新用户后,退出当前的管理员账户,并用新创建的MGR专用账户登入,准备初始化创建一个新集群:
$ mysqlsh --uri GreatSQL@172.16.16.10:3306 Please provide the password for 'GreatSQL@172.16.16.10:3306': ******** Save password for 'GreatSQL@172.16.16.10:3306'? [Y]es/[N]o/Ne[v]er (default No): yes MySQL Shell 8.0.25 ... #定义一个变量名c,方便下面引用 MySQL 172.16.16.10:3306 ssl JS > var c = dba.createCluster('MGR1'); A new InnoDB cluster will be created on instance '172.16.16.10:3306'. Validating instance configuration at 172.16.16.10:3306... This instance reports its own address as 172.16.16.10:3306 Instance configuration is suitable. NOTE: Group Replication will communicate with other members using '172.16.16.10:33061'. Use the localAddress option to override. Creating InnoDB cluster 'MGR1' on '172.16.16.10:3306'... Adding Seed Instance... Cluster successfully created. Use Cluster.addInstance() to add MySQL instances. At least 3 instances are needed for the cluster to be able to withstand up to one server failure. MySQL 172.16.16.10:3306 ssl JS >
这就完成了MGR集群的初始化并加入第一个节点(引导节点)。
接下来,用同样方法先用 root 账号分别登入到另外两个节点,完成节点的检查并创建最小权限级别用户(此过程略过。。。注意各节点上创建的用户名、密码都要一致),之后回到第一个节点,执行 addInstance()
添加另外两个节点。
MySQL 172.16.16.10:3306 ssl JS > c.addInstance('GreatSQL@172.16.16.11:3306');
WARNING: A GTID set check of the MySQL instance at '172.16.16.11:3306' determined that it contains transactions that do not originate from the cluster, which must be discarded before it can join the cluster.
172.16.16.11:3306 has the following errant GTIDs that do not exist in the cluster:
b05c0838-6850-11ec-a06b-00155d064000:1
WARNING: Discarding these extra GTID events can either be done manually or by completely overwriting the state of 172.16.16.11:3306 with a physical snapshot from an existing cluster member. To use this method by default, set the 'recoveryMethod' option to 'clone'.
Having extra GTID events is not expected, and it is recommended to investigate this further and ensure that the data can be removed prior to choosing the clone recovery method.
Please select a recovery method [C]lone/[A]bort (default Abort): Clone Validating instance configuration at 172.16.16.11:3306...
This instance reports its own address as 172.16.16.11:3306
Instance configuration is suitable.
NOTE: Group Replication will communicate with other members using '172.16.16.11:33061'. Use the localAddress option to override.
A new instance will be added to the InnoDB cluster. Depending on the amount of
data on the cluster this might take from a few seconds to several hours.
Adding instance to the cluster...
Monitoring recovery process of the new cluster member. Press ^C to stop monitoring and let it continue in background.
Clone based state recovery is now in progress.
NOTE: A server restart is expected to happen as part of the clone process. If the
server does not support the RESTART command or does not come back after a
while, you may need to manually start it back.
* Waiting for clone to finish...
NOTE: 172.16.16.11:3306 is being cloned from 172.16.16.10:3306
** Stage DROP DATA: Completed
** Clone Transfer
FILE COPY ############################################################ 100% Completed
PAGE COPY ############################################################ 100% Completed
REDO COPY ############################################################ 100% Completed
NOTE: 172.16.16.11:3306 is shutting down... * Waiting for server restart... ready
* 172.16.16.11:3306 has restarted, waiting for clone to finish...
** Stage RESTART: Completed
* Clone process has finished: 72.43 MB transferred in about 1 second (~72.43 MB/s)
State recovery already finished for '172.16.16.11:3306'
The instance '172.16.16.11:3306' was successfully added to the cluster. MySQL 172.16.16.10:3306 ssl JS >
用同样的方法,将 172.16.16.12:3306 实例也加入到集群中。
现在,一个有这三节点的MGR集群已经部署完毕,来确认下:
MySQL 172.16.16.10:3306 ssl JS > c.describe() { "clusterName": "MGR1", "defaultReplicaSet": { "name": "default", "topology": [ { "address": "172.16.16.10:3306", "label": "172.16.16.10:3306", "role": "HA" }, "address": "172.16.16.11:3306", "label": "172.16.16.11:3306", "address": "172.16.16.12:3306", "label": "172.16.16.12:3306", } ], "topologyMode": "Single-Primary" } }
或者执行 c.status()
可以打印出集群更多的信息。
至此,利用MySQL Shell构建一个三节点的MGR集群做好了,可以尝试向 Primary 节点写入数据观察测试。
3. MySQL Shell接管现存的MGR集群
对于已经在运行中的MGR集群,也是可以用MySQL Shell接管的。只需要在调用 createCluster()
函数时,加上 adoptFromGR:true
选项即可。实际上不加这个选项的话,MySQL Shell也会自动检测到该MGR集群已存在,并询问是否要接管。
在这里简单演示下:
#不加上 adoptFromGr:true 选项
MySQL 172.16.16.10:3306 ssl JS > var c=dba.createCluster('MGR1');
A new InnoDB cluster will be created on instance '172.16.16.10:3306'.You are connected to an instance that belongs to an unmanaged replication group.
Do you want to setup an InnoDB cluster based on this replication group? [Y/n]:
可以看到,会有提示信息询问是否要接管。
如果加上 adoptFromGr:true
选项,则会直接创建集群,不再询问:
var c=dba.createCluster('MGR1', {adoptFromGr:true});
A new InnoDB cluster will be created based on the existing replication group on instance '172.16.16.10:3306'.Creating InnoDB cluster 'MGR1' on '172.16.16.10:3306'...
Adding Seed Instance...
Adding Instance '172.16.16.10:3306'...
Adding Instance '172.16.16.11:3306'...
Adding Instance '172.16.16.12:3306'...
...
如果是MGR集群的metadata发生变化,这时候无论调用 dba.getCluster()
还是 dba.createCluster
都可能会报告类似下面的错误:
Dba.getCluster: Unable to get an InnoDB cluster handle. The instance '192.168.6.27:3306' may belong to a different cluster from the one registered in the Metadata since the value of 'group_replication_group_name' does not match the one registered in the Metadata: possible split-brain scenario. Please retry while connected to another member of the cluster. (RuntimeError)
这种情况下,可以调用 dba.dropMetadataSchema()
函数删除元数据,再调用 dba.createCluster()
接管集群:
#确保不影响正常业务的话,删除无用MGR元数据 MySQL 172.16.16.10:3306 ssl JS > dba.dropMetadataSchema() Are you sure you want to remove the Metadata? [y/N]: y Metadata Schema successfully removed. #接管现有集群 MySQL 172.16.16.10:3306 ssl JS > var c=dba.createCluster('MGR1', {adoptFromGr:true}) ...
这样就可以了接管了。
4. 小结
本文主要介绍了如何利用MySQL Shell构建一个三节点的MGR集群,以及如何用MySQL Shell接管现有集群,处理元数据冲突的问题。相对于手工方式搭建MGR集群,用MySQL Shell操作会方便很多,推荐使用。
参考资料、文档
免责声明
因个人水平有限,专栏中难免存在错漏之处,请勿直接复制文档中的命令、方法直接应用于线上生产环境。请读者们务必先充分理解并在测试环境验证通过后方可正式实施,避免造成生产环境的破坏或损害。
今天带大家了解了MySQLShell、MGR、集群的相关知识,希望对你有所帮助;关于数据库的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~
-
348 收藏
-
228 收藏
-
368 收藏
-
190 收藏
-
124 收藏
-
335 收藏
-
467 收藏
-
303 收藏
-
176 收藏
-
368 收藏
-
475 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 如意的跳跳糖
- 这篇博文太及时了,细节满满,真优秀,已加入收藏夹了,关注作者了!希望作者能多写数据库相关的文章。
- 2023-06-10 18:43:01
-
- 苗条的金针菇
- 这篇文章真及时,作者加油!
- 2023-06-10 17:21:30
-
- 欢呼的黑裤
- 太全面了,码住,感谢楼主的这篇博文,我会继续支持!
- 2023-05-08 20:10:59
-
- 要减肥的金鱼
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢作者分享技术贴!
- 2023-05-02 01:26:53
-
- 昏睡的云朵
- 这篇文章内容真是及时雨啊,太全面了,很好,码起来,关注博主了!希望博主能多写数据库相关的文章。
- 2023-01-27 18:59:53