血与泪的感慨
我的天空星星都亮了,一扫之前的阴霾,喜上眉梢,多日的折磨成了幻影,程序员就是这样,痛并快乐着。接下来,开始我们伟大的分享之路,分享如何在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如下:
上图可以点击放大查看代码,代码的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)
登录后评论
立即登录 注册