首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL InnoDB Cluster实战

MySQL InnoDB Cluster实战

作者头像
jeremyxu
发布于 2019-06-13 12:59:19
发布于 2019-06-13 12:59:19
4.6K00
代码可运行
举报
运行总次数:0
代码可运行

对于MySQL的高可用集群方案,之前在项目实战中使用过简单的主从半同步复制方案、基于Galera的MySQL高可用集群,但总感觉配置太复杂,集群目前的状况不太清晰明确,发生故障转移时经常需要人工参与。这周使用mysql-operator,发现这里已经使用了MySQL官方推出的一套完整的、高可用的MySQL解决方案-MySQL InnoDB Cluster,这绝对是MySQL运维工程师的福音,这里将一些研究过程中查阅的资料记录一下。

MySQL InnoDB Cluster简介

MySQL InnoDB Cluster 是最新GA的MySQL高可用方案,利用MySQL Group Replication和MySQL Shell、MySQL Router可以轻松搭建强壮的高可用方案。

MySQL Shell 是新的mysql 客户端工具支持x protocol和mysql protocol,具备JavaScript和python可编程能力,作为搭建InnoDB Cluster管理工具。

MySQL Router 是访问路由转发中间件,提供应用程序访问的failover能力。

MySQL InnoDB cluster provides a complete high availability solution for MySQL. MySQL Shell includes AdminAPI which enables you to easily configure and administer a group of at least three MySQL server instances to function as an InnoDB cluster. Each MySQL server instance runs MySQL Group Replication, which provides the mechanism to replicate data within InnoDB clusters, with built-in failover. AdminAPI removes the need to work directly with Group Replication in InnoDB clusters, but for more information see Chapter 17, Group Replication which explains the details. MySQL Router can automatically configure itself based on the cluster you deploy, connecting client applications transparently to the server instances. In the event of an unexpected failure of a server instance the cluster reconfigures automatically. In the default single-primary mode, an InnoDB cluster has a single read-write server instance - the primary. Multiple secondary server instances are replicas of the primary. If the primary fails, a secondary is automatically promoted to the role of primary. MySQL Router detects this and forwards client applications to the new primary. Advanced users can also configure a cluster to have multiple-primaries.

上面这张图看着比较清楚,通过MySQL Shell可以配置出一个高可用自动进行故障转移的MySQL InnoDB Cluster,在后续运维过程中也可以通过MySQL Shell对集群进行状态监控及管理维护。通过MySQL Router向应用层屏蔽底层集群的细节,以应用层将普通的MySQL协议访问集群。

MySQL Group Replication 是最新GA的同步复制方式,具有以下特点:

  • 支持单主和多主模式
  • 基于Paxos算法,实现数据复制的一致性
  • 插件化设计,支持插件检测,新增节点小于集群当前节点主版本号,拒绝加入集群,大于则加入,但无法作为主节点
  • 没有第三方组件依赖
  • 支持全链路SSL通讯
  • 支持IP白名单
  • 不依赖网络多播

搭建MySQL InnoDB Cluster

这里准备了3台虚拟机mysql-host1mysql-host2mysql-host3,IP分别为192.168.33.21192.168.33.22192.168.33.23

安装软件包

第一步是在三台虚拟机上均安装mysql-community-server、mysql-shell、mysql-router软件包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置mysql的yum源
$ yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# 安装
$ yum install -y mysql-community-server mysql-shell mysql-router

配置主机名称映射

为保证三台虚拟机上可正常通过名称解析到对方的IP,这里将主机名称映射写入hosts文件中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat << EOF >> /etc/hosts
192.168.33.21 mysql-host1
192.168.33.22 mysql-host2
192.168.33.23 mysql-host3
EOF

修改root密码

为了后续操作方便,这里修改三台虚拟机上MySQL的root密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 首先得到初始的root密码
$ systemctl start mysqld
$ ORIGINAL_ROOT_PASSWORD=$(awk  '/temporary password/{print $NF}' /var/log/mysqld.log)
# 这里将mysql的root密码修改为R00T@mysql,这个密码符合复杂度要求
$ MYSQL_PWD="$ORIGINAL_ROOT_PASSWORD" mysql --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'R00T@mysql';"
# 顺便允许mysql可在其它主机登录过来
$ MYSQL_PWD="$ORIGINAL_ROOT_PASSWORD" mysql --connect-expired-password -e "CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'R00T@mysql';"
$ MYSQL_PWD="$ORIGINAL_ROOT_PASSWORD" mysql --connect-expired-password -e "GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;"

