本文介绍在kubernetes环境中部署mysql主从集群,数据持久化采用nfs。

一、环境介绍
Mysql版本:5.7

Mysql master节点:
主机名:vm1
IP地址:192.168.115.5/24

Mysql slave节点:
主机名:vm2
IP地址:192.168.115.6/24

NFS节点:
主机名:vm2
IP地址:192.168.115.6/24
共享目录:/home/mysql_master、/home/mysql_slave

二、准备mysql主从的镜像环境
dockerfile、docker-entrypoint.sh 文件下载地址如下
https://github.com/docker-library/mysql/tree/master/5.7
由于我们要配置mysql主从,所以需要对dockerfile、docker-entrypoint.sh 文件做一点的修改,主要是在mysql主从配置部分。

准备master的镜像
将Dockerfile, docker-entrypoint.sh复制一份用于build master镜像文件。
在Dockerfile中添加如下内容,将mysql master的server-id设置为1

RUN sed -i '/\[mysqld\]/a server-id=1\nlog-bin' /etc/mysql/mysql.conf.d/mysqld.cnf


在docker-entrypoint.sh中添加如下内容,创建一个复制用户并赋权限,刷新系统权限表

echo "CREATE USER '$MYSQL_REPLICATION_USER'@'%' IDENTIFIED BY '$MYSQL_REPLICATION_PASSWORD' ;" | "${mysql[@]}"
echo "GRANT REPLICATION SLAVE ON *.* TO '$MYSQL_REPLICATION_USER'@'%' IDENTIFIED BY '$MYSQL_REPLICATION_PASSWORD' ;" | "${mysql[@]}"
echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"


准备slave的镜像
将Dockerfile, docker-entrypoint.sh复制一份用于build slave镜像文件。
在Dockerfile中添加如下内容,将mysql slave的server-id设置为一个随机数

RUN RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" && sed -i '/\[mysqld\]/a server-id='$RAND'\nlog-bin' /etc/mysql/mysql.conf.d/mysqld.cnf


在docker-entrypoint.sh中添加如下内容,配置连接master主机的host、user、password等参数,并启动复制进程。

echo "STOP SLAVE;" | "${mysql[@]}" echo "CHANGE MASTER TO master_host='$MYSQL_MASTER_SERVICE_HOST', master_user='$MYSQL_REPLICATION_USER', master_password='$MYSQL_REPLICATION_PASSWORD' ;" | "${mysql[@]}" echo "START SLAVE;" | "${mysql[@]}"


三、开始使用修改好的dockerfile创建mysql master和slave镜像

# cd /root/kubernetes/lnmp/mysql/Dockerfiles/Master
# docker build -t registry.fjhb.cn/mysql-master:0.1 .
# cd /root/kubernetes/lnmp/mysql/Dockerfiles/Slave
# docker build -t registry.fjhb.cn/mysql-slave:0.1 .
# docker push registry.fjhb.cn/mysql-master:0.1
# docker push registry.fjhb.cn/mysql-slave:0.1


四、创建pv和pvc,用于mysql主从存储持久化数据
在nfs服务器上把目录创建出来

# cd /home/
# mkdir mysql_master mysql_slave

通过yaml文件创建出两组pv和pvc

# cd /root/kubernetes/lnmp/mysql/Storage
# cat nfs-pv-master.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-nfs-mysql-master
spec:capacity:storage: 5Gi accessModes:- ReadWriteOncenfs: path: /home/mysql_masterserver: 192.168.115.6persistentVolumeReclaimPolicy: Recycle # cat nfs-pvc-master.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: pv-nfs-mysql-master
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5Gi
# cat nfs-pv-slave.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-nfs-mysql-slave
spec:capacity:storage: 6Gi accessModes:- ReadWriteOncenfs: path: /home/mysql_slaveserver: 192.168.115.6persistentVolumeReclaimPolicy: Recycle # cat nfs-pvc-slave.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: pv-nfs-mysql-slave
spec:accessModes:- ReadWriteOnceresources:requests:storage: 6Gi# kubectl create -f nfs-pv-master.yaml
# kubectl create -f nfs-pvc-master.yaml
# kubectl create -f nfs-pv-slave.yaml
# kubectl create -f nfs-pvc-slave.yaml 


