简介
本文主要介绍了如何不停机进行mysql增加从库。为了方便远程和本机内存的用户测试,我使用了容器技术podman,podman-compose来进行搭建,当然你也可以使用docker&docker-compose,更常用的可能是直接编辑。
准备
image
使用mysql5.7的镜像
podman pull docker.io/library/mysql:5.7
目录
我们首先创建一个目录
mkdir mysql-cluster
整体目录结构如下
├── dump
│ └── backup.sql //备份出来的文件
├── master-config //主节点配置
│ └── mysqld.cnf
├── mysql-cluster.yml // compose 配置文件
└── slave1-config // 从1配置
└── mysqld.cnf
compose 配置
创建一个compose的配置文件 mysql-cluster.yml
version: '3.0'
services:
db-master:
image: docker.io/library/mysql:5.7
container_name: mysql-master
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: my_database
networks:
- mysql-network
ports:
- "3306:3306"
volumes:
- ./master-config:/etc/mysql/mysql.conf.d
- ./dump:/tmp/dump
db-slave1:
image: docker.io/library/mysql:5.7
container_name: mysql-slave1
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: my_database
networks:
- mysql-network
ports:
- "3307:3306"
volumes:
- ./dump:/tmp/dump
- ./slave1-config:/etc/mysql/mysql.conf.d
networks:
mysql-network:
driver: bridge
mysql配置
编写对应节点的mysqld.cnf 文件
master
[mysqld]
# 开启binlog日志存储
log_bin = mysql-bin
# mysql节点ip
server_id = 1
slave1
[mysqld]
log_bin = mysql-bin
server_id = 2
# 只读模式
read_only = 1
为主库制造数据
-- 创建名为 `users` 的表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(100)
);
-- 插入测试数据
INSERT INTO users (name, age, email) VALUES
('Alice', 25, 'alice@example.com'),
('Bob', 30, 'bob@example.com'),
('Charlie', 28, 'charlie@example.com'),
('David', 35, 'david@example.com'),
('Eve', 22, 'eve@example.com');
dump 数据
进入master容器,执行dump。
mysqldump -uroot -proot_password --master-data=2 --skip-lock-tables --single-transaction --databases my_database > /tmp/dump/backup.sql
命令解释:
--skip-lock-tables :默认情况下dump操作会进行锁表,使用skip-lock-tables避免锁表。
--single-transaction:让整个备份过程中,在一个巨大的事务中执行,确保你备份的内容是某一个时间点内的数据。
--skip-lock-tables和--single-transaction 通常联合使用,让整个dump过程无锁,且保证一致性。
--master-data:在dump文件中标记出当前dump中binlog的文件和位置,方便后续添加从库使用。其中=2的意思是,以注释的方式写入备份文件。否则将会是一条命令,执行备份的时候,将会直接执行CHANGE MASTER TO 操作。
检查dump文件
可以看到dump导出的文件内会有,bin_log_file 和position。同时我们也可以检查一下文件内容确保有我们备份的内容。
授权同步账户
在master内用root账号执行sql,创建用于同步的账户。
grant all on *.* to 'sync'@'%' identified by 'sync';
添加从库
import 数据
进入从库的容器
mysql -uroot -proot_password -e 'create database my_database;'
mysql -uroot -proot_password my_database < backup.sql
添加从库
设置同步来源
change master to master_host='mysql-master',master_user='sync',master_password='sync',master_log_file='mysql-bin.000003',master_log_pos=859;
开启同步进程
start slave;
查看salve状态
show slave status;
slave_IO_Running 和Slave_SQL_Running 两个都是yes,则代表从库配置成功
如果有非yes的,需要用podman logs命令查看一下。