K8s 如何部署 MySQL 8.0.20 主從復(fù)制結(jié)構(gòu)
一、K8s 部署 MySQL
安裝規(guī)劃
| 組件 | replicas | 類(lèi)型 |
|---|---|---|
| mysql-master | 1 | StatefulSet |
| mysql-slave | 1 | StatefulSet |
使用 k8s 版本為:v1.18.0 。
本次使用 OpenEBS 來(lái)作為存儲(chǔ)引擎,OpenEBS 是一個(gè)開(kāi)源的、可擴(kuò)展的存儲(chǔ)平臺(tái),它提供了一種簡(jiǎn)單的方式來(lái)創(chuàng)建和管理持久化存儲(chǔ)卷。它支持各種存儲(chǔ)后端,包括但不限于 ZFS、Btrfs、XFS 等。同時(shí),OpenEBS 具有高度的可擴(kuò)展性和可配置性,可以滿足不同的存儲(chǔ)需求。
安裝 OpenEBS :
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
驗(yàn)證OpenEBS是否正確安裝:
kubectl get pods -n openebs

所有的 OpenEBS pods 都處于Running狀態(tài)表示正常。
1. 創(chuàng)建命名空間
vi mysql-ns.yml
apiVersion: v1
kind: Namespace
metadata:
name: mysql
labels:
name: mysqlkubectl apply -f mysql-ns.yml
2. 創(chuàng)建一個(gè)默認(rèn)的存儲(chǔ)卷:
vi mysql-local-storage.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mysql-local-storage
annotations:
openebs.io/cas-type: local
cas.openebs.io/config: |
- name: StorageType
value: hostpath
- name: BasePath
value: /data/openebs/mysql
provisioner: openebs.io/local
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumerkubectl apply -f mysql-local-storage.yml
3. 部署 MySQL 主節(jié)點(diǎn):
vi mysql-master.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-master-config
namespace: mysql
labels:
app: mysql-master-config
data:
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 risks
symbolic-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 service
apiVersion: v1
kind: Service
metadata:
name: mysql-master-svc
namespace: mysql
labels:
app: mysql-master-svc
spec:
clusterIP: None
ports:
- name: master-port
port: 3306
selector:
app: mysql-master
---
# NodePort service
apiVersion: v1
kind: Service
metadata:
name: mysql-master-nodeport
namespace: mysql
labels:
app: mysql-master-nodeport
spec:
clusterIP:
ports:
- name: master-port
port: 3306
nodePort: 31306
targetPort: 3306
selector:
app: mysql-master
type: NodePort
target-port:
externalTrafficPolicy: Cluster
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-master
namespace: mysql
spec:
serviceName: "mysql-master-svc"
replicas: 1
selector:
matchLabels:
app: mysql-master
template:
metadata:
labels:
app: mysql-master
spec:
containers:
- name: mysql-master
image: mysql:8.0.20
ports:
- containerPort: 3306
name: master-port
env:
- name: MYSQL_ROOT_PASSWORD
value: "root"
- name: TZ
value: "Asia/Shanghai"
volumeMounts:
- name: mycnf
mountPath: /etc/mysql/my.cnf
subPath: my.cnf
- name: mysql-master-data
mountPath: /var/lib/mysql
volumes:
- name: mycnf
configMap:
name: mysql-master-config
volumeClaimTemplates:
- metadata:
name: mysql-master-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: mysql-local-storage
resources:
requests:
storage: 5Gikubectl apply -f mysql-master.yml
查看 pod :
kubectl get pods -n mysql

4. 部署 MySQL 從節(jié)點(diǎn):
vi mysql-slave.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-slave-config
namespace: mysql
labels:
app: mysql-slave-config
data:
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 risks
symbolic-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 service
apiVersion: v1
kind: Service
metadata:
name: mysql-slave-svc
namespace: mysql
labels:
app: mysql-slave-svc
spec:
clusterIP: None
ports:
- name: slave-port
port: 3306
selector:
app: mysql-slave
---
# NodePort service
apiVersion: v1
kind: Service
metadata:
name: mysql-slave-nodeport
namespace: mysql
labels:
app: mysql-slave-nodeport
spec:
clusterIP:
ports:
- name: slave-port
port: 3306
nodePort: 31307
targetPort: 3306
selector:
app: mysql-slave
type: NodePort
target-port:
externalTrafficPolicy: Cluster
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-slave
namespace: mysql
spec:
serviceName: "mysql-slave-svc"
replicas: 1
selector:
matchLabels:
app: mysql-slave
template:
metadata:
labels:
app: mysql-slave
spec:
containers:
- name: mysql-slave
image: mysql:8.0.20
ports:
- containerPort: 3306
name: slave-port
env:
- name: MYSQL_ROOT_PASSWORD
value: "root"
- name: TZ
value: "Asia/Shanghai"
volumeMounts:
- name: mycnf
mountPath: /etc/mysql/my.cnf
subPath: my.cnf
- name: mysql-slave-data
mountPath: /var/lib/mysql
volumes:
- name: mycnf
configMap:
name: mysql-slave-config
volumeClaimTemplates:
- metadata:
name: mysql-slave-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: mysql-local-storage
resources:
requests:
storage: 5Gikubectl apply -f mysql-slave.yml
查看 pod :
kubectl get pods -n mysql

