K8s-K8s部署MySQL一主多从-非真正高可用
文章目录
文章目录
K8s部署MySQL一主多从-非真正高可用
非真正高可用:一主多从,主节点宕机后,会自动调度至其他节点部署、启动Master,数据不会丢失,从节点会重新连接同步主节点并继续同步数据。
1.思路
1.Master、Slave使用的镜像
- mysql:8.0
2.每个容器节点创建一个对应的ConfigMap
- 不能扩展副本,server_id配置会还原默认,所以是一主多从模式
- 需要扩展节点则新建一个Pod,缩容则删除,数据持久化不会丢
- master节点宕机或被删除会自动调度至其他节点,并启动继续提供服务
- slave节点宕机也同理,宕机启动后会自动同步master节点数据
3.创建Master_Pod
- 创建master容器
4.单独给master容器创建Service外部访问服务,主要为了自定义端口
- slave节点根据自身需求创建Service
5.创建Slave_Pod
- 从构建镜像时就要指定好master的ip+端口,所以先规划好master的service端口,避免冲突
- ip可以是k8s集群内的所有节点ip(包括虚拟vip集群地址),端口则自定义一个不冲突的即可,如30306
6.进入Master_Pod添加测试数据
- 创建库、表
- 添加测试数据
7.进入Slave_Pod查看数据是否同步
- 查看数据是否与主库一致
2.准备配置文件
1)create_user.sh
创建主从复制用户
slave
,并赋予其对应权限,针对于master
容器
#!/bin/bash
# Create slave User And Chmod
cat > /root/grant_slave.sql <<EOF
create user 'test4'@'%' identified by 'test4';
grant all privileges on *.* to slave@'%';
flush privileges;
EOF
NAMESPACE='mysql-cluster'
MASTER=`kubectl get pod -n mysql-cluster | grep master | awk '{print $1}'`
GRANT_SLAVE_SQL='/root/grant_slave.sql'
kubectl cp ${GRANT_SLAVE_SQL} -n ${NAMESPACE} $MASTER:/
kubectl exec -it -n ${NAMESPACE} ${MASTER} -- mysql -u root -p123456 -e "source /grant_slave.sql;"
2)change_master.sh
连接主库建立主从关系
PS1:
待
Master
与Slave
容器启动成功后,创建Slave
时容器会自动执行此脚本,并自动建立主从关系
PS2:
ip是k8s集群内的任意ip,包括集群高可用vip地址,此处就是用的vip地址
端口避免与其他端口冲突即可,此处为30306
此脚本在
k8s
集群管理节点执行(有权限进入Pod的节点),
#!/bin/bash
# Connect To Master Node
cat > /root/change_master.sql <<EOF
change master to
master_host='172.23.0.244',
master_user='slave',
master_port=30306,
master_password='slave',
MASTER_AUTO_POSITION=1;
start slave;
EOF
PWD=123456
NAMESPACE='mysql-cluster'
SLAVE=`kubectl get pod -n mysql-cluster | awk 'NR>1{print $1}' | grep -i slave`
CHANGE_SQL='/root/change_master.sql'
for i in ${SLAVE};
do
kubectl exec -it -n ${NAMESPACE} ${SLAVE} -- mysql -p$PWD -e "show slave status\G;" | grep -i Running | awk 'NR<3{print}'
if [ $? -eq 1 ];then
kubectl cp ${CHANGE_SQL} -n ${NAMESPACE} $SLAVE:/
kubectl exec -it -n ${NAMESPACE} ${SLAVE} -- mysql -u root -p$PWD -e "source /change_master.sql;"
fi
done
3> my.cnf
可用此配置模板,只修改
server_id
即可~推荐节点预留
id
号:
master_server_id:1
【节点预留:1~100】
slave_server_id:101
【节点预留:101~往后】
[mysqld]
port=3306
server_id=1
binlog_format=row # binlog格式,行
gtid_mode=on # 主从复制更高效
enforce_gtid_consistency # 开启一致性
log-slave-updates # 更新从库的binlog
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
basedir=/usr
tmpdir=/tmp
default-storage-engine=InnoDB
character-set-server=utf8mb4
secure-file-priv= NULL
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
max_connections=1000
innodb_buffer_pool_size = 4G
max_connections=4050
wait_timeout=600
interactive_timeout=600
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:1G
log-bin-trust-function-creators=1
default-time-zone = '+8:00'
default_authentication_plugin=mysql_native_password # 更改默认的身份认证插件,否则主从建立认证失败,mysql8.0+版本需开启此配置
[mysqldump]
quick
quote-names
max_allowed_packet=16M
[mysql]
default-character-set=utf8mb4
[client]
port= 3306
socket= /var/run/mysqld/mysqld.sock
default-character-set=utf8mb4
[mysqld_safe]
socket=/var/run/mysqld/mysqld.sock
3.创建Secrete
秘钥
PS1
:扩展副本无作用,所以每个节点都单独创建一个Pod
即可
PS2
:一主多从模式,多个master
节点也只能当做从节点使用
PS3
:master1
宕机,需等待恢复后,其他节点会自动同步数据
4.创建ConfigMap
创建保密字典,定义
MySQL
初始密码,创建Pod
时挂载到容器内主从节点的
server_id
一定要规划好
创建ConfigMap命名格式为如下:
1.Master节点
名称:mysql-master-cnf-id-1 别名:MySQL主节点1
···
名称:mysql-master-cnf-id-100 别名:MySQL主节点100
2.Slave节点
名称:mysql-master-cnf-id-101 别名:Slave从节点1
···
名称:mysql-master-cnf-id-201 别名:Slave从节点100
# PS:其实此种搭建方案多master节点没什么实质性作用,还是当做从节点来用~
5.创建Pod
1) MySQL-Master
2)MySQL-Slave
只修改容器基本信息的以下内容,其他均与上方
master
配置一致
1.容器组名称、别名(容器名称无需带编号)
2.PVC的名称
3.my.cnf的挂载配置文件
# slave节点是多个,则加个编号,此编号最好能和serer_id号101能对应,比如sever_id是101,则slave的id可写为1,自己知道是第一个slave节点就好
举例:
slave1:
- mysql-slave-1 # 容器组名称
- mysql-slave-1-pvc # PVC的名称
- my.cnf:server_id=对应的slave节点号,比如slave节点号为8,则可写108 # 挂载配置文件
5> Pod
概览
此时各
Pod
的server_id
经过挂载配置文件覆盖后,均为正确,下一步则执行change_master.sh
脚本连接master
节点建立主从关系即可
6.创建Service
给
Master
主容器创建单独的外部访问服务,主要是为了自定义端口号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RenuJS72-1641780857503)(C:\Users\Peng\AppData\Roaming\Typora\typora-user-images\image-20211228153609965.png)]
7.建立主从关系
两个脚本均在
Master
节点执行
1)Master
创建用户并授权
一键复制并执行第
2
小结提供的配置文件脚本即可创建主从复制用户
slave
并赋予其权限
[root@k8s-master01 mysql-cluster]# ll
总用量 16K
-rwxr-xr-x 1 root root 690 12月 29 14:47 change_master.sh
-rwxr-xr-x 1 root root 487 12月 29 15:48 create_user.sh
# 创建用户并授权
[root@k8s-master01 mysql-cluster]# sh create_user.sh
mysql: [Warning] Using a password on the command line interface can be insecure.
2)Slave
连接Maser
结果为
Yes
,证明已成功连接Master
[root@k8s-master01 mysql-cluster]# sh change_master.sh
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
8.测试数据同步
1)Master
插入数据
创建测试库,带其他节点建立主从连接后,看是否自动同步数据
[root@k8s-master01 ~]# kubectl exec -it -n mysql-cluster mysql-master-0 -- mysql -p123456
mysql> create database test;show database;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
# 建表
mysql> create table test.qq(
id int,
name varchar(10)
);
Query OK, 0 rows affected (0.03 sec)
# 插入数据
mysql> insert into test.qq(id,name) values
(1,'ZhangSan'),
(2,'LiSi');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
# 查看数据
mysql> select * from test.qq;
+------+----------+
| id | name |
+------+----------+
| 1 | ZhangSan |
| 2 | LiSi |
+------+----------+
2 rows in set (0.00 sec)
2)Slave
查看数据
[root@k8s-master01 ~]# kubectl exec -it -n mysql-cluster mysql-slave-1-0 -- mysql -p123456
mysql> select * from test.qq;
+------+----------+
| id | name |
+------+----------+
| 1 | ZhangSan |
| 2 | LiSi |
+------+----------+
2 rows in set (0.01 sec)
9.总结
不是高可用,达不到
Master
宕机后选举的水平,Master
恢复后数据会自动同步到Slave
想部署高可用
MySQL
集群,可参考我的另一篇博文:K8s
-Helm部署MySQL高可用集群+实现自动主从切换
Master
宕机:Slave
不会替换为Master
Master
恢复:Slave
会自动同步Master
的数据Slave
宕机:不影响Master
其他Slave
Slave
恢复:会自动同步Master
的数据