K3s集群采用外置数据库MySQL
1、MySQL采用docker容器部署,配置双主模式
采用两台服务器(双节点) 部署,每台节点同时安装MySQL,实现MySQL 双主(互为主从)
双节点 IP 示例:Node1、Node2
核心特性:两台 MySQL 互为主从(均可读写)
- 关键原理
(1)MySQL 双主模式
两台 MySQL 互相作为对方的主库(Master) 和从库(Slave),开启二进制日志和中继日志,实现双向数据同步;通过错开自增 ID 规则,避免双写时的主键冲突,保证数据一致性。
3、配置详情
步骤 1:安装 MySQL 5.7(两台节点均执行)
docker compose 模式启动
创建docker-compose文件k3s-mysql.yaml
version: '3.3'
services:
mysql:
image: mysql:5.7
container_name: k3s-mysql
restart: unless-stopped
volumes:
- /home/k3s/k3s-mysql/data:/var/lib/mysql
- /home/k3s/k3s-mysql/my.cnf:/etc/my.cnf
ports:
- 6033:3306
environment:
- MYSQL_ROOT_PASSWORD=Master&123456
- MYSQL_DATABASE=k3s
my.cnf配置如下
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
log-bin=master-bin #主从文件名称可进行区分
server-id=1 #主从id要进行区分
binlog-do-db=k3s #需要进行同步的数据库
binlog-ignore-db=mysql #无需同步的库
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_allowed_packet=100M
#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
使用docker compose 启动MySQL容器
docker-compose -f k3s-mysql.yaml up -d
步骤 2:初始化 MySQL(两台节点均执行)
# 1. 登录MySQL(输入上述初始密码)
mysql -h192.168.40.116 -uroot -P6033 -p
# 创建同步账号(repl为账号,Repl@123456为密码,%允许所有IP访问)
CREATE USER 'slave'@'%' IDENTIFIED BY 'slave@123456';
# 授予复制权限(主从同步核心权限)
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
# 退出MySQL
exit;
步骤 3:配置双主互为主从(关键步骤,需精准执行)
核心:Node1 作为从库指向 Node2 的主库,Node2 作为从库指向 Node1 的主库,需先获取对方主库的 binlog 文件和位置。
主库:
{1}先进入主库,进行锁表,此处锁定为只读状态,防止数据写入 (可选,因如有数据库备份,可直接利用备份)
flush tables with read lock;
2)数据备份
mysqldump -h192.168.40.115 -uroot -P6033 -p database > mysql.sql
3)获取主库 的file名称和position
show master status;
从库:
1)stop slave;
2)还原数据
3)设置从库同步
change master to master_host='172.16.40.115',master_port=3306,master_user='slave',master_password='slave@@123456',master_log_file='mysql-bin.000123',master_log_pos=20211344;
4)启动同步
start slave;
5)查看同步信息
show slave status\G
查看到如下为yes,同步成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
最后进入主库,进行解锁
unlock tables;
互为主从,也就是说上述步骤要依次再2台主机上都进行操作,
当2台主机操作完成后,可分别进行数据更改操作验证
问题:
如果主从配置发生变化或者再同步过程中出现问题需要重新进行主从配置
清空之前的配置
MySQL [mysql]> reset slave;
重新配置主从
MySQL [mysql]> change master to master_host='172.16.40.115',master_port=6088,master_user='slave',master_password='slave@@123456',master_log_file='master-bin.000004',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.003 sec)
MySQL [mysql]> start slave;
Query OK, 0 rows affected (0.000 sec)