记录一下,方便后面查看使用
目录
- 一、环境说明
- 二、准备工作
- 三、创建从库
- 四、开始复制
-
- [1. 从库安装克隆插件](#1. 从库安装克隆插件)
- [2. 主库创建必要账户](#2. 主库创建必要账户)
- [3. 从库克隆当前主库数据](#3. 从库克隆当前主库数据)
- [4. 从库上配置主从关系](#4. 从库上配置主从关系)
- [5. 设置从库为只读](#5. 设置从库为只读)
- 后记
一、环境说明
- Linux,Docker环境
- MySQL版本为 8.0.22
- 已经有一个主节点且处于生产环境
现在需要快速创建一个从库节点,服务环境规划如下:
服务地址 | 端口 | 说明 |
---|---|---|
192.168.30.210 | 3309 | 主库 |
192.168.30.211 | 3309 | 准备要创建的从库 |
二、准备工作
- 确保主库已经开启
binlog
功能 - 确保主库已经开启
gtid_mode
- 确保主库从库配置文件中的
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
- 确认从库服务上端口
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
这里做了磁盘文件目录映射,
- /data/apps/mysql/conf/my.cnf 配置文件映射
- /data/apps/mysql/files 一些扩展文件目录
- /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;
- clone_user用于从库克隆主库data目录的文件连接使用
- 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;
- read_only=ON 会禁止普通用户写操作,但拥有 SUPER、REPLICATION SLAVE 或某些高权限的用户仍可写入.
- super_read_only 是在 MySQL 5.7.8 引入的,用以提供比 read_only 更严格的只读保护,即使是具备 SUPER 权限的用户也无法写入.
- 开启这两个参数,不会影响主从复制线程写入数据.
后记
到此为止,不停服务快速创建一个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服务,那现场生产环境可能直接不一致,直至崩溃!