不停服务快速创建一个MySQL从库

记录一下,方便后面查看使用

目录

  • 一、环境说明
  • 二、准备工作
  • 三、创建从库
  • 四、开始复制
    • [1. 从库安装克隆插件](#1. 从库安装克隆插件)
    • [2. 主库创建必要账户](#2. 主库创建必要账户)
    • [3. 从库克隆当前主库数据](#3. 从库克隆当前主库数据)
    • [4. 从库上配置主从关系](#4. 从库上配置主从关系)
    • [5. 设置从库为只读](#5. 设置从库为只读)
  • 后记

一、环境说明

  1. Linux,Docker环境
  2. MySQL版本为 8.0.22
  3. 已经有一个主节点且处于生产环境

现在需要快速创建一个从库节点,服务环境规划如下:

服务地址 端口 说明
192.168.30.210 3309 主库
192.168.30.211 3309 准备要创建的从库

二、准备工作

  1. 确保主库已经开启binlog功能
  2. 确保主库已经开启 gtid_mode
  3. 确保主库从库配置文件中的 service_id不一样
shell 复制代码
[mysqld]

server-id = 112
log-bin=mysql-bin

binlog_format = ROW
binlog_row_image = FULL
binlog_expire_logs_seconds = 1209600
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_slave_updates
relay_log_recovery = 1
slave_skip_errors = ddl_exist_errors
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

gtid_mode = on
  1. 确认从库服务上端口 3309 33060没有被占用(33060是 mysqlx_port )
    33060端口不会影响MySQL服务启动,但是后台会有错误日志提示
    可以修改my.cnf 替换该端口
shell 复制代码
[mysqld]
# X Plugin 监听端口(默认 33060)
mysqlx_port=33060

三、创建从库

这里因为是docker环境,因此使用镜像快速创建:

shell 复制代码
 docker run -u root \
  --cap-add=SYS_NICE \
  --network=host \
  --restart=always \
  --name mysql8 \
  -v /data/apps/mysql/conf/my.cnf:/etc/mysql/my.cnf \
  -v /data/apps/mysql/files:/var/lib/mysql-files \
  -v /data/apps/mysql/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=YourPassword123456 \
  -d mysql:8.0.22

这里做了磁盘文件目录映射,

  1. /data/apps/mysql/conf/my.cnf 配置文件映射
  2. /data/apps/mysql/files 一些扩展文件目录
  3. /data/apps/mysql/data 主数据目录

启动完毕后,从库目前为一个空的干净的数据库,无需做其他工作,下面准备开始复制工作。

四、开始复制

1. 从库安装克隆插件

连接上从库,或者直接客户端打开一个查询界面即可,执行如下SQL:

shell 复制代码
INSTALL PLUGIN clone SONAME 'mysql_clone.so';

查看已经安装的MySQL插件

shell 复制代码
SHOW PLUGINS;

建议:主库也一并安装该插件,考虑后面可以配置双主

2. 主库创建必要账户

shell 复制代码
CREATE USER 'clone_user'@'%' IDENTIFIED WITH mysql_native_password BY 'YourPassword123456';

GRANT BACKUP_ADMIN, CLONE_ADMIN ON *.* TO 'clone_user'@'%';

CREATE USER 'rep_user'@'%' IDENTIFIED WITH mysql_native_password BY 'YourPassword123456';

GRANT REPLICATION SLAVE ON *.* TO 'rep_user'@'%';

FLUSH PRIVILEGES;
  1. clone_user用于从库克隆主库data目录的文件连接使用
  2. rep_user用户从库配置主从关系使用

3. 从库克隆当前主库数据

设置克隆白名单:

shell 复制代码
SET GLOBAL clone_valid_donor_list = '192.168.30.210:3309,192.168.30.211:3309';

这是在 MySQL 中为 Clone 插件设置允许的 donor(捐赠者)列表。只有列在该白名单中的主机:端口才被允许作为克隆数据源(donor)向当前实例提供克隆服务。

开始克隆

shell 复制代码
CLONE INSTANCE FROM 'clone_user'@'192.168.30.210':3309 IDENTIFIED BY 'YourPassword123456';

... 需要等待一会,速度类似于SCP远程拷贝

4. 复制完成后,MySQL实例自动关机重启

...稍等一会,如果没有错误可以直接使用主库上的账户密码登录从库

4. 从库上配置主从关系

shell 复制代码
CHANGE MASTER TO
  MASTER_HOST='192.168.30.210',
  MASTER_USER='rep_user',
  MASTER_PORT=3359,
  MASTER_PASSWORD='YourPassword123456',
  MASTER_AUTO_POSITION=1;

START SLAVE;

查看复制状态

shell 复制代码
SHOW SLAVE STATUS;

如果是8.0.23以及以上版本可以使用如下命令:

shell 复制代码
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='192.168.30.210',
  SOURCE_USER='rep_user',
  SOURCE_PORT=3309,
  SOURCE_PASSWORD='YourPassword123456',
  SOURCE_AUTO_POSITION=1;
  
START REPLICA;

查看复制状态

shell 复制代码
SHOW REPLICA STATUS;

一般查询状态的结果字段中的 Replica_SQL_Running_State 有如下信息:
Slave has read all relay log; waiting for more updates

基本上主从关系配置成功.

如果不成功,则先停止复制,处理结束后重新按照上面步骤再次配置主从复制。

关闭复制命令如下:

shell 复制代码
STOP  REPLICA;

或者

shell 复制代码
STOP SLAVE;

5. 设置从库为只读

如果你希望从库不要被人为污染,则可以开启严格的只读模式:

shell 复制代码
SET GLOBAL read_only = ON;

SET GLOBAL super_read_only = ON;
  1. read_only=ON 会禁止普通用户写操作,但拥有 SUPER、REPLICATION SLAVE 或某些高权限的用户仍可写入.
  2. super_read_only 是在 MySQL 5.7.8 引入的,用以提供比 read_only 更严格的只读保护,即使是具备 SUPER 权限的用户也无法写入.
  3. 开启这两个参数,不会影响主从复制线程写入数据.

后记

到此为止,不停服务快速创建一个MySQL从库工作全部完成,如果你希望配置是双主复制,则在主库上做上面从库做的事情即可,然后还要配置 keepalived 是MySQL的双主高可用。

使用 keepalived 实现MySQL双主高可用,强烈建议使用双主单活模式(全部用户连接连接到某一台服务器上,另外一台作为备机)

例如keepalived 主节点上配置如下:192.168.30.200为虚拟IP

shell 复制代码
vrrp_script check_3309port {
    script "/usr/local/bin/check_3309port.sh"
    interval 2
    weight -3
}

vrrp_instance VI_2 {
    state MASTER
    interface em1
    virtual_router_id 55
    priority 101
	nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.30.200
    }
    track_script {
        check_3309port
    }
}

keepalived 从节点上配置如下:

shell 复制代码
vrrp_script check_3309port {
    script "/usr/local/bin/check_3309port.sh"
    interval 2
    weight -3
}

vrrp_instance VI_2 {
    state BACKUP
    interface em1
    virtual_router_id 55
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
  		192.168.30.200
    }
    track_script {
        check_3309port
    }
}

注意:

主节点上有一个配置参数 nopreempt 这个参数作用如下:

当主节点宕机后,备节点接管MySQL服务,原节点再次上线后将不会抢占当前备节点的服务。

为什么要这么配置,因为你想,如果主节点宕机了好几天才发现,此时原主节点上线了,如果抢占了当前的MySQL服务,那现场生产环境可能直接不一致,直至崩溃!

相关推荐
奥尔特星云大使3 小时前
ALTER 与 UPDATE、DROP 与 DELETE区别
linux·运维·数据库·mysql
六月闻君3 小时前
MySQLdump 常用参数说明
数据库·mysql
喃寻~6 小时前
java面试
数据库·sql·mysql
lang201509287 小时前
MySQL I/O线程优化:提升性能的关键配置
数据库·mysql
黑马金牌编程10 小时前
简易分析慢 SQL 的流程和方法
linux·数据库·mysql·性能优化·性能分析·慢日志
什么半岛铁盒10 小时前
C++项目:仿muduo库高并发服务器---------LoopThreadPool模块和TcpServer模块的实现
linux·服务器·c++·mysql·ubuntu
厚积薄发,积少成多11 小时前
深入解析 MySQL 时间类型:选择与应用
mysql
YDS82912 小时前
MYSQL —— 约束和多表查询
数据库·mysql
RestCloud13 小时前
MongoDB到关系型数据库:JSON字段如何高效转换?
数据库·mysql·mongodb