Kubernetes中使用ceph快速部署mysql主从复制集群

血与泪的感慨

我的天空星星都亮了,一扫之前的阴霾,喜上眉梢,多日的折磨成了幻影,程序员就是这样,痛并快乐着。接下来,开始我们伟大的分享之路,分享如何在kubernetes中搭建mysql主从集群,不踩坑的快速搭建master主从集群,让你们早点回家,多陪陪女友,愿码友们不终日与十姊妹为伍。

千里之行始于足下

1.集群版本信息

[root@kube03 ~]# kubectl version

Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.6", BuildDate:"2018-03-21T15:21:50Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.6", BuildDate:"2018-03-21T15:13:31Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

1.需要ceph的相关配置:key,rbdImage名字(需要找ceph管理员)

2.需要基础镜像

镜像仓库: docker.io/yulibaozi
master: yulibaozi/mysql-master:201807261706 sha256:65ec774cd3a5e71bae1864dffbb1b37b34a2832cce1b8eb6c87f5b1e24b54267
slave: yulibaozi/mysql-slave:201807261706   sha256:712359cbe130bf282876ea7df85fb7f67d8843ab64e54f96a73fee72cef67d87

3. 需要定义k8s相关的资源(svc,sts,secret)

相关资源的解释

    1. 为什么需要secret?secret是来存储ceph的配置信息中的key的,一定要记得在存入secret之前进行base64编码。如果管理员提供给你了一个key,2个rbdImage,那么只需要一个secret,如果给了你两个key,那么需要两个secret
    2. 为什么需要 StatefulSet(sts)?sts和deployment类似,只不过deployment用于无状态的应用而sts应用于有状态的应用,master和slave各一个statefulSet
    3. 为什么需要Service?Service是为外部提供服务的,master一个service,slave一个service。

 

千里之行

创建secret

1.假设管理员给你的ceph信息如下:

key = AQAqfzNaofxHLBAAS7qY64uE/ddqWLOMVDhkAA==
rbdImagename = k8s_image01
user = admin(假设默认是admin,如果不是就问ceph管理员要)

2. 执行命令把ceph的Key使用base64编码

[root@kube03 yuli]# echo "AQAqfzNaofxHLBAAS7qY64uE/ddqWLOMVDhkAA==" | base64
QVFBcWZ6TmFvZnhITEJBQVM3cVk2NHVFL2RkcVdMT01WRGhrQUE9PQo=

3. 创建secret文件

[root@kube03 sts]# cat 1ceph-secret.json

{
    "apiVersion": "v1",
    "data": {
        "key": "QVFBcWZ6TmFvZnhITEJBQVM3cVk2NHVFL2RkcVdMT01WRGhrQUE9PQo="
    },
    "kind": "Secret",
    "metadata": {
        "name": "ceph-secret",
        "namespace": "yulibaozi"
    },
    "type": "Opaque"
}

(可选)如果没有namespace,需要创建,创建namespace的命令如下:

kubectl create namespace yulibaozi

执行命令创建secret

kubectl create -f 1ceph-secret.json

secret 创建完毕了

创建master的sts

master的sts如下:

上图可以点击放大查看代码,代码的GitHub地址在下方:

https://github.com/caas-one/k8s-demo/blob/master/mysql/sts.md

确认了4点后向下看
创建master-sts:

kubectl create -f 2master-sts.json

查看状态:

[root@kube03 sts]# kubectl get pod -n yulibaozi

NAME             READY     STATUS    RESTARTS   AGE
mysql-master-0   1/1       Running   0          2h

如果状态一直是CreateContaining,等10分钟左右还不是Running说明有问题,愿上天眷顾你。如果的确有问题,那么查问题。

master的sts创建完毕。

创建slave的sts

slave的sts配置如下:

上图可以点击放大查看代码,代码的GitHub地址在下方:

https://github.com/caas-one/k8s-demo/blob/master/mysql/sts.md

上述确认完毕后
执行命令创建slave的sts:

kubectl create -f 3slave-sts.json

查看sts的pod状态:

[root@kube03 sts]# kubectl get pod -n yulibaozi

NAME             READY     STATUS    RESTARTS   AGE
mysql-master-0   1/1       Running   0          2h
mysql-slave-0    1/1       Running   0          1h

如果等待15分钟不是Running,可能有问题,你可以选择耐心等待下,你可以选择采用和master一样的解决办法。

创建master的svc:

master的svc配置如下:

[root@kube03 sts]# cat 4master-svc.json

