基于Kubernetes搭建MySQL主从集群

本文介绍如何在Kubernetes环境中搭建MySQL主从集群,包括安装MySQL、构建Docker镜像及部署集群的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

清单:
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的分工作业,如下图所示。


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
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[@]}"
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用的是随机数


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生成的。


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文件缩进空格必须严格,否则无法构建成功
master
  1. 新建mysql-master-rc.yaml文件
    # touch 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: master
        image: paulliu/mysql-master:0.1
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "MySQL@lipuan.2018"
        - name: MYSQL_REPLICATION_USER
          value: "sync"
        - name: MYSQL_PASSWORD
          value: "MySQL@lipuan.2018"
  1. 新建mysql-master-service.yaml文件
    # touch mysql-master-service.yaml
    添加内容
apiVersion: v1
kind: Service
metadata:
  name: mysql-master
  labels:
    name: mysql-master
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    name: mysql-master
  1. 部署MySQL master服务
# kubectl create -f mysql-master-rc.yaml
# kubectl create -f mysql-master-service.yaml
  1. 查看运行情况
    # kubectl get pods,service,rc
slave
  1. 新建mysql-slave-rc.yaml文件
    # touch 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: master
        image: paulliu/mysql-slave:0.1
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "MySQL@lipuan.2018"
        - name: MYSQL_REPLICATION_USER
          value: "sync"
        - name: MYSQL_PASSWORD
          value: "MySQL@lipuan.2018"
  1. 新建mysql-slave-service.yaml文件
    # touch mysql-slave-service.yaml
    添加内容
apiVersion: v1
kind: Service
metadata:
  name: mysql-slave
  labels:
    name: mysql-slave
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    name: mysql-slave
  1. 部署MySQL slave服务
# kubectl create -f mysql-slave-rc.yaml
# kubectl create -f mysql-slave-service.yaml
  1. 查看运行情况
    # kubectl get pods,service,rc

写在文末

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

更新日志

  1. 2018.01.13 在准备镜像部分添加了对于docker-entrypoint.sh文件授予可执行权限,若无此步骤可能导致镜像无法运行;


作者:lipuan
链接:https://www.jianshu.com/p/da0b339e1274
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
### 如何搭建和配置 MySQL 集群 #### 1. MySQL 集群概述 MySQL 集群通过多节点协作提供高可用性和容错能力,是构建稳定高效数据库系统的基石[^1]。常见的 MySQL 集群解决方案包括 MGR (MySQL Group Replication) 和 NDB Cluster。 #### 2. 使用 MGR 搭建 MySQL 集群 MGR 是一种基于组复制的技术,能够实现自动故障转移和数据一致性[^4]。以下是其主要特点和最佳实践: - **架构设计**: MGR 至少需要三个节点来形成多数派协议,从而确保在单个节点失败时仍能保持服务正常运行。 - **安装与配置**: - 启用 `group_replication` 插件并设置必要的参数,例如 `group_replication_group_name`, `server_uuid` 等。 - 定义主从关系并通过 `CHANGE MASTER TO` 命令同步初始状态。 ```sql -- 在每个节点上启用 group replication 插件 INSTALL PLUGIN group_replication SONAME 'group_replication.so'; SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; ``` - **性能优化**: 调整缓冲区大小 (`innodb_buffer_pool_size`) 和线程池配置以适应工作负载需求。 #### 3. Kubernetes 上的 MySQL 集群管理 对于容器化环境中的 MySQL 集群,Kubernetes 提供了强大的支持工具。通过 ConfigMap 初始化不同角色(Master/Slave)所需的配置文件,并分配唯一标识符 `server-id.cnf` 给各个 Pod 实例[^2]。 #### 4. 替代方案:NDB Cluster 尽管 NDB Cluster 功能强大,但由于其复杂的部署流程及时效性问题,在实际生产环境中应用较少[^3]。如果预算允许,则可考虑采用收费版 MySQL Cluster Manager 来简化操作过程;然而更推荐选用开源免费且易于维护的 MGR 方案作为首选替代品。 #### 总结 无论是传统物理机还是现代化云原生平台下,合理规划硬件资源分布、科学选取合适类型的集群模式都是成功实施的关键所在。遵循上述指导原则可以帮助技术人员快速有效地建立起满足特定业务需求的安全可靠的 MySQL 数据库集群体系结构。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值