配置本地实例

MySQL InnoDB Cluster底层依赖Group Replication模式,而配置Group Replication模式首先要通过dba.configureLocalInstance设置每台虚拟机上的本地实例必要参数并持久化配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 通过mysqlsh即可轻松完成本机实例的配置
$ cat << EOF > config_local_instance.js
dba.configureLocalInstance('root@localhost:3306', {'password': 'R00T@mysql', 'interactive': false})
EOF
$ mysqlsh --no-password --js --file=config_local_instance.js
# 重启后才能生效
$ systemctl restart mysqld
# 再检查一下本地实例配置的状况
$ cat << EOF > config_local_instance.js
dba.checkLocalInstance('root@localhost:3306', {'password': 'R00T@mysql', 'interactive': false})
EOF
$ mysqlsh --no-password --js --file=check_local_instance.js

初始化MySQL InnoDB Cluster

只需在mysql-host1这台虚拟机上进行以下操作就可以了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat << EOF > init_cluster.js
shell.connect('root@localhost:3306', 'R00T@mysql')
dba.createCluster('mycluster', {'localAddress': '192.168.33.21'})
var cluster=dba.getCluster('mycluster')
cluster.addInstance('root@192.168.33.22:3306', {'localAddress': '192.168.33.22', 'password': 'R00T@mysql'})
cluster.addInstance('root@192.168.33.23:3306', {'localAddress': '192.168.33.23', 'password': 'R00T@mysql'})
EOF
$ mysqlsh --no-password --js --file=init_cluster.js

初始化mysql-router

为了向应用层屏蔽底层集群的细节,我们还可以在三台虚拟机上均部署mysql-router。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 以当前集群信息创建mysql-router的配置信息,注意这里密码R00T@mysql被编码为R00T%40mysql
$ mysqlrouter --bootstrap root:R00T%40mysql@192.168.33.21:3306 --user=mysqlrouter
# 重启mysqlrouter服务
$ systemctl restart mysqlrouter

部署验证

至此整套MySQL InnoDB Cluster就部署好了,我们在其它节点以MySQL协议即可访问该MySQL集群。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ mysql -h192.168.33.21 -P3306 -uroot -pR00T@mysql

因为三台虚拟机上均安装了mysql-router,因此这里的IP三台虚拟机的IP均可,更好的办法用haproxy或nginx再做一下4层代理,由vip或LVS保证负载均衡器无单点故障,这个就是常规方案,按下不表了。

这里还以Vagrant及Ansible脚本的方式,整理了上述部署方案,参见这里。

运维中可能遇到的问题

同样在运维MySQL InnoDB Cluster时还是会遇到一些需要手工处理的场景,这里简要列举一下。

重启节点后需要手动重新加入集群

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql-js> var cluster = dba.getCluster("mycluster")
mysql-js> cluster.status()
{
...
            "192.168.33.23:3306": {
                "address": "192.168.33.23:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "(MISSING)"
            }
        }
    }
}
mysql-js> cluster.rejoinInstance('root@192.168.33.23:3306')
mysql-js> cluster.status()
{
...
            "192.168.33.23:3306": {
                "address": "192.168.33.23:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            }
        }
    }
}

集群所有节点发生重启

当集群的所有节点都offline,直接获取集群信息失败,如何重新恢复集群

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql-js> var cluster=dba.getCluster('mycluster')
Dba.getCluster: This function is not available through a session to a standalone instance (RuntimeError)

执行rebootClusterFromCompleteOutage命令,可恢复集群

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql-js> dba.rebootClusterFromCompleteOutage('mycluster')
Reconfiguring the cluster 'mycluster' from complete outage...
The instance '192.168.33.22:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y|N]: y
The instance '192.168.33.23:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y|N]: y
The cluster was successfully rebooted.

脑裂场景

