kubernetes搭建mysql5.7主从复制

用Dockerfile手动创建mysql5.7主从镜像

一、mysql master

replication controller 和 service 的 yaml 文件如下,文件名分别为 mysql-master-rc.yaml 和 mysql-master-service.yaml 。

# vim mysql-master-rc.yaml
# cat mysql-master-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql5-7-master
  labels:
    name: mysql5-7-master
spec:
  replicas: 1
  selector:
    name: mysql5-7-master
  template:
    metadata:
      labels:
        name: mysql5-7-master
    spec:
      containers:
      - name: master
        image: tigerfive/mysql5.7-master:2.1
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "1234567"
        - name: MYSQL_REPLICATION_USER
          value: "repl"
        - name: MYSQL_REPLICATION_PASSWORD
          value: "1234567"

可以看到在env中添加了mysql需要的环境变量。


# vim mysql-master-service.yaml
# cat mysql-master-service.yaml
cat mysql-master-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql-master
  labels:
    name: mysql-master
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    name: mysql5-7-master


部署mysql master服务
# kubectl create -f mysql-master-rc.yaml
# kubectl create -f mysql-master-service.yaml

二、mysql slave

replication controller 和 service 的 yaml 文件如下,文件名分别为 mysql-slave-rc.yaml 和 mysql-slave-service.yaml 。

# vim mysql-slave-rc.yaml 
# cat mysql-slave-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql5-7-slave
  labels:
    name: mysql5-7-slave
spec:
  replicas: 1
  selector:
    name: mysql5-7-slave
  template:
    metadata:
      labels:
        name: mysql5-7-slave
    spec:
      containers:
      - name: slave
        image: tigerfive/mysql5.7-slave2:2.3
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "1234567"
        - name: MYSQL_REPLICATION_USER
          value: "repl"
        - name: MYSQL_REPLICATION_PASSWORD
          value: "1234567"


# vim mysql-slave-service.yaml 
# cat mysql-slave-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql5-7-slave
  labels:
    name: mysql5-7-slave
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    name: mysql5-7-slave


部署mysql slave服务
kubectl create -f mysql-slave-rc.yaml
kubectl create -f mysql-slave-service.yaml

三、测试mysql的主从复制

到目前为止,mysql的一主一从均运行在k8s的pod中。由于上面service创建并没有使用type: NodePort方式,所以service只能在kubernetes的pods中引用,外界是无法使用的。

1. 查看运行状态

执行命令,查看k8s各资源的运行情况: kubectl get pods,service,rc


image.png

2. mysql master上的操作

通过如下命令连接到pods中的容器,其中mysql-master-pe18a为pod名称。
# kubectl exec -it mysql-master-pe18a /bin/bash

此处无法如果连接
可以通过kubectl get no -o wide|grep mysql5-7 查找到对应node ip
然后再对应node上,找到container_id,
然后docker exec -it container_id bash 进入容器


接着连接本地mysql master服务器:
# mysql -uroot -p


至此进入到mysql命令模式。 执行命令show master status;查看状态。 执行下面的命令创建数据库以及表,以测试数据同步:
create database tiger_test_sync_db;
use tiger_test_sync_db;
create table test_tb(id int(3),name char(10)); insert into test_tb values(001,'ok');

3. mysql slave上的操作

按照上面相同的方式进入到mysql slave的命令行,执行以下命令:
show slave status\G;

通过该命令可以查看主从同步的情况,通常利用该命令来检查主从配置是否有问题。 


执行以下命令,可以看到刚才在master上创建的库表已经同步过来了:
show databases; use paul_test_sync_db; select * from test_tb;
image.png

四、集群伸缩

上面仅仅是一主一从,那接下来看看如何利用k8s对从服务器进行扩展。

此处将原先的1台从服务器扩展为3台,执行命令:
# kubectl scale rc mysql-slave --replicas=3 

上面命令的意思是将名称为mysql-slave的rc控制的pod副本数量变更为3。


执行命令可以看到扩展后的结果。
# kubectl get pods

五、总结

本文基于你已经对kubernetes有一定了解,因此并没有对一些命令、文件进行解释。 本文搭建的mysql一主多从集群环境,并没有考虑外部卷的挂载,因此当集群服务重启后,在mysql中创建的数据库、添加的数据会全部丢失。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。