不停机进行mysql增加从库

252 阅读3分钟

简介

本文主要介绍了如何不停机进行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 操作。

image.png

检查dump文件

可以看到dump导出的文件内会有,bin_log_file 和position。同时我们也可以检查一下文件内容确保有我们备份的内容。

image.png

授权同步账户

在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,则代表从库配置成功 image.png

如果有非yes的,需要用podman logs命令查看一下。