k8s配置mysql主从复制

一、概述

本文档采用kubernetes8.5+mysql5.7+NFS数据持久化,搭建mysql的主从服务。

##二、准备mysql主从镜像

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

  1. 准备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[@]}"

这里写图片描述

  1. 准备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[@]}"

这里写图片描述

  1. 使用Dockerfile创建镜像
    创建镜像前需要确保docker-entrypoint.sh有可执行权限
    chmod +x docker-entrypoint.sh
     # cd /root/mysql/master/	# master Dockerfile所在目录
     # docker build -t 192.168.1.98/library/mysql-master:0.1		#IP地址为harbor仓库地址
     # cd /root/mysql/slave		# slave Dockerfile所在目录
     # docker build -t 192.168.1.98/library/mysql-slabe:0.1
     # docker push 192.168.1.98/library/mysql-master:0.1		# 上传镜像到仓库中
     # docker push 192.168.1.98/library/mysql-slave:0.1
    

三、创建pv和pvc

  1. 在nfs服务器创建目录
    编辑/etc/exports目录,添加如下两行,确保本地有这两个目录。

    /var/hitsm/mysql_master *(rw,no_root_squash,no_all_squash,sync)
    /var/hitsm/mysql_slave *(rw,no_root_squash,no_all_squash,sync)
    

    使配置生效
    exportfs -r

  2. 通过yml文件创建两组pv 和 pvc

    # cat nfs-pv-master.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nfs-mysql-master
    spec:
      capacity:
        storage: 5Gi 
      accessModes:
      - ReadWriteOnce
      nfs: 
        path: /var/hitsm/mysql-master
        server: 192.168.1.98
      persistentVolumeReclaimPolicy: Recycle 
    # cat nfs-pvc-master.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pv-nfs-mysql-master
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
    # cat nfs-pv-slave.yaml 
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nfs-mysql-slave
    spec:
      capacity:
        storage: 6Gi 
      accessModes:
      - ReadWriteOnce
      nfs: 
        path: /var/hitsm/mysql_slave
        server: 192.168.1.98
      persistentVolumeReclaimPolicy: Recycle 
    
    # cat nfs-pvc-slave.yaml 
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pv-nfs-mysql-slave
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        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 
    

这里写图片描述

四、部署mysql

  1. mysql master部署

    # cat mysql-master-rc.yaml 
    apiVersion: v1
    kind: ReplicationController
    metadata:
     name: mysql-master
     labels:
      name: mysql-master
    spec:
      replicas: 1
      selector:
       name: mysql-master
      template:
       metadata:
        labels:
         name: mysql-master
       spec:
        containers:
        - name: mysql-master
          image: 192.168.1.98/library/mysql-master:0.1
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: mysql-master-data
          ports:
          - containerPort: 3306
          env:
          - name: MYSQL_ROOT_PASSWORD
            value: "12345678"
          - name: MYSQL_REPLICATION_USER
            value: "repl"
          - name: MYSQL_REPLICAITON_PASSWORD
            value: "12345678"
        volumes:
         - name: mysql-master-data
           persistentVolumeClaim:
            claimName: pv-nfs-mysql-master
    
    # cat mysql-master-svc.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-master
      labels:
       name: mysql-master
    spec:
      type: NodePort
      ports:
      - port: 3306
        targetPort: 3306
        name: http
        nodePort: 30066
      selector:
        name: mysql-master
    
    # kubectl create -f mysql-master-rc.yaml -n mysql
    # kubectl create -f mysql-master-svc.yaml -n mysql
    

    这里写图片描述

  2. mysql slave部署

    # cat mysql-slave-rc.yaml 
    apiVersion: v1
    kind: ReplicationController
    metadata:
     name: mysql-slave
     labels:
      name: mysql-slave
    spec:
      replicas: 1
      selector:
       name: mysql-slave
      template:
       metadata:
        labels:
         name: mysql-slave
       spec:
        containers:
        - name: mysql-slave
          image: 192.168.1.98/library/mysql-slave:0.1
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: mysql-slave-data
          ports:
          - containerPort: 3306
          env:
          - name: MYSQL_ROOT_PASSWORD
            value: "12345678"
          - name: MYSQL_REPLICATION_USER
            value: "repl"
          - name: MYSQL_REPLICAITON_PASSWORD
            value: "12345678"
        volumes:
         - name: mysql-slave-data
           persistentVolumeClaim:
            claimName: pv-nfs-mysql-slave
    
    # cat mysql-slave-svc.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-slave
      labels:
       name: mysql-slave
    spec:
      type: NodePort
      ports:
      - port: 3306
        targetPort: 3306
        name: http
        nodePort: 30067
      selector:
        name: mysql-slave
    
    # kubectl create -f mysql-slave-rc.yaml -n mysql
    # kubectl create -f mysql-slave-svc.yaml -n mysql
    

五、测试

  1. 登录到slave mysql,使用 “show slave status\G” 命令查看,出现如下,表示主从连接成功,如果报错,也可以通过这个页面看出。

    这里写图片描述

  2. 在master mysql中创建数据库、表、插入数据等,来验证主从是否配置成功。

    在master数据库执行

    mysql>create database hitsm;
    mysql>usehitsm;
    mysql>
    CREATE TABLE databasechangeloglock (
    ID int(11) NOT NULL,
    LOCKED bit(1) NOT NULL,
    LOCKGRANTED datetime DEFAULT NULL,
    LOCKEDBY varchar(255)
    DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
    mysql>
    INSERT INTO databasechangeloglock (ID, LOCKED,LOCKGRANTED, LOCKEDBY) VALUES (1, b'0', NULL, NULL);
    

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以按照以下步骤使用Kubernetesk8s)部署MySQL主从架构: 1. 创建一个名为`mysql-pvc.yaml`的持久卷声明(PVC)文件,用于存储MySQL数据。示例文件内容如下: ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi ``` 2. 创建一个名为`mysql-master.yaml`的MySQL主节点部署文件,示例文件内容如下: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: mysql-master spec: replicas: 1 selector: matchLabels: app: mysql-master template: metadata: labels: app: mysql-master spec: containers: - name: mysql-master image: mysql:latest env: - name: MYSQL_ROOT_PASSWORD value: your_password ports: - containerPort: 3306 volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pvc ``` 请替换`your_password`为您要设置的MySQL根密码。 3. 创建一个名为`mysql-slave.yaml`的MySQL从节点部署文件,示例文件内容如下: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: mysql-slave spec: replicas: 2 selector: matchLabels: app: mysql-slave template: metadata: labels: app: mysql-slave spec: containers: - name: mysql-slave image: mysql:latest env: - name: MYSQL_ROOT_PASSWORD value: your_password ports: - containerPort: 3306 volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pvc ``` 4. 使用以下命令应用和创建主节点和从节点的部署: ``` kubectl apply -f mysql-pvc.yaml kubectl apply -f mysql-master.yaml kubectl apply -f mysql-slave.yaml ``` 这样就完成了MySQL主从架构的部署。请确保您已经正确配置Kubernetes环境,并且使用了适当的MySQL镜像和密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值