☰
K8s 部署 MySQL 8.0.20 主从复制结构
2026/10/27 18:18:21 网站建设 项目流程

一、K8s 部署 MySQL

安装规划

组件replicas类型
mysql-master1StatefulSet
mysql-slave1StatefulSet

使用k8s版本为:v1.18.0。

本次使用OpenEBS来作为存储引擎,OpenEBS是一个开源的、可扩展的存储平台,它提供了一种简单的方式来创建和管理持久化存储卷。它支持各种存储后端,包括但不限于ZFS、Btrfs、XFS等。同时,OpenEBS具有高度的可扩展性和可配置性,可以满足不同的存储需求。

安装OpenEBS:

kubectl apply-fhttps://openebs.github.io/charts/openebs-operator.yaml

验证OpenEBS是否正确安装:

kubectl get pods-nopenebs


所有的OpenEBS pods都处于Running状态表示正常。

1. 创建命名空间

vimysql-ns.yml
apiVersion:v1kind:Namespacemetadata:name:mysqllabels:name:mysql
kubectl apply-fmysql-ns.yml

2. 创建一个默认的存储卷:

vimysql-local-storage.yml
apiVersion:storage.k8s.io/v1kind:StorageClassmetadata:name:mysql-local-storageannotations:openebs.io/cas-type:localcas.openebs.io/config:|- name: StorageType value: hostpath - name: BasePath value: /data/openebs/mysqlprovisioner:openebs.io/localreclaimPolicy:DeletevolumeBindingMode:WaitForFirstConsumer
kubectl apply-fmysql-local-storage.yml

3. 部署 MySQL 主节点:

vimysql-master.yml
apiVersion:v1kind:ConfigMapmetadata:name:mysql-master-confignamespace:mysqllabels:app:mysql-master-configdata:my.cnf:|+[client]default-character-set=utf8[mysql]default-character-set=utf8[mysqld]init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 lower_case_table_names=1 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0# 主从同步server-id = 1 log-bin = mysql-bin sync_binlog = 1 binlog_checksum = none binlog_format = mixed slave-skip-errors = all event_scheduler = 1 max_allowed_packet = 64M# Custom config should go here!includedir/etc/mysql/conf.d/---# headless serviceapiVersion:v1kind:Servicemetadata:name:mysql-master-svcnamespace:mysqllabels:app:mysql-master-svcspec:clusterIP:Noneports:-name:master-portport:3306selector:app:mysql-master---# NodePort serviceapiVersion:v1kind:Servicemetadata:name:mysql-master-nodeportnamespace:mysqllabels:app:mysql-master-nodeportspec:clusterIP:ports:-name:master-portport:3306nodePort:31306targetPort:3306selector:app:mysql-mastertype:NodePorttarget-port:externalTrafficPolicy:Cluster---apiVersion:apps/v1kind:StatefulSetmetadata:name:mysql-masternamespace:mysqlspec:serviceName:"mysql-master-svc"replicas:1selector:matchLabels:app:mysql-mastertemplate:metadata:labels:app:mysql-masterspec:containers:-name:mysql-masterimage:mysql:8.0.20ports:-containerPort:3306name:master-portenv:-name:MYSQL_ROOT_PASSWORDvalue:"root"-name:TZvalue:"Asia/Shanghai"volumeMounts:-name:mycnfmountPath:/etc/mysql/my.cnfsubPath:my.cnf-name:mysql-master-datamountPath:/var/lib/mysqlvolumes:-name:mycnfconfigMap:name:mysql-master-configvolumeClaimTemplates:-metadata:name:mysql-master-dataspec:accessModes:["ReadWriteOnce"]storageClassName:mysql-local-storageresources:requests:storage:5Gi
kubectl apply-fmysql-master.yml

查看pod:

kubectl get pods-nmysql

4. 部署 MySQL 从节点:

