非真正高可用:一主多从,主节点宕机后,会自动调度至其他节点部署、启动Master,数据不会丢失,从节点会重新连接同步主节点并继续同步数据。
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查看数据是否同步 - 查看数据是否与主库一致
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;"
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
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
Secrete
秘钥
PS1
:扩展副本无作用,所以每个节点都单独创建一个Pod
即可
PS2
:一主多从模式,多个master
节点也只能当做从节点使用
PS3
:master1
宕机,需等待恢复后,其他节点会自动同步数据
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节点没什么实质性作用,还是当做从节点来用~
Pod
MySQL-Master
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 # 挂载配置文件
Pod
概览此时各
Pod
的server_id
经过挂载配置文件覆盖后,均为正确,下一步则执行change_master.sh
脚本连接master
节点建立主从关系即可
Service
给
Master
主容器创建单独的外部访问服务,主要是为了自定义端口号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RenuJS72-1641780857503)(C:\Users\Peng\AppData\Roaming\Typora\typora-user-images\image-20211228153609965.png)]
两个脚本均在
Master
节点执行
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.
Slave
连接Maser
结果为
Yes
,证明已成功连接Master
[root@k8s-master01 mysql-cluster]# sh change_master.sh Slave_IO_Running: Yes Slave_SQL_Running: Yes
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)
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)
不是高可用,达不到
Master
宕机后选举的水平,Master
恢复后数据会自动同步到Slave
想部署高可用
MySQL
集群,可参考我的另一篇博文:K8s
部署多主多从高可用MySQL
集群
Master
宕机:Slave
不会替换为Master
Master
恢复:Slave
会自动同步Master
的数据Slave
宕机:不影响Master
其他Slave
Slave
恢复:会自动同步Master
的数据