当集群中有部分节点出现UNREACHABLE状态,此时集群无法做出决策,,会出现以下局面,此时只剩下一个活跃节点,此节点只能提供查询,无法写入,执行写入操作会hang住。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql-js> cluster.status()
{
    "clusterName": "mycluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "192.168.33.21:3306",
        "status": "NO_QUORUM",
        "statusText": "Cluster has no quorum as visible from '192.168.33.21:3306' and cannot process write transactions. 2 members are not active",
        "topology": {
            "192.168.33.21:3306": {
                "address": "192.168.33.21:3306",
                "mode": "R/W",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            },
            "192.168.33.22:3306": {
                "address": "192.168.33.22:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "UNREACHABLE"
            },
            "192.168.33.23:3306": {
                "address": "192.168.33.23:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "(MISSING)"
            }
        }
    }
}

修复这种状态,需要执行forceQuorumUsingPartitionOf指定当前活跃节点(如果是多个则选择primary node),此时活跃节点可以提供读写操作,然后将其他节点加入此集群。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql-js> cluster.forceQuorumUsingPartitionOf('root@192.168.33.21:3306')
Restoring replicaset 'default' from loss of quorum, by using the partition composed of [192.168.33.21:3306]
Please provide the password for 'root@192.168.33.21:3306':
Restoring the InnoDB cluster ...
The InnoDB cluster was successfully restored using the partition from the instance 'root@10.186.23.94:3306'.
WARNING: To avoid a split-brain scenario, ensure that all other members of the replicaset are removed or joined back to the group that was restored.
mysql-js> cluster.status()
{
    "clusterName": "mycluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "192.168.33.21:3306",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures. 2 members are not active",
        "topology": {
            "192.168.33.21:3306": {
                "address": "192.168.33.21:3306",
                "mode": "R/W",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            },
            "192.168.33.22:3306": {
                "address": "192.168.33.22:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "(MISSING)"
            },
            "192.168.33.23:3306": {
                "address": "192.168.33.23:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "(MISSING)"
            }
        }
    }
}
mysql-js> cluster.rejoinInstance('root@192.168.33.22:3306')
mysql-js> cluster.rejoinInstance('root@192.168.33.23:3306')

节点有哪状态

  • ONLINE - 节点状态正常。
  • OFFLINE - 实例在运行,但没有加入任何Cluster。
  • RECOVERING - 实例已加入Cluster,正在同步数据。
  • ERROR - 同步数据发生异常。
  • UNREACHABLE - 与其他节点通讯中断,可能是网络问题,可能是节点crash。
  • MISSING 节点已加入集群,但未启动group replication

集群有哪些状态

  • OK – 所有节点处于online状态,有冗余节点。
  • OK_PARTIAL – 有节点不可用,但仍有冗余节点。
  • OK_NO_TOLERANCE – 有足够的online节点,但没有冗余,例如:两个节点的Cluster,其中一个挂了,集群就不可用了。
  • NO_QUORUM – 有节点处于online状态,但达不到法定节点数,此状态下Cluster无法写入,只能读取。
  • UNKNOWN – 不是online或recovering状态,尝试连接其他实例查看状态。
  • UNAVAILABLE – 组内节点全是offline状态,但实例在运行,可能实例刚重启还没加入Cluster。

总结

