平台人生
作者平台人生2019-04-25 15:44
软件开发工程师, 平台人生

基于MGR和Consul的mysql高可用集群搭建

字数 2274阅读 7049评论 0赞 8

作者:齐兴一


传统的mysql高可用集群都是建立在mysql主从同步复制基础上的,利用mysql原生的同步技术,搭配集群管理组件,以及对外输出组件,组成一个高可用的mysql集群。
其中最复杂的部分就是集群异常状态后的集群重构,包括重新选主、重新配置主从同步、异常实例恢复后的再加入等,这部分功能实现起来并不复杂,但对逻辑严谨性要求较高,因此市面上同类产品百花齐放,例如最流行的MHA开源产品,以及各大中小互联网公司都宣布的自研产品。
mysql同步技术经历了“异步复制” -> “半同步复制” - >“增强半同步复制” 后,在数据一致性保护方面已基本成熟,基于mysql5.7增强半同步技术,实现mysql集群高可用也就变得更安全可靠。
mysql同时也推出了组复制(MySQL Group Replication,简称MGR)技术,MGR依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性。简单来说,由若干个节点共同组成一个复制组,当一个事务提交时,必须经过组内大多数节点(N / 2 + 1)决议并通过,才能最终得以提交。同时MGR支持单主模式和多主模式,单主模式时只有一个节点能够写入,其他节点只读,当主节点异常时,由其他节点重新选出新主 (这个就是本文最依赖的部分);多主模式下,所有节点均可读写,数据库场景下,多主同时读写一看就知道会有很多问题,因此官方建议生产系统使用单主模式。
MGR也是基于binlog、relaylog,在数据同步的底层实现上没什么不同,因此不用过多担心使用该技术后的数据安全性。
MGR技术自5.7.17推出,在生产上使用的案例还不是很多,但随着mysql版本的不断更新,使用MGR技术的场景也会越来越多,本文就是在利用MGR的基础上,组合服务发现和端口转发产品,编写简单脚本,最终实现一个mysql高可用集群。

架构如下:
物理机三台:
172.16.0.90 swarm1
172.16.0.76 swarm2
172.16.0.175 swarm3
混合部署模式:
3节点Mysql MGR集群
3节点Consul集群
每节点部署一个Consul-template
3节点haproxy集群

ezqtl28cvlm

ezqtl28cvlm

Mysql MGR 的搭建:
下载新版的mysql 8.0.13
4ygagl78lwj
4ygagl78lwj

使用uuidgen命令生成uuid:
bwxy5mc2q2w
bwxy5mc2q2w

三台物理机部署:
8skdqnpvzxp
8skdqnpvzxp

修改hosts文件:
fbe8t6kv2i
fbe8t6kv2i

创建工作目录:
otgnwk7b1f
otgnwk7b1f

创建my.cnf文件:以swarm1为例
(swarm1的server-id为1,swarm1的server-id为2,swarm1的server-id为3;group_replication_local_address修改为本机hostname或ip)
qxh7931dsx
qxh7931dsx

(mysql8中一些默认参数不用为MGR修改。)
初始化mysql:
n2dj7gk9xj
n2dj7gk9xj

启动mysql:
qp3c9lu88x
qp3c9lu88x

安装MGR插件:
h26wvbzrfhs
h26wvbzrfhs

至此,三台Mysql实例初始化完毕,接下来配置启动MGR。
登录swarm1的mysql:
x43o9oqo25
x43o9oqo25

登录swarm2、swarm3的mysql:
mmrvd06alm
mmrvd06alm

至此,一个三节点的MGR集群搭建完毕,可以实现MGR的特性了。
jxgscu4twkd
jxgscu4twkd

使用consul做服务发现
Consul是一款用Go开发的分布式服务协调管理的工具,它提供了服务发现,健康检查,Key/Value存储等功能,并且支持跨数据中心的功能。
这里用consul来做mysql主从的服务发现。
Consul-template是Consul的一个扩展工具,通过监听Consul中的数据可以动态修改一些配置文件。
这里用来动态生成haproxy的配置文件。
从官网下载consul和consul-template:
24ar8znraj8
24ar8znraj8

配置consul集群,三个节点都服务端工作模式,同时也做客户端使用:
eaopv2kovse
eaopv2kovse

参数含义:
kf113a8dhcg
kf113a8dhcg

配置mysql的服务发现,定义两个服务“mysql_rw”、“ mysql_ro”:(每台主机上分别修改address、tags)
9czxjfu91bc
9czxjfu91bc

eoklcvu9zcq
eoklcvu9zcq

脚本内容如下,用来判断当前mysql是主节点or从节点:
8mz303y9coq
8mz303y9coq

(有点长,此处省略脚本内容)
重载consul配置,使服务发现生效:
1g869gbtggy
1g869gbtggy

登录http://58.49.63.150:8500/ui ,确认rw、ro均已注册服务,一个rw,两个ro:
149sgjjzev8l
149sgjjzev8l

Haproxy + Consul-template 对外提供服务:
安装haproxy:
yum install haproxy
按照consul-template要求修改frontend和backend,制作配置文件模板:
wwc2fxs1dx
wwc2fxs1dx

启动consul-template:
dqzsixyrevo
dqzsixyrevo

检查haproxy配置文件及启动情况:
vlw4vnkmkb
vlw4vnkmkb

验证连接情况,使用haproxy配置的新端口:
c6a0izrwc4f
c6a0izrwc4f

至此一个3节点MGR集群部署完毕,三个集群模式haproxy对外提供服务,配置keepalived或前面加一层网络负载均衡就彻底OK了。。。

备注:
这是一个简单的例子,仅通过两个开源软件及简单脚本就可以构建一个基于MGR的mysql高可用集群,并没有过多考虑参数设置、进程守护等。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

8

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

作者其他文章

相关文章

相关问题

相关资料

X社区推广