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)

相关推荐
bqq198610264 小时前
MySQL 5.7 与 MySQL 8.0 的主要区别
数据库·mysql
摇滚侠5 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
皮皮冰燃5 小时前
docker-18-WSL中安装docker并部署flask服务
docker·容器·flask
少年白char6 小时前
整理上万首音乐后的完整工作流:下载、刮削、播放与避坑指南
docker·nas·musictag·音乐刮削·音乐标签
Frank_refuel7 小时前
终端环境下:Ubuntu 22.04.1 安装 MySQL 数据库
数据库·mysql·ubuntu
木雷坞11 小时前
K8s GPU 推理服务 ImagePullBackOff 排查与预热
云原生·容器·kubernetes·gpu算力
萧行之13 小时前
Docker部署Loki+Grafana+Vector实现全服务器日志监控(含N8N/SSH/Fail2ban监控)
服务器·docker·grafana
存在的五月雨13 小时前
Mysql 索引的一些
数据库·mysql
黄俊懿13 小时前
MySQL主从复制:从“异步“到“GTID“,数据同步的进化之路
数据库·sql·mysql·oracle·架构·dba·db
人工智能培训14 小时前
工程科研中的AI应用:结构力学分析技巧
人工智能·深度学习·机器学习·docker·容器