環境介紹:
#節點分配
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-pvlabels:type: local
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /data/mysql-masternodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 159m # 替換為你的主節點名稱,kubectl get nodes獲取,也可以放在其他節點。例如158n
---
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-masters-pvlabels:type: local
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /data/mysql-mastersnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 159m # 替換為你的主節點名稱
---
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-slave-pv-0labels:type: local
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local1local:path: /data/mysql-slave-0nodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 160n # 替換為你的第一個從節點名稱
---
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-slave-pv-1labels:type: local
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local1local:path: /data/mysql-slave-1nodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- 161n # 替換為你的第二個從節點名稱,
vim mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-master-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-masters-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-slave-pvc-0
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-slave-pvc-1
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: local-storage
vim mysql-sts-master.yaml
注意這里configmap有一個插件參數,需要先讓podruning起來,再增加插件配置。
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-master
spec:serviceName: mysql-masterreplicas: 1selector:matchLabels:app: mysql-mastertemplate:metadata:labels:app: mysql-masterspec:tolerations:- key: "node-role.kubernetes.io/control-plane"operator: "Exists"effect: "NoSchedule"containers:- name: mysqlimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: MYSQL_ROOT_PASSWORDports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-storagemountPath: /var/lib/mysql- name: mysql-configmountPath: /etc/mysql/conf.d/my.cnfsubPath: my.cnfvolumes:- name: mysql-configconfigMap:name: mysql-master-config- name: mysql-storagepersistentVolumeClaim: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 # 開binlogbind-address = 0.0.0.0default-storage-engine = INNODBinnodb_buffer_pool_size = 512mb#mysql_native_password=ON #這里!先讓podrunning起來再添加配置,不然會報插件錯誤
---
apiVersion: v1
kind: Service
metadata:name: mysql-master-headless
spec:clusterIP: Noneselector:app: mysql-master
vim mysql-sts-masters.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-masters
spec:serviceName: mysql-mastersreplicas: 1selector:matchLabels:app: mysql-masterstemplate:metadata:labels:app: mysql-mastersspec:tolerations:- key: "node-role.kubernetes.io/control-plane"operator: "Exists"effect: "NoSchedule"containers:- name: mysqlimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: MYSQL_ROOT_PASSWORDports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-storagemountPath: /var/lib/mysql- name: mysql-configmountPath: /etc/mysql/conf.d/my.cnfsubPath: my.cnfvolumes:- name: mysql-configconfigMap:name: mysql-masters-config- name: mysql-storagepersistentVolumeClaim: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 # 開binlogbind-address = 0.0.0.0default-storage-engine = INNODBinnodb_buffer_pool_size = 512mb#mysql_native_password=ON#等podrunning起來之后,在更新這個配置,不然初始化直接報錯
---
apiVersion: v1
kind: Service
metadata:name: mysql-masters-headless
spec:clusterIP: Noneselector:app: mysql-masters
vim mysql-sts-slave.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-slave
spec:serviceName: mysql-slavereplicas: 1selector:matchLabels:app: mysql-slavetemplate:metadata:labels:app: mysql-slavespec:volumes:- name: mysql-configconfigMap:name: mysql-slave0-config- name: mysql-storagepersistentVolumeClaim:claimName: mysql-slave-pvc-0containers:- name: mysqlimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: MYSQL_ROOT_PASSWORDports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-storagemountPath: /var/lib/mysql- name: mysql-configmountPath: /etc/mysql/conf.d/my.cnfsubPath: 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.0default-storage-engine = INNODBinnodb_buffer_pool_size = 512mb
vim mysql-sts-slaves.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-slaves
spec:serviceName: mysql-slavesreplicas: 1selector:matchLabels:app: mysql-slavetemplate:metadata:labels:app: mysql-slavespec:volumes:- name: mysql-configconfigMap:name: mysql-slaves-config- name: mysql-storagepersistentVolumeClaim:claimName: mysql-slave-pvc-1containers:- name: mysqlimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/ml-pipeline/mysql:8.0.26env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: MYSQL_ROOT_PASSWORDports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-storagemountPath: /var/lib/mysql- name: mysql-configmountPath: /etc/mysql/conf.d/my.cnfsubPath: 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.0default-storage-engine = INNODBinnodb_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,2458mysql> 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.localCHANGE MASTER TOMASTER_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: YesSlave_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報錯