{
    "apiVersion": "v1",
    "kind": "Service",
    "metadata": {
        "labels": {
            "app": "mysql-master"
        },
        "name": "mysql-master",
        "namespace": "yulibaozi"
    },
    "spec": {
        "ports": [
            {
                "nodePort": 31000,
                "port": 3306,
                "protocol": "TCP",
                "targetPort": 3306
            }
        ],
        "selector": {
            "app": "mysql-master"
        },
        "sessionAffinity": "None",
        "type": "NodePort"
    },
    "status": {
        "loadBalancer": {}
    }
}

如上,我们暴露的NodePort是31000端口(如果此端口占用会创建失败,可以修改其他端口,端口范围:30000-32767)

修改service的命令:kubectl edit svc mysql-master -n yulibaozi

假设我们的宿主机IP:192.168.0.198

执行命令创建master的svc:

kubectl create -f 4master-svc.json

访问master数据库验证是否可以连接:

1.telnet的方式查看是否能连接

telnet 192.168.0.198 31000

2. 进入mysql

mysql -h 192.168.0.198 -P 31000 -uroot -proot

如果能够进入mysql的master节点,执行:

mysql> show master status;

+------------+----------+--------------+------------------+-------------------------------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------+----------+--------------+------------------+-------------------------------------------+
| bin.000005 |      194 |              |                  | 1f14ce9c-b1a8-11e8-becd-02420aa83b04:1-12 |
+------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)

一定记住其中的

File
Position

能走到此处,至少说明master可用。

创建mysql的slave节点

mysql的slave节点配置如下:

[root@kube03 sts]# cat 5slave-svc.json

{
    "apiVersion": "v1",
    "kind": "Service",
    "metadata": {
        "labels": {
            "name": "mysql-slave"
        },
        "name": "mysql-slave",
        "namespace": "yuli"
    },
    "spec": {
        "ports": [
            {
                "nodePort":32000,
                "port": 3306,
                "protocol": "TCP",
                "targetPort": 3306
            }
        ],
        "selector": {
            "name": "mysql-slave"
        },
        "sessionAffinity": "None",
        "type": "NodePort"
    },
    "status": {
        "loadBalancer": {}
    }
}
如果此端口占用会创建失败,可以修改其他端口,nodePort端口范围:30000-32767)

修改service的命令:kubectl edit svc mysql-master -n yulibaozi

执行命令创建slave的svc:

kubectl create -f 5slave-svc.json

验证是否可用的方式和master节点一样

slave配置步骤:
执行命令:

mysql -h 192.168.0.198 -P 32000 -uroot -proot

在slave的数据库中配置master:

mysql> change master to master_host='192.168.0.198', master_user='root', master_password='root', master_port=32000, master_log_file='bin.000005', master_log_pos=194, master_connect_retry=30;

Query OK, 0 rows affected, 2 warnings (0.19 sec)

可能你需要修改的是:

 master_host  
 master_user
 master_password
 master_port 
 master_log_file 上面让你记住的File
 master_log_pos  上面让你记住的Position

查看slave的复制状态:

mysql> show slave status \G;

*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 10.151.30.141
                  Master_User: root
                  Master_Port: 33306
                Connect_Retry: 30
              Master_Log_File: bin.000005
          Read_Master_Log_Pos: 194
               Relay_Log_File: rrelay.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: bin.000005
             Slave_IO_Running: No
            Slave_SQL_Running: No
                            .
                            .
                            .
1 row in set (0.00 sec)

以下两个字段一定要注意,关键操作:

  Slave_IO_Running: No
  Slave_SQL_Running: No

  这两个结果一定得是YES,如果不是,先不管,向下执行

执行命令开始主从复制:

mysql> start slave;

ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

报错了,问题出在mysql的配置文件mysqld.cnf中

执行命令进入slave容器:

kubectl exec -it mysql-slave-0 -n yulibaozi /bin/bash

进入以下路径修改配置文件:

路径在: /etc/mysql/mysql.conf.d

修改配置:
relay_log=rrelay.log => relay_log=relay.log

(注:这种修改方式的弊端在于:Pod重启后,配置会恢复,需要重新修改)

修改完毕后,执行:

mysql> reset slave;

Query OK, 0 rows affected (0.23 sec)

再次查看主从状态:

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.151.30.141
                  Master_User: root
                  Master_Port: 33306
                Connect_Retry: 30
              Master_Log_File: bin.000005
          Read_Master_Log_Pos: 194
               Relay_Log_File: rrelay.000002
                Relay_Log_Pos: 314
        Relay_Master_Log_File: bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                            .
                            .
                            .
1 row in set (0.00 sec)

黎明已到

然后创建数据库,创建表,写入数据,验证主从是否可用,同时删除pod,在启动判断数据是否持久化。基于ceph的mysql主从搭建完毕,bug以死,还我以生。

编辑:Ghoul

来源:容器时代(ID:CaaSOne)

K8S中文社区微信公众号

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址