Ceph在mysql中的应用_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)

相关资源的解释

为什么需要secret?secret是来存储ceph的配置信息中的key的,一定要记得在存入secret之前进行base64编码。如果管理员提供给你了一个key,2个rbdImage,那么只需要一个secret,如果给了你两个key,那么需要两个secret

为什么需要 StatefulSet(sts)?sts和deployment类似,只不过deployment用于无状态的应用而sts应用于有状态的应用,master和slave各一个statefulSet

为什么需要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如下:

Ceph在mysql中的应用_Kubernetes中使用ceph快速部署mysql主从复制集群_第1张图片

上图可以点击放大查看代码,代码的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配置如下:

Ceph在mysql中的应用_Kubernetes中使用ceph快速部署mysql主从复制集群_第2张图片

上图可以点击放大查看代码,代码的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)

你可能感兴趣的:(Ceph在mysql中的应用)