一、k8s 部署 mysql
安装规划
| 组件 | replicas | 类型 |
|---|---|---|
| mysql-master | 1 | statefulset |
| mysql-slave | 1 | statefulset |
使用 k8s 版本为:v1.18.0 。
本次使用 openebs 来作为存储引擎,openebs 是一个开源的、可扩展的存储平台,它提供了一种简单的方式来创建和管理持久化存储卷。它支持各种存储后端,包括但不限于 zfs、btrfs、xfs 等。同时,openebs 具有高度的可扩展性和可配置性,可以满足不同的存储需求。
安装 openebs :
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
验证openebs是否正确安装:
kubectl get pods -n openebs

所有的 openebs pods 都处于running状态表示正常。
1. 创建命名空间
vi mysql-ns.yml
apiversion: v1
kind: namespace
metadata:
name: mysql
labels:
name: mysqlkubectl apply -f mysql-ns.yml
2. 创建一个默认的存储卷:
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 主节点:
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 从节点:
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

二、主从配置
主节点配置
可以在外面使用 mysql 客户端连接 mysql-master ,注意换成你的 k8s nodel ip :
mysql -h 192.168.40.12 -p 31306 -u root -proot

查看当前 master 状态:
show master status;

注意这里查询出来的 file 和 position 下面主从复制时会用到。
为从节点创建一个同步用户:
create user 'replica'@'%' identified with mysql_native_password by 'replica123'; grant replication slave on *.* to 'replica'@'%'; flush privileges;

从节点配置
在外面使用 mysql 客户端连接 mysql-master ,注意换成你的 k8s nodel ip :
mysql -h 192.168.40.12 -p 31307 -u root -proot

同步指向主节点:
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 指向的是主节点的 service :

启动同步进程:
start slave;

查看同步状态:
show slave status\g

看到 slave_io_running 和 slave_sql_running 都为 yes 则表示启动成功。
三、主从测试
首先在主节点创建数据库 testdb:
create database testdb;

然后在从节点查看数据库:
show databases;

可以正常查到主节点创建的数据库。
然后在主节点创建测试表:
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;

接着在从节点查看表:
use testdb; show tables;

可以正常看到创建的表。
然后在主节点写入一条测试数据:
insert into test(name) values('小明');
然后到从节点查看表数据:
select * from test;

可以正常查到写入的数据。
到此这篇关于k8s 部署 mysql 8.0.20 主从复制结构的文章就介绍到这了,更多相关mysql 8.0.20 主从复制结构内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论