为了账号安全,请及时绑定邮箱和手机立即绑定

基于Kubernetes搭建MySQL主从集群

标签:
Kubernetes

愿你,忠于自己,活得像自己。

清单:
NameVersion
CentOS7
Kubernetes1.9.0
Docker17.09.1-ce
MySQL5.7

前言

令我始料不及的出差活动中,开始接触Kubernetes并被要求搭建基于此的MySQL主从集群,由于笔者在Linux、Kubernetes等方面都是小白,故此展开了填坑活动,写本文目的只是为了让其他程序猿少踩坑,下面简单介绍下MySQL主从集群。
我们用MySQL集群的分布式部署来实现MySQL主从模式,在MySQL集群中,Master节点主要负责数据的分发和slave节点的管理。因此Master节点主要负责数据的写入和分发(包括insert、update、delete)。而slave节点主要负责数据的读取(包括select)。基本的master和slave的分工作业,如下图所示。


webp

MySQL集群架构


MySQL集群在主从模式下实现一台服务充当主服务器,其他一台或者多台服务器充当从服务器。下面我们开始搭建。

一、安装MySQL

二、构建Docker镜像

  • 构建镜像需要以下操作,先简单说明后面步骤将此部分内容写入Dockerfile中

master配置

  1. 文件/etc/my.cnf中[mysqld]下添加配置

log-bin=mysql-bin
server-id=1
  1. 重启MySQL
    # service mysqld restart

  2. 创建同步账号

# mysql -u root -p# create user 'sync'@'%' identified by 'MySQL@lipuan.2018';
  1. 赋予同步账号远程权限
    # grant replication slave on *.* to 'sync'@'%' identified by 'MySQL@lipuan.2018';

slave配置

  1. 文件/etc/my.cnf中[mysqld]下添加配置

log-bin=mysql-bin
server-id=2
  1. 重启MySQL
    # service mysqld restart

  2. 配置主机IP

# mysql -u root -p# change master to master_host='x.x.x.x',master_user='sync',master_password='MySQL@lipuan.2018';

注意: server-id为主机标识,不能重复。x.x.x.x'为master服务器IP

  • 下面我们将以上的配置写入Dockerfile中

准备master镜像

  1. 下载MySQL官方Docker镜像文件,并解压

# wget https://codeload.github.com/docker-library/mysql/zip/master# unzip master# mkdir /home/lipuan/mysqlDockerFile# cp -Rf mysql-master/5.7/Dockerfile /home/lipuan/mysqlDockerFile# cp -Rf mysql-master/5.7/docker-entrypoint.sh /home/lipuan/mysqlDockerFile# rm -rf mysql-master# chmod +x docker-entrypoint.sh
  1. Dockerfile中添加,位置如下图所示

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

webp

Dockerfile-master

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

webp

entrypoint-master

准备slave的镜像

  1. 下载MySQL官方Docker镜像文件

# wget https://codeload.github.com/docker-library/mysql/zip/master# unzip master# mkdir /home/lipuan/mysqlDockerFile# cd ~# cp -Rf mysql-master/5.7/Dockerfile /home/lipuan/mysqlDockerFile# cp -Rf mysql-master/5.7/docker-entrypoint.sh /home/lipuan/mysqlDockerFile# rm -rf mysql-master# chmod +x docker-entrypoint.sh
  1. Dockerfile中添加,位置如下图所示

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

此处server-id用的是随机数


webp

Dockerfile-slave


2.3 docker-entrypoint.sh中添加,位置如下图所示

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[@]}"

slave配置中,master_host一项用的是$MYSQL_MASTER_SERVICE_HOST,这个环境变量(enviromnent variable)是由k8s生成的。


webp

entrypoint-slave.png

  1. 构建master镜像

# cd /home/lipuan/mysqlDockerFile/# docker build -t paulliu/mysql-master:0.1 .
  1. 构建slave镜像

# cd /home/lipuan/mysqlDockerFile/# docker build -t paulliu/mysql-slave:0.1 .
  1. 上传镜像

# docker login# docke push paulliu/mysql-master:0.1# docke push paulliu/mysql-slave:0.1

三、MySQL集群部署

  • # cd /home/lipuan/DockerBuild此后内容若无指出均在此目录下执行

  • 此部分操作,所有yaml文件缩进空格必须严格,否则无法构建成功

  1. 新建mysql-service.yaml文件
    # touch mysql-service.yaml
    添加内容

apiVersion: v1
kind: Service
metadata:
  name: mysql-master
  labels:
    app: mysql-master
  namespace: energy-prod
spec:  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 8688
  selector:
    app: mysql-master
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-slave
  labels:
    app: mysql-slave
  namespace: energy-prod
spec:  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 8689
  selector:
    app: mysql-slave
  1. 新建mysql-statefulset.yaml文件
    # touch mysql-statefulset.yaml
    添加内容

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: mysql-master
  labels:
    name: mysql-master  namespace: energy-prod
spec:
  serviceName: mysql-master
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql-master
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mysql-master
        image: xxx.xxx.xxx.xxx/library/mysql-master:1.2
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "MySQL@lipuan.2018"
        - name: MYSQL_REPLICATION_USER
          value: "sync"
        - name: MYSQL_REPLICATION_PASSWORD
          value: "MySQL@lipuan.2018"
        volumeMounts:
          - name: mysql-master-v
            mountPath: /var/lib/mysql
      nodeSelector:
        nodetype: mysql-master
      volumes:
      - name: mysql-master-v
        hostPath:
          path: /data/mysql-master/data
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: mysql-slave
  labels:
    name: mysql-master  namespace: energy-prod
spec:
  serviceName: mysql-slave
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql-slave
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mysql-slave
        image: xxx.xxx.xxx.xxx/library/mysql-slave:1.2
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "MySQL@lipuan.2018"
        - name: MYSQL_REPLICATION_USER
          value: "sync"
        - name: MYSQL_REPLICATION_PASSWORD
          value: "MySQL@lipuan.2018"
        volumeMounts:
          - name: mysql-slave-v
            mountPath: /var/lib/mysql
      nodeSelector:
        nodetype: mysql-slave
      volumes:
      - name: mysql-slave-v
        hostPath:
          path: /data/mysql-slave/data
  1. 部署MySQL master服务

# kubectl create -f mysql-service.yaml# kubectl create -f mysql-statefulset.yaml
  1. 查看运行情况
    # kubectl get pods,service,rc

写在文末

写到这里基于Kubernetes的MySQL主从集群就搭建成功了,如果有哪位朋友对于其中步骤不是很清楚,欢迎互相学习。
本文是笔者首次写技术博客,如有错漏等问题,还望各位大大指出批评!



作者:lipuan
链接:https://www.jianshu.com/p/da0b339e1274


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消