五、根据yaml文件创建mysql master ReplicationController和services

# cat mysql-master-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:name: mysql-masterlabels:name: mysql-master
spec:replicas: 1selector:name: mysql-mastertemplate:metadata:labels:name: mysql-masterspec:containers:- name: mysql-masterimage: registry.fjhb.cn/mysql-master:0.1volumeMounts:- mountPath: /var/lib/mysqlname: mysql-master-dataports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: "12345678"- name: MYSQL_REPLICATION_USERvalue: "repl"- name: MYSQL_REPLICAITON_PASSWORDvalue: "12345678"volumes:- name: mysql-master-datapersistentVolumeClaim:claimName: pv-nfs-mysql-master# cat mysql-master-svc.yaml
apiVersion: v1
kind: Service
metadata:name: mysql-masterlabels:name: mysql-master
spec:type: NodePortports:- port: 3306targetPort: 3306name: httpnodePort: 30066selector:name: mysql-master# kubectl create -f mysql-master-rc.yaml
# kubectl create -f mysql-master-svc.yaml



使用mysql客户端连接master测试

六、根据yaml文件创建mysql slave ReplicationController和services

# cat mysql-slave-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:name: mysql-slavelabels:name: mysql-slave
spec:replicas: 1selector:name: mysql-slavetemplate:metadata:labels:name: mysql-slavespec:containers:- name: mysql-slaveimage: registry.fjhb.cn/mysql-slave:0.1volumeMounts:- mountPath: /var/lib/mysqlname: mysql-slave-dataports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: "12345678"- name: MYSQL_REPLICATION_USERvalue: "repl"- name: MYSQL_REPLICAITON_PASSWORDvalue: "12345678"volumes:- name: mysql-slave-datapersistentVolumeClaim:claimName: pv-nfs-mysql-slave# cat mysql-slave-svc.yaml
apiVersion: v1
kind: Service
metadata:name: mysql-slavelabels:name: mysql-slave
spec:type: NodePortports:- port: 3306targetPort: 3306name: httpnodePort: 30067selector:name: mysql-slave# kubectl create -f mysql-slave-rc.yaml
# kubectl create -f mysql-slave-svc.yaml 

七、测试与排错
通过mysql命令行连接slave查看复制的状态,发现状态是connecting

使用slave 容器连接master,发现使用root账号可以正常连接,而使用repl账号无法正常连接,提示access deny

修改master上的repl用户密码

mysql> alter user repl@'%' identified by "12345678";
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

完成上述修改后在slave上进行验证一下,repl账号可以正常连接

在slave上进行change master操作,因为创建镜像的时候并未配置GTID参数,所以这里不能使用MASTER_AUTO_POSITION=1参数,如果要开启,需要去修改Dockerfile,重新生成镜像。

mysql> stop slave;
mysql> set global sql_slave_skip_counter=1;
CHANGE MASTER TO \
MASTER_HOST='mysql-master', \
MASTER_USER='repl', \
MASTER_PASSWORD='12345678';
mysql> start slave;



参考文档:
https://www.jianshu.com/p/509b65e9a4f5