总的来说,MySQL InnoDB Cluster相对于之前的集群方案还是要方便不少的,不过手工部署还是挺费时间的,看官们如果对手工部署感兴趣,也可以参考我整理出的anisble脚本,在Kubernetes环境快速部署MySQL InnoDB Cluster还是推荐直接使用mysql-operator。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Centos7.5基于MySQL5.7的 InnoDB Cluster 多节点高可用集群环境部署记录
一. MySQL InnoDB Cluster 介绍 MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如MMM, MHA, NDB Cluster, Galera Cluster, InnoDB Cluster, 腾讯的PhxSQL, MySQL Fabric., aliSQL。MySQL官方在2017年4月推出了一套完整的、高可用的Mysql解决方案 - MySQL InnoDB Cluster, 即一组MySQL服务器可以配置为一个MySQL集群。在默认的单主节点模式下,集群服务器具有一个读写主节点和多个只读辅节点。辅助服务器是主服务器的副本。客户端应用程序通过MySQL Router连接到主服务程序。如果主服务连接失败,则次要的节点自动提升为主节点,MySQL Router请求到新的主节点。InnoDB Cluster不提供NDB Cluster支持。
洗尽了浮华
2019/05/25
2.7K0
MySQL Shell副本集和MGR快速搭建详解
墨墨导读:本文是 MySQL Shell 快速搭建 副本集 和 MGR集群的全过程,分享至此,希望对大家有帮助。
数据和云
2020/05/26
1.9K0
体验 MySQL InnoDB Cluster
Mysql高可用环境的搭建比较麻烦,这使很多人都不去搭建高可用环境,等到有问题时再说 最近Mysql的动作很快,新版本的发布频繁,推出很多新的好用功能及插件,其中了就包括了简化高可用环境的搭建难度 下面就体验一下新的搭建方法,的确方便了很多 整个过程包括: 基础环境的安装(mysql 5.7.15、mysql-shell、mysql-router) 部署多个实例 创建集群 部署 Mysql Router 故障测试 其中第1步的过程较长,便不在本文中介绍,有兴趣自己搭建的小伙伴可以发送消息:01,获取相关安装
dys
2018/04/04
2.3K0
MySQL InnoDB Cluster环境搭建和简单测试
InnoDB Cluster初印象 记得MySQL Group Replicatioin 刚开始的时候,MySQL界很是轰动,等待了多年,终于有了官方的这个高可用解决方案。你要说还有一些方案补充,比如MySQL Cluster,MySQL Proxy,这些的使用率个人感觉还是不高,也就是经受的考验还不够,原因有很多,就不赘述了。 不久,我和一个MySQL DBA有了下面的一个基本对话。 我: MySQL GR GA之后,里面的自动切换功能确实很赞,能够做到读写分离,原本MHA的方案现
jeanron100
2018/03/21
1.6K0
MySQL InnoDB Cluster环境搭建和简单测试
InnoDB Cluster详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
用户1148526
2019/09/18
5.3K0
InnoDB Cluster详解
Mysql-Innodb-Cluster项目实战
近期由于数据库需要升级,将原有主从模式改为集群模式,实现搞可用HA。作为没有使用过mysql的小白,花了三周时间研究了下mysql,并了解原理后,完成了公司分派的任务,将mysql-innodb-cluster部署在生产环境。下面就将我这次采坑实战记录下来。
用户5224393
2019/08/13
1.9K0
Mysql-Innodb-Cluster项目实战
MySQL8.0 原生高可用之Innodb Cluster(二)
一、MySQL Shell的安装和配置二、MySQL Router的搭建和使用方法三、MySQL Innodb Cluster搭建过程1、原理图镇楼2、服务器信息3、具体搭建过程3.1 检查实例配置3.2 创建一个Innodb Cluster集群,并加入第一个节点3.3 加入其他节点四、简单测试4.1 MGR运行模式切换4.2 测试主动切换主库
AsiaYe
2021/07/14
3.2K0
MySQL8.0 原生高可用之Innodb Cluster(二)
技术分享 | InnoDB Cluster+GreatSQL快速部署MGR集群,并实现读写分离和故障自动转移(超详细)
MySQL InnoDB Cluster(简称MIC)是MySQL推出的整套解决方案,由几个部分组成:
老叶茶馆
2021/07/09
1.9K0
技术分享  | InnoDB Cluster+GreatSQL快速部署MGR集群,并实现读写分离和故障自动转移(超详细)
手把手教你安装 MySQL InnoDB Cluster 8.0.34
大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来手把手教你安装 MySQL InnoDB Cluster 8.0.34,欢迎点击上方蓝字“JiekeXu DBA之路”关注我的公众号,标星或置顶,更多干货第一时间到达!
JiekeXu之路
2023/10/25
2.8K3
手把手教你安装 MySQL InnoDB Cluster 8.0.34
Mysql 高可用 InnoDB Cluster 多节点搭建过程
1. 简介 InnoDB Cluster 的搭建可以分为两种情况: (1)实验环境 使用 sandbox 沙箱模拟数据库实例,这个非常简单,可以参考之前的一篇文章《体验 MySQL InnoDB Cluster》,也可以看 mysql 的官方文档,其中就是使用 sandbox 来介绍搭建过程的 (2)真实多服务器节点环境 真实环境下的搭建要更复杂一些,过程中我也遇到了一些问题,这方面的资料还很少,花费了不少时间才搭建成功 下面总结了多节点 InnoDB Cluster 搭建的详细过程,供有需要的朋友参考 2
dys
2018/04/04
2.5K0
Mysql 高可用 InnoDB Cluster 多节点搭建过程
mysql innodb cluster 集群断电重启
/usr/local/mysql8.0.18/bin/mysql -S /tmp/mysql3310.sock -uroot -p
wangwei-dba
2021/02/09
3.8K0
InnoDB Cluster 和 consul 碰撞出什么火花?
cluster.addInstance('root@kh-oms4-sit-innodbcluster-db02:3306');
田帅萌
2020/04/30
1K0
新特性解读 | InnoDB-Cluster 扫盲-日常运维
我们知道,InnoDB Cluster 是 Oralce 官方发布的用来管理 MySQL 组复制的一套工具,有了 InnoDB Cluster,MySQL 原生组复制的部署、运维、开发等将会变得非常简单。
爱可生开源社区
2020/07/22
5510
新特性解读 | InnoDB-Cluster 扫盲-日常运维
5. MGR管理维护 | 深入浅出MGR
今天介绍MGR集群的日常管理维护操作,包括主节点切换,单主&多主模式切换等。手工操作以及利用MySQL Shell两种方式都会分别介绍。
GreatSQL社区
2022/02/23
1.2K0
使用MySQL 8.2透明读/写分离,代价几何?(译文)
摘要:MySQL 8.2引入了透明读/写分离功能,MySQL 路由器可以自动将只读SQL路由到集群的只读节点。然而,MySQL路由器在此过程中需要对接收到的SQL进行一定程度的解析,以确定其是否为只读SQL。这个解析过程对系统性能会有怎样的影响呢?知名MySQL布道师Frédéric Descamps对此进行了测试,让我们一起看看他的分析。
姚远OracleACE
2023/11/17
5500
使用MySQL 8.2透明读/写分离,代价几何?(译文)
Oracle公共云中的MySQL InnoDB集群
题记:本文我们将引导大家完成在Oracle公共云(OPC)中创建3节点InnoDB集群的整个过程,包括从OPC IaaS资源的初始配置,到InnoDB集群的创建和配置的每个步骤。 在OPC上配置三个M
数据和云
2018/03/07
1.5K0
Oracle公共云中的MySQL InnoDB集群
Oracle公共云中的MySQL InnoDB集群(2)
在本系列的第一部分 Oracle公共云中的MySQL InnoDB集群,我们学习了如何使用Oracle Cloud配置InnoDB集群。 本文我们将了解如何以及何时使用MySQL Shell中提供的一些高级功能。 验证实例 首先需要验证一个特定的MySQL Server实例是否做好准备成为InnoDB集群的一部分。使用dba.checkInstanceConfiguration()函数: mysql-js> dba.checkInstanceConfiguration('root@ic01-mysql-1:
数据和云
2018/03/07
1.1K0
Oracle公共云中的MySQL InnoDB集群(2)
7.利用MySQL Router构建读写分离MGR集群 | 深入浅出MGR
本文介绍如何在MGR集群前端部署MySQL Router以实现读写分离、读负载均衡,以及故障自动转移。
GreatSQL社区
2022/03/09
1.6K0
MySQL Shell如何接管手动搭建(含仲裁节点)MGR集群
连接 Primary 节点,查看下原来的账户权限情况,对MGR专属账户增加相应授权
GreatSQL社区
2023/11/27
3800
MySQL Shell如何接管手动搭建(含仲裁节点)MGR集群
技术译文 | Python 程序如何使用 MySQL 8.2 读写分离
本文和封面来源:https://blogs.oracle.com/,爱可生开源社区翻译。
爱可生开源社区
2023/11/21
3060
技术译文 | Python 程序如何使用 MySQL 8.2 读写分离
推荐阅读
相关推荐
Centos7.5基于MySQL5.7的 InnoDB Cluster 多节点高可用集群环境部署记录
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验