kubernetes mysql多主_Kubernetes系列-部署MySQL主从复制

最近需要快速部署MySQL主从复制集群,网上找了下,基本都是使用两个不同的镜像来完成Master和Slave的部署,太麻烦了。能不能就用一个镜像加文件搞定呢?

分析问题,制定解决思路

分析一下这个项目的难点:

1.启动顺序:Master 的Pod 必须先于 Slave 的 Pod 起来;

2.如果某个Pod挂掉了,应该自动重新启动一个Pod,这个新建的Pod应该沿用原来的数据;

3.Master 与 Slave 的配置文件不同,特别是server_id;

4.Master 与 Slave 在服务启动之后还需要执行一些命令,它们也不一样,具体为:

1)Master需要执行授权命令,授权的用户名和密码希望用户自己来配置,而不是写死;

2)Slave需要执行CHANGE MASTER命令,需要知道Master的地址,binlog文件名及位置(非GTID的话);

分别解决掉以上的难点,这个项目也就没啥问题了,我们来一个个分解关于启动顺序问题。这个好说,利用 StatefulSet 轻松就能解决,它的一个特点就是会将所有的Pod副本进行编号,然后按照编号顺序一个一个的启动,Pod命名规则为 statefulsetName-N 其中N为编号,从0开始。例如,StatefulSet名称为 mysql ,那么第一个启动的Pod名称必为 mysql-0 。

关于重建Pod后的数据问题。因为重建的新Pod不一定还在原来的Node上,因此,想用原来的数据必须要使用分布式或共享Volume。我们可以使用NFS或其它的分布式存储来解决此问题。另外,如果几个副本(例如mysql-1,mysql-2,mysql-3)同时重建,必须保证新建立的 mysql-1 仍然沿用原来的 mysql-1 的数据。这个问题我们可以使用PV和PVC来解决。

配置文件不同的问题。例如,为了提高slave的性能,不开启binlog,而master必须要开启binlog日志。这个问题可以使用 ConfigMap 传两个不同的配置文件,如master.cnf和slave.cnf,让master使用master.cnf,slave使用slave.cnf。那我怎么知道哪个Pod是master,哪个是slave呢?第一个问题里面已经有答案了:mysql-0 一定是master,我们传入一个脚本,通过Pod的名称来确定应该使用哪个文件。这里又有问题了,如何在容器中知道Pod名称呢?使用 DownwardAPI 。另外一个问题是 server_id ,我们只传了两个配置文件,如果开启多个slave的话,它们的 server_id 必须不能一样,有几种解决方法:1. 使用随机数,不过随机数可能会重复;2. 使用Pod名称后面的编号,它们肯定不会重复。在此,我选用的第二种方法解决的。

用户名和密码可以使用 Secret 传递进来。Master地址因为不是固定的,所以不建议使用IP地址,我们可以借助 Headless Service 加上 DNS 来解决。如果我们能传入Service的名称进来,那么就可以使用这种方式来与其它Pod进行通信:PodName.ServiceName 。例如,如果Service名称为mysqlsvc,那么master的DNS名称为 mysql-0.mysqlsvc ,这个名称是不会变化的。当Master完成授权工作后,Slave可通过授权帐号查询到binlog文件名及位置信息(注意授权时要给 replication client 权限才可以查询)。

有了解决思路,下面开始着手部署。

构建镜像

首先要解决镜像的问题,直接使用官方镜像显然是不行的,在此我构建了自己的镜像。这个镜像需要有如下特点:尽量小

在 mysql-server 启动后需要执行一些操作,具体有:设置root密码

Master执行授权动作,Slave执行 CHANGE MASTER 动作及 START SLAVE 的操作

因平时对centos比较熟悉,在此选用centos作为基础镜像,如果希望镜像再小点,可选用ubuntu

为了让镜像尽量小,我在做好的镜像中不初始化,在启动容器时再初始化,这样做可能导致启动稍微慢点,优劣可自行取舍。为了解决容器启动后执行命令,我传入几个脚本进容器,随着容器启动而启动,执行完成后就退出。

创建一个目录作为构建环境上下文(可以创建在任意位置),并创

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值