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)

相关推荐
DolphinScheduler社区3 分钟前
实战演示 | 基于 Apache DolphinScheduler 与 Apache SeaTunnel 实现 MySQL 到 Doris 离线定时增量同步
数据库·mysql·开源·apache·海豚调度·大数据工作流调度
承渊政道8 分钟前
【MySQL数据库学习】MySQL基本查询(下)
数据库·学习·mysql·leetcode·bash·数据库开发·数据库系统
摇滚侠9 分钟前
Spring 零基础入门到进阶 基于注解的声明式事务 65-70
数据库·mysql·spring
这个人需要休息20 分钟前
优惠卷类型漏洞---优惠卷的并发使用
mysql·网络安全·逻辑漏洞·后端架构
是一个Bug21 分钟前
Docker 与 Kubernetes:从“集装箱”到“远洋舰队”
docker·容器·kubernetes
java_cj24 分钟前
阅读 k8s 源码的准备工作
云原生·容器·kubernetes
小二·30 分钟前
MySQL 8.0 性能优化与索引原理
android·mysql·性能优化
AC赳赳老秦33 分钟前
OpenClaw + 华为云自动化:批量管理云资源、生成月度云账单分析与成本优化报告
java·开发语言·javascript·人工智能·python·mysql·openclaw
我是一颗柠檬39 分钟前
【Java项目技术亮点】读写分离+主从延迟处理:MySQL高并发下的性能优化方案
java·分布式·mysql·性能优化
霸道流氓气质42 分钟前
MySQL 大数据量场景下的表结构与索引设计指南
数据库·mysql