vimysql-slave.yml
apiVersion:v1kind:ConfigMapmetadata:name:mysql-slave-confignamespace:mysqllabels:app:mysql-slave-configdata:my.cnf:|+[client]default-character-set=utf8[mysql]default-character-set=utf8[mysqld]init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 lower_case_table_names=1 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0# 主从同步server-id = 2 log-bin = mysql-bin sync_binlog = 1 binlog_checksum = none binlog_format = mixed slave-skip-errors = all event_scheduler = 1 max_allowed_packet = 64M read-only=1# Custom config should go here!includedir/etc/mysql/conf.d/---# headless serviceapiVersion:v1kind:Servicemetadata:name:mysql-slave-svcnamespace:mysqllabels:app:mysql-slave-svcspec:clusterIP:Noneports:-name:slave-portport:3306selector:app:mysql-slave---# NodePort serviceapiVersion:v1kind:Servicemetadata:name:mysql-slave-nodeportnamespace:mysqllabels:app:mysql-slave-nodeportspec:clusterIP:ports:-name:slave-portport:3306nodePort:31307targetPort:3306selector:app:mysql-slavetype:NodePorttarget-port:externalTrafficPolicy:Cluster---apiVersion:apps/v1kind:StatefulSetmetadata:name:mysql-slavenamespace:mysqlspec:serviceName:"mysql-slave-svc"replicas:1selector:matchLabels:app:mysql-slavetemplate:metadata:labels:app:mysql-slavespec:containers:-name:mysql-slaveimage:mysql:8.0.20ports:-containerPort:3306name:slave-portenv:-name:MYSQL_ROOT_PASSWORDvalue:"root"-name:TZvalue:"Asia/Shanghai"volumeMounts:-name:mycnfmountPath:/etc/mysql/my.cnfsubPath:my.cnf-name:mysql-slave-datamountPath:/var/lib/mysqlvolumes:-name:mycnfconfigMap:name:mysql-slave-configvolumeClaimTemplates:-metadata:name:mysql-slave-dataspec:accessModes:["ReadWriteOnce"]storageClassName:mysql-local-storageresources:requests:storage:5Gi
kubectl apply-fmysql-slave.yml

查看 pod :

kubectl get pods-nmysql

二、主从配置

主节点配置

可以在外面使用MySQL客户端连接mysql-master,注意换成你的k8s nodel ip:

mysql-h192.168.40.12-P31306-uroot-proot

查看当前master状态:

showmasterstatus;

注意这里查询出来的File和Position下面主从复制时会用到。

为从节点创建一个同步用户:

CREATEUSER'replica'@'%'IDENTIFIEDWITHmysql_native_passwordBY'replica123';GRANTREPLICATIONSLAVEON*.*TO'replica'@'%';FLUSHPRIVILEGES;

从节点配置

在外面使用MySQL客户端连接mysql-master,注意换成你的k8s nodel ip:

mysql-h192.168.40.12-P31307-uroot-proot

同步指向主节点:

CHANGE MASTERTOMASTER_HOST='mysql-master-svc',MASTER_USER='replica',MASTER_PASSWORD='replica123',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=152,MASTER_PORT=3306;

注意这里的MASTER_HOST指向的是主节点的Service:

启动同步进程:

startslave;

查看同步状态:

showslavestatus\G


看到Slave_IO_Running和Slave_SQL_Running都为Yes则表示启动成功。

三、主从测试

首先在主节点创建数据库testdb:

createdatabasetestdb;

然后在从节点查看数据库:

showdatabases;


可以正常查到主节点创建的数据库。

然后在主节点创建测试表:

usetestdb;createtable`test`(`id`intnotnullauto_increment,`name`varchar(255)defaultnull,primarykey(`id`))engine=InnoDBdefaultcharset=utf8mb4collate=utf8mb4_0900_ai_ci;

接着在从节点查看表:

usetestdb;showtables;


可以正常看到创建的表。

然后在主节点写入一条测试数据:

insertintotest(name)values('小明');


然后到从节点查看表数据:

select*fromtest;


可以正常查到写入的数据。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询