k8s部署 mysql:8.0.21 主从集群
创建mysql的namespace
kubectl create namespace mysql
创建mysql的密码
vim mysql-secret.yaml
apiVersion: v1
data:
mysql_root_password: cm9vdA== #root
kind: Secret
metadata:
creationTimestamp: null
name: mysql-password
namespace: mysql
创建mysql主节点
创建pv、pvc
vim mysql-pv.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: deploy-mysql-master-ceph-pv
namespace: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: managed-nfs-storage
volumeMode: Filesystem
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: deploy-mysql-master-ceph-pvc
namespace: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: managed-nfs-storage
volumeMode: Filesystem
创建cm、、statefulset
vim mysql-cm.yaml
apiVersion: v1
data:
my.cnf: |-
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file = /var/run/mysqld/mysqld.pid
user = mysql
secure-file-priv = NULL
server-id = 1
log-bin = master-bin
log-bin-index = master-bin.index
max_connections = 1000 #最大连接数
[client]
socket = /var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
creationTimestamp: null
name: mysql-master-cm
namespace: mysql
创建svc
vim mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: deploy-mysql-master-svc
namespace: mysql
labels:
app: mysql-master
spec:
ports:
- port: 3306
name: mysql
targetPort: 3306
nodePort: 30306
selector:
app: mysql-master
type: NodePort
sessionAffinity: ClientIP
创建statefulset
vim mysql.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-mysql-master
namespace: mysql
spec:
selector:
matchLabels:
app: mysql-master
serviceName: "deploy-mysql-master-svc"
replicas: 1
template:
metadata:
labels:
app: mysql-master
spec:
terminationGracePeriodSeconds: 10
containers:
- args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
- --default-time_zone=+8:00
name: mysql
image: mysql:8.0.21
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: mysql-conf
mountPath: /etc/my.cnf
readOnly: true
subPath: my.cnf
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql_root_password
name: mysql-password
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: deploy-mysql-master-ceph-pvc
- name: mysql-conf
configMap:
name: mysql-master-cm
items:
- key: my.cnf
mode: 0644
path: my.cnf
运行yaml文件
kubectl apply -f mysql-secret.yaml
kubectl apply -f mysql-pv.yaml
kubectl get pvc -n mysql #查看pvc状态
kubectl apply -f mysql.yaml
创建mysql从节点
创建pv、pvc
vim mysql-pv.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: deploy-mysql-slave-01-ceph-pv
namespace: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: managed-nfs-storage
volumeMode: Filesystem
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: deploy-mysql-slave-01-ceph-pvc
namespace: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: managed-nfs-storage
volumeMode: Filesystem
创建cm
vim mysql-cm.yaml
apiVersion: v1
data:
my.cnf: |
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file = /var/run/mysqld/mysqld.pid
user = mysql
secure-file-priv = NULL
server-id = 2
log-bin = slave-bin
relay-log = slave-relay-bin
log-bin-index = slave-relay-bin.index
max_connections = 1000 #最大连接数
[client]
socket = /var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
creationTimestamp: null
name: mysql-slave-01-cm
namespace: mysql
创建svc
vim mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: deploy-mysql-slave-svc
namespace: mysql
labels:
app: mysql-slave
spec:
ports:
- port: 3306
name: mysql
targetPort: 3306
nodePort: 30308
selector:
app: mysql-slave
type: NodePort
sessionAffinity: ClientIP
创建statefulset
vim mysql.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-mysql-slave-01
namespace: mysql
spec:
selector:
matchLabels:
app: mysql-slave
serviceName: "deploy-mysql-slave-svc"
replicas: 1
template:
metadata:
labels:
app: mysql-slave
spec:
terminationGracePeriodSeconds: 10
containers:
- args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
- --default-time_zone=+8:00
name: mysql
image: mysql:8.0.21
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: mysql-conf
mountPath: /etc/my.cnf
readOnly: true
subPath: my.cnf
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql_root_password
name: mysql-password
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: deploy-mysql-slave-01-ceph-pvc
- name: mysql-conf
configMap:
name: mysql-slave-01-cm
items:
- key: my.cnf
mode: 0644
path: my.cnf
运行以上yaml文件
kubectl apply -f mysql-pv.yaml
kubectl get pvc -n mysql #查看pvc状态
kubectl apply -f mysql.yaml
进入mysql pod建立主从连接
进入主数据库查询信息
kubectl exec -it -n mysql deploy-mysql-master-0 /bin/bash
mysql -u root -proot #进入数据库
查询master节点相关信息
show master status;
在slave节点执行以下命令(参数提取上面查询到的)
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1 #跳过错误事件
再master上执行以下命令更改认证插件,mysql8默认使用caching_sha2_password ,改为以下的插件即可
ALTER USER 'root'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'zwzk@2024!qwe';
主备搭建
备服务器执行下面命令,连接master
参数详解:
master_host:这个参数是master的地址,kubernetes 提供的解析规则是 pod 名称.service名称.命名空间.svc.cluster.local,所以 master 的 mysql 地址是 deploy-mysql-master-0.deploy-mysql-master-svc.mysql.svc.cluster.local
master_port:主节点的 MySQL 端口,没改默认 3306
master_user:登录到主节点的 mysql 用户
master_password:登录到主节点的用户密码
master_log_file:之前查看 mysql 主节点状态时的 file 字段
master_log_pos:之前查看 mysql 主节点状态时的 Position 字段
启动slave同步
start slave;
扩展:
stop slave; #停止slave同步
reset slave; #停止并清除所有从服务器线程的相关信息
查询slave同步状态
show slave status\G;
(这两个参数为yes即可)
数据同步需要主从mysql的数据一致才可以同步,建立主从连接之前需要保证数据一致,建立连接之后在创建的库才会同步
结果验证
master节点创建了deploy_test库,slave成功同步了此库
如果mysql主从同步有问题,从库总是出现和主库表结构不同的情况,使用以下命令手动同步数据,同步完之后在执行change,开启start slave即可。
mysqldump -u 主库用户名 -p --master-data=1 数据库名 > 导出文件名.sql









浙公网安备 33010602011771号