一、K8s 部署 MySQL
安装规划
| 组件 | replicas | 类型 |
|---|---|---|
| mysql-master | 1 | StatefulSet |
| mysql-slave | 1 | StatefulSet |
使用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.ymlapiVersion:v1kind:Namespacemetadata:name:mysqllabels:name:mysqlkubectl apply-fmysql-ns.yml2. 创建一个默认的存储卷:
vimysql-local-storage.ymlapiVersion: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:WaitForFirstConsumerkubectl apply-fmysql-local-storage.yml3. 部署 MySQL 主节点:
vimysql-master.ymlapiVersion: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:5Gikubectl apply-fmysql-master.yml查看pod:
kubectl get pods-nmysql4. 部署 MySQL 从节点:
vimysql-slave.ymlapiVersion: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:5Gikubectl 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;
可以正常查到写入的数据。