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:

MasterSlave容器启动成功后,创建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节点也只能当做从节点使用

PS3master1宕机,需等待恢复后,其他节点会自动同步数据

image-20211228133732880

image-20211228133851261

image-20211228133934285

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节点没什么实质性作用,还是当做从节点来用~
image-20211229151646125

image-20211229151906649

image-20211229152011892

image-20211229152103333

5.创建Pod

1) MySQL-Master

image-20211228130434028

image-20211229150529850

image-20211229150708398

image-20211229150757039

image-20211229150904356

image-20211229151156664

image-20211229151030799

image-20211229151058912

image-20211229151414969

image-20211229151432225

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概览

此时各Podserver_id经过挂载配置文件覆盖后,均为正确,下一步则执行change_master.sh脚本连接master节点建立主从关系即可

image-20211229154253480

6.创建Service

Master主容器创建单独的外部访问服务,主要是为了自定义端口号

image-20211228152920448

image-20211228152537939

image-20211229154455512

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RenuJS72-1641780857503)(C:\Users\Peng\AppData\Roaming\Typora\typora-user-images\image-20211228153609965.png)]

image-20211228153518476

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的数据
posted @ 2022-06-09 18:35  秋风お亦冷  阅读(786)  评论(0编辑  收藏  举报