在kubernetes集群中部署mysql主从相关推荐

  1. Kubernetes集群中部署Node节点

    Kubernetes集群中的Node节点部署 kubernetes的Node节点包含如下组件: flanneld docker kubelet kube-proxy 环境变量 需要的变量. $ # 替 ...

  2. 基于京东云Kubernetes集群的 SpringBoot+MySQL 应用示例

    Kubernetes 是目前最主流的开源容器编排技术,用于自动部署,扩展和管理容器化应用程序,其提供应用部署.维护. 扩展机制等一系列完整功能,极大提高了容器集群管理的便捷性. 京东早在2016年年底 ...

  3. 想提高运维效率,那就把MySQL数据库部署到Kubernetes 集群中

    摘要:Kubernetes 很多看起来比较"繁琐"的设计的主要目的,都是希望为开发者提供更多的"可扩展性",给使用者带来更多的"稳定性"和& ...

  4. 记一次在K8s集群搭建的MySQL主从无法正常启动之数据迁移恢复实践

    本章目录:记一次在K8s集群搭建的MySQL主从无法正常启动之数据迁移恢复实践 描述:在K8s集群中里利用bitnami提供的mysql:5.7.32-debian-10-r61镜像并利用helm进行 ...

  5. 在Kubernetes集群上部署高可用Harbor镜像仓库

    这里主要介绍使用kubectl部署Harbor镜像仓库到Kubernetes集群中. 使用Helm部署,参考: https://my.oschina.net/u/2306127/blog/181969 ...

  6. 如何调试Kubernetes集群中的网络延迟问题

    本文深入研究和解决了 Kubernetes 平台上的服务零星延迟问题,就在不久前我也遇到了类似的问题,看似是玄学事件,刚开始归结于网络链路抖动,一段时间后依然存在,虽然影响都是 P99.99 以后的数 ...

  7. 调试Kubernetes集群中的网络停顿问题

    调试Kubernetes集群中的网络停顿问题 在过去几年,Kubernetes在GitHub已经成为标准的部署模式.目前在GitHub,我们在Kubernetes上运行着海量的面向内部团队以及面向C端 ...

  8. K8s——kubernetes集群中ceph集群使用【上】

    kubernetes集群中ceph集群使用 块设备创建和使用 Ceph 能够为 pod 提供裸的块设备卷,定义在Ceph数据冗余级别的一个池中 1.storageclass 配置 storagecla ...

  9. k8s和harbor的集成_在Kubernetes集群上部署高可用Harbor镜像仓库

    在Kubernetes集群上部署高可用Harbor镜像仓库 一.Kubernetes上的高可用Harbor方案 首先,我可以肯定给出一个回答:Harbor支持在Kubernetes部署.只不过Harb ...

最新文章

  1. 5招全面扫描网站页面的质量
  2. 鸿蒙系统几点更新,鸿蒙系统正式上线,第一批可升级鸿蒙系统手机公布,网友:终于等到了...
  3. 雨棚板弹性法计算简图_钢结构工程量计算4点注意事项,还不来看?
  4. mysql查询含有某个值的表_MYSQL查询数据表中某个字段包含某个数值
  5. 双目标定,匹配的笔记
  6. 动态规划算法 dynamic programming
  7. 【Python】基于Python的百度迁徙3——城内出行强度(附代码)
  8. 在蚂蚁金服工作是一种什么体验
  9. hashcat详细使用教程
  10. OpenCV图形处理基本概念
  11. 北京轨道交通明起推出电子定期票 不享累计优惠政策
  12. qq邮箱发送html文本,使用qq邮箱发送html格式的邮件
  13. 安卓APP注册登录+Tomcat服务器搭建+MySQL数据库建立+加密传输+servlet后端内容编写及部署到Tomcat服务器
  14. 对比学习(contrastive learning)
  15. 小程序如何获取后端的数据
  16. Visio画图几个技巧
  17. socket缓冲区/sk_buffer/滑动窗口关系
  18. 那个“支付宝锦鲤”女孩,现在变得怎么样了?你肯定想象不到
  19. Java趣谈——如何构建一个高效且可伸缩的缓存
  20. 银联支付api相关文档

热门文章

  1. 机器人流程自动化(RPA)系统原理及特点
  2. AI 技术与人类主体想象 ——基于人工直觉在线讨论的研究
  3. 关于征集2020重大科学问题和工程技术难题的通知
  4. 人工智能三大驱动力背后的CMOS传感器
  5. “众声喧哗”中的VR,谁来买单?
  6. 专设AI周会 高管悉数到场 微软CEO有多重视人工智能?
  7. 一文看懂全球半导体格局
  8. 国内首家!携程每周两天可在家“躺平”,76% 的员工主动报名
  9. 同为 Java 开发:有了这些 Java 项目经历,面大厂稳了!
  10. Django快速分页