ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

K8s-K8s部署MySQL一主多从-非真正高可用

2022-01-10 11:01:05  阅读:335  来源: 互联网

标签:Slave 一主多 MySQL id master mysql Master K8s 节点


文章目录


文章目录

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部署多主多从高可用MySQL集群

  • Master宕机:Slave不会替换为Master
  • Master恢复:Slave会自动同步Master的数据
  • Slave宕机:不影响Master其他Slave
  • Slave恢复:会自动同步Master的数据

标签:Slave,一主多,MySQL,id,master,mysql,Master,K8s,节点
来源: https://blog.csdn.net/qq_23995091/article/details/122404646

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有