二、主從配置
主節(jié)點(diǎn)配置
可以在外面使用 MySQL 客戶端連接 mysql-master ,注意換成你的 k8s nodel ip :
mysql -h 192.168.40.12 -P 31306 -u root -proot

查看當(dāng)前 master 狀態(tài):
show master status;

注意這里查詢出來(lái)的 File 和 Position 下面主從復(fù)制時(shí)會(huì)用到。
為從節(jié)點(diǎn)創(chuàng)建一個(gè)同步用戶:
CREATE USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'replica123'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%'; FLUSH PRIVILEGES;

從節(jié)點(diǎn)配置
在外面使用 MySQL 客戶端連接 mysql-master ,注意換成你的 k8s nodel ip :
mysql -h 192.168.40.12 -P 31307 -u root -proot

同步指向主節(jié)點(diǎn):
CHANGE MASTER TO MASTER_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 指向的是主節(jié)點(diǎn)的 Service :

啟動(dòng)同步進(jìn)程:
start slave;

查看同步狀態(tài):
show slave status\G

看到 Slave_IO_Running 和 Slave_SQL_Running 都為 Yes 則表示啟動(dòng)成功。
三、主從測(cè)試
首先在主節(jié)點(diǎn)創(chuàng)建數(shù)據(jù)庫(kù) testdb:
create database testdb;

然后在從節(jié)點(diǎn)查看數(shù)據(jù)庫(kù):
show databases;

可以正常查到主節(jié)點(diǎn)創(chuàng)建的數(shù)據(jù)庫(kù)。
然后在主節(jié)點(diǎn)創(chuàng)建測(cè)試表:
use testdb; create table `test` ( `id` int not null auto_increment, `name` varchar(255) default null, primary key (`id`) ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_0900_ai_ci;

接著在從節(jié)點(diǎn)查看表:
use testdb; show tables;

可以正??吹絼?chuàng)建的表。
然后在主節(jié)點(diǎn)寫(xiě)入一條測(cè)試數(shù)據(jù):
insert into test(name) values('小明');
然后到從節(jié)點(diǎn)查看表數(shù)據(jù):
select * from test;

可以正常查到寫(xiě)入的數(shù)據(jù)。
到此這篇關(guān)于K8s 部署 MySQL 8.0.20 主從復(fù)制結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)MySQL 8.0.20 主從復(fù)制結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql密碼過(guò)期導(dǎo)致連接不上mysql
mysql密碼過(guò)期了,今天遇到了連接mysql,總是連接不上去,下面有兩種錯(cuò)誤現(xiàn)象,有類(lèi)似問(wèn)題的朋友可以參考看看,或許對(duì)你有所幫助2013-05-05
MySQL數(shù)據(jù)庫(kù)下用戶及用戶權(quán)限配置
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)下用戶及用戶權(quán)限配置的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
一臺(tái)服務(wù)器部署兩個(gè)獨(dú)立的mysql數(shù)據(jù)庫(kù)操作實(shí)例
這篇文章主要給大家介紹了關(guān)于一臺(tái)服務(wù)器部署兩個(gè)獨(dú)立的mysql數(shù)據(jù)庫(kù)的相關(guān)資料,同一臺(tái)服務(wù)器裝兩個(gè)數(shù)據(jù)庫(kù),可以通過(guò)虛擬化技術(shù)實(shí)現(xiàn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
MySQL中冗余和重復(fù)索引的區(qū)別說(shuō)明
這篇文章主要介紹了MySQL中冗余和重復(fù)索引的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
解決Windows10下mysql5.5數(shù)據(jù)庫(kù)命令行中文亂碼問(wèn)題
重置系統(tǒng)后,很久之前安裝的MySQL數(shù)據(jù)庫(kù)出現(xiàn)了控制臺(tái)查詢中文亂碼問(wèn)題,時(shí)間太久早已經(jīng)不記得怎么設(shè)置了。下面通過(guò)本文給大家分享Windows10下解決MySQL5.5數(shù)據(jù)庫(kù)命令行中文亂碼問(wèn)題,一起看看吧2017-07-07
mysql函數(shù)split功能實(shí)現(xiàn)
mysql 5.* 的版本現(xiàn)在沒(méi)有split 函數(shù),但有些地方會(huì)用,在這里就簡(jiǎn)單記錄一下2012-09-09
Redis什么是熱Key問(wèn)題以及如何解決熱Key問(wèn)題
這篇文章主要介紹了Redis什么是熱Key問(wèn)題以及如何解決熱Key問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

