docker部署MySQL并进行双主配置

K3s集群采用外置数据库MySQL

1、MySQL采用docker容器部署,配置双主模式

采用两台服务器(双节点) 部署,每台节点同时安装MySQL,实现MySQL 双主(互为主从)

双节点 IP 示例:Node1、Node2

核心特性:两台 MySQL 互为主从(均可读写)

  1. 关键原理

(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)

相关推荐
rising start8 小时前
二、全面理解MySQL架构
mysql·架构
bqq198610269 小时前
MySQL性能优化
mysql·mysql优化
雨辰AI10 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城202410 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有11 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
海市公约12 小时前
MySQL更新语句执行全流程:从Buffer Pool修改到二阶段提交
数据库·mysql·binlog·innodb·undo log·二阶段提交·update执行原理
仙柒41512 小时前
Docker存储原理
运维·docker·容器
颂love12 小时前
MySQL的执行流程
android·数据库·mysql
海市公约13 小时前
一条SQL查询的完整旅程:MySQL执行流程深度解析
sql·mysql·数据库优化·执行计划·连接器·查询缓存·sql执行原理
沪漂阿龙14 小时前
MySQL 面试题爆款详解:InnoDB 页机制、B+树索引、Buffer Pool、Redo Log、页分裂与性能优化一次讲透
b树·mysql·性能优化