环境介绍:
#节点分配
159m--->两个master,生产环境建议,一个master一个节点。
160n-->slave-0
161n-->slaves-0
#存储卷
pv-->放在节点上,没用nfs/云存储。hostpath方式存储。pv的资源分配1G,较小,用来测试环境
-----------------kind资源
159m节点创建目录并授权:mkdir -p /data/mysql-masters && chmod 755 -R /data/mysql-masters
mkdir -p /data/mysql-master && chmod 755 -R /data/mysql-master
160n节点创建目录并授权: mkdir -p /data/mysql-slave-0 && chmod 755 -R /data/mysql-slave-0
161n节点创建目录并授权: mkdir -p /data/mysql-slave-1 && chmod 755 -R /data/mysql-slave-1
master节点:
mkdir -p /kind/mysql-kind
cd /kind/mysql-kind
vim mysql-pv.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local1
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-master-pv
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/mysql-master
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 159m # 替换为你的主节点名称,kubectl get nodes获取,也可以放在其他节点。例如158n
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-masters-pv
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/mysql-masters
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 159m # 替换为你的主节点名称
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-slave-pv-0
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local1
local:
path: /data/mysql-slave-0
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 160n # 替换为你的第一个从节点名称
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-slave-pv-1
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local1
local:
path: /data/mysql-slave-1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 161n # 替换为你的第二个从节点名称,
vim mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-master-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-masters-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-slave-pvc-0
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-slave-pvc-1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-storage
vim mysql-sts-master.yaml
注意这里configmap有一个插件参数,需要先让podruning起来,再增加插件配置。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-master
spec:
serviceName: mysql-master
replicas: 1
selector:
matchLabels:
app: mysql-master
template:
metadata:
labels:
app: mysql-master
spec:
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: mysql
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: mysql-config
configMap:
name: mysql-master-config
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-master-pvc
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-master-config
data:
my.cnf: |
[mysqld]
server-id=1 # 保证id唯一
read-only=0 # 允许读写
#binlog-ignore-db=mysql # 忽略数据,指不需要同步的数据库
#binlog-do-db=db01 # 指定同步的数据库
log_bin=mysql-bin # 开binlog
bind-address = 0.0.0.0
default-storage-engine = INNODB
innodb_buffer_pool_size = 512mb
#mysql_native_password=ON #这里!先让podrunning起来再添加配置,不然会报插件错误
---
apiVersion: v1
kind: Service
metadata:
name: mysql-master-headless
spec:
clusterIP: None
selector:
app: mysql-master
vim mysql-sts-masters.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-masters
spec:
serviceName: mysql-masters
replicas: 1
selector:
matchLabels:
app: mysql-masters
template:
metadata:
labels:
app: mysql-masters
spec:
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: mysql
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: mysql-config
configMap:
name: mysql-masters-config
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-masters-pvc
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-masters-config
data:
my.cnf: |
[mysqld]
server-id=4 # 保证id唯一
read-only=0 # 允许读写
#binlog-ignore-db=mysql # 忽略数据,指不需要同步的数据库
#binlog-do-db=db01 # 指定同步的数据库
log_bin=mysql-bin # 开binlog
bind-address = 0.0.0.0
default-storage-engine = INNODB
innodb_buffer_pool_size = 512mb
#mysql_native_password=ON
#等podrunning起来之后,在更新这个配置,不然初始化直接报错
---
apiVersion: v1
kind: Service
metadata:
name: mysql-masters-headless
spec:
clusterIP: None
selector:
app: mysql-masters
vim mysql-sts-slave.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-slave
spec:
serviceName: mysql-slave
replicas: 1
selector:
matchLabels:
app: mysql-slave
template:
metadata:
labels:
app: mysql-slave
spec:
volumes:
- name: mysql-config
configMap:
name: mysql-slave0-config
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-slave-pvc-0
containers:
- name: mysql
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-slave0-config
data:
my.cnf: |
[mysqld]
server-id=2 #保证id唯一
read-only=1 #允许读,普通用户
bind-address = 0.0.0.0
default-storage-engine = INNODB
innodb_buffer_pool_size = 512mb
vim mysql-sts-slaves.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-slaves
spec:
serviceName: mysql-slaves
replicas: 1
selector:
matchLabels:
app: mysql-slave
template:
metadata:
labels:
app: mysql-slave
spec:
volumes:
- name: mysql-config
configMap:
name: mysql-slaves-config
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-slave-pvc-1
containers:
- name: mysql
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-slaves-config
data:
my.cnf: |
[mysqld]
server-id=3 #保证id唯一
read-only=1 #允许读,普通用户
bind-address = 0.0.0.0
default-storage-engine = INNODB
innodb_buffer_pool_size = 512mb
vim mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
MYSQL_ROOT_PASSWORD: cm9vdA== #base64编码,密码为root
kubectl apply -f . #应用整个文件夹
vim mysql-sts-master.yaml mysql-sts-masters.yaml
configmap.mysql_native_password=ON 去掉注释
kubectl apply -f mysql-sts-master.yaml mysql-sts-masters.yaml
身份划分--做主从:
master的从节点为slave-0
1.首先进入master容器创建用户及授权,还有slave授权。
CREATE USER 'itcast'@'%' IDENTIFIED BY '1';
GRANT ALL PRIVILEGES ON *.* TO 'itcast'@'%' WITH GRANT OPTION;
grant replication slave on *.* to 'itcast'@'%';
show master status; #查看binlog日志坐标,本次演示为mysql-bin.000003,2458
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 2458 | | | |
+------------------+----------+--------------+------------------+-------------------+
2.然后进入slave-0,添加master主节点信息,然后开启slave;
#mysql-master做了无头服务,通过coredns会在集群内部解析mysql-masters-headless.default.svc.cluster.local
CHANGE MASTER TO
MASTER_HOST='mysql-master-headless.default.svc.cluster.local',
MASTER_PORT=3306,
MASTER_USER='itcast',
MASTER_PASSWORD='1',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=2458;
start slave; #开启从服务
show slave status\G; #两个yes标识成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
masters的从节点为slaves-0
同上操作,注意无头服务为mysql-masters-headless.default.svc.cluster.local
双主操作
master和masters两个互为主从,master给masters做从,masters给master做从。和master与slave操作一致。
此时:
当从两个master写入的时候,两个从节点都会记录数据增删改数据,master建库删库,slave一同跟着操作,但是在slave中创建数据库和数据,master节点看不到。
报错:
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
Error 'You are not allowed to create a user with GRANT' on query. Default database: ''. Query: 'GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%''
Replicate_Ignore_Server_Ids:
8.0版本不支持创建用户和授权一条命令。
mysql> create user 'itcast'@'%' identified with mysql_nactive_password by '1';
ERROR 1524 (HY000): Plugin 'mysql_nactive_password' is not loaded
命令错误,应该是native。不然就是my.cnf没有启用插件
主从不成功,注意查看show slave status\G;中last_io_error报错