环境:腾讯云轻量级服务器-安装系统(docker CE)
1、拉取 MySQL8
docker pull mysql:8.0.20
2、创建挂载目录
mkdir -p /home/mysql8/data /home/mysql8/config /home/mysql8/logs
3、准备配置文件
vim /mysql/replication/source/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
# 这是MySQL服务器的进程ID文件的位置。通过这个文件,您可以在系统上找到正在运行的MySQL服务器的进程
pid-file = /var/run/mysqld/mysqld.pid
# 这是MySQL服务器用于本地通信的Unix套接字文件的位置。
socket = /var/run/mysqld/mysqld.sock
# 这是MySQL服务器存储其数据文件的位置。
datadir = /var/lib/mysql
# 这是一个用于限制LOAD_FILE()和SELECT ... INTO OUTFILE命令的文件路径。如果此选项被设置,那么这两个命令只能用于读取在这个路径下的文件。设置为NULL表示禁用这个功能。
secure-file-priv= NULL
# 如果设置为0,MySQL服务器将不允许在数据目录中使用符号链接。这有助于防止安全风险。
symbolic-links=0
# 服务器唯一ID,默认是1
# 每个MySQL服务器实例在复制时需要有一个唯一的ID。这有助于区分不同的服务器,特别是在复制环境中
server-id=10
# 启用二进制日志记录所有对数据库的更改,这对于复制和恢复操作是必要的。
log-bin=mysql-bin
# 最大连接数
max_connections=1000
# 设置默认时区
default-time_zone='+8:00'
# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1
# 这告诉MySQL服务器从/etc/mysql/conf.d/目录中包含其他配置文件。这意味着该目录下的任何.cnf或.ini文件都会被合并到这个主配置文件中。
!includedir /etc/mysql/conf.d/
还有两个没有使用的参数
replicate_do_db : 待同步的数据库日志
replicate_ignore_db:不同步的数据库日志
4、运行 MysSQL 容器
创建主从复制的网络
docker network create --driver bridge mysql-source-replica
运行mysql容器
docker run -d \
# 给容器命名
--name mysql-source \
# 给予容器额外的权限。这意味着容器将拥有主机系统的所有权限
--privileged=true \
# 服务器启动时,自启动
--restart=always \
--network mysql-source-replica \
# 端口映射,第一个 3307 是映射出去的端口,第二个 3306 是这个容器的端口
-p 3307:3306 \
# 文件挂载, 前为宿主机的目录位置,后为容器内文件对应位置
-v /mysql/replication/source/data:/var/lib/mysql \
-v /mysql/replication/source/conf:/etc/mysql/conf.d \
-v /mysql/replication/source/log:/logs \
# 环境变量设置,此处是设置 ROOT 用户登录密码
-e MYSQL_ROOT_PASSWORD=123456 \
# 设置 MySQL 的时区
-e TZ=Asia/Shanghai mysql:8.0.27 \
# 让表名忽略大小写
--lower_case_table_names=1
5、登陆 MySQL
docker exec -it mysql-source /bin/bash
mysql -u root -p
6、配置远程访问
# 将 'root'@'%' 用户的身份认证方式修改为 mysql_native_password 插件,并设置密码为 123456。
#确保从库、客户端或工具能正常使用 root 登录
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
以上是主节点的创建方式。以下是从节点的创建方式。
从节点1
1、创建挂载目录
mkdir -p /mysql/replication/replica1/data /mysql/replication/replica1/conf /mysql/replication/replica1/log
3、准备配置文件
# 配置文件路径修改了
vim /mysql/replication/replica1/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# 服务器唯一ID,默认是1
# 服务器唯一ID修改了
server-id=11
# 启用二进制日志
log-bin=mysql-bin
# 最大连接数
max_connections=1000
# 设置默认时区
default-time_zone='+8:00'
# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1
!includedir /etc/mysql/conf.d/
4、运行 MysSQL 容器
docker run -d \
# 容器名称修改了
--name mysql-replica1 \
--privileged=true \
--restart=always \
--network mysql-source-replica \
# 对外端口修改了
-p 3308:3306 \
-v /mysql/replication/replica1/data:/var/lib/mysql \
-v /mysql/replication/replica1/conf:/etc/mysql/conf.d \
-v /mysql/replication/replica1/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1
4、登陆 MySQL
docker exec -it mysql-replica1 /bin/bash
mysql -u root -p
5、配置远程访问
# 将 'root'@'%' 用户的身份认证方式修改为 mysql_native_password 插件,并设置密码为 123456。
#确保从库、客户端或工具能正常使用 root 登录
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
从节点2
1、创建挂载目录
mkdir -p /mysql/replication/replica2/data /mysql/replication/replica2/conf /mysql/replication/replica2/log
3、准备配置文件
# 配置文件路径修改了
vim /mysql/replication/replica2/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# 服务器唯一ID,默认是1
# 服务器唯一ID修改了
server-id=12
# 启用二进制日志
log-bin=mysql-bin
# 最大连接数
max_connections=1000
# 设置默认时区
default-time_zone='+8:00'
# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1
!includedir /etc/mysql/conf.d/
4、运行 MysSQL 容器
docker run -d \
# 容器名称修改了
--name mysql-replica2 \
--privileged=true \
--restart=always \
--network mysql-source-replica \
# 对外端口修改了
-p 3309:3306 \
-v /mysql/replication/replica2/data:/var/lib/mysql \
-v /mysql/replication/replica2/conf:/etc/mysql/conf.d \
-v /mysql/replication/replica2/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1
4、登陆 MySQL
docker exec -it mysql-replica2 /bin/bash
mysql -u root -p
5、配置远程访问
#将 'root'@'%' 用户的身份认证方式修改为 mysql_native_password 插件,并设置密码为 123456。
#确保从库、客户端或工具能正常使用 root 登录
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
接下来的配置使主库的数据能同步到从库上
1、主库配置复制用户
# 先连接主库mysql-source
# 'test'@'%' 的 test 可以自己命名
CREATE USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'test'@'%';
flush privileges;
2、查看 master 机器的状态
# 主库上执行
SHOW MASTER STATUS;
结果
3、从节点设置主库信息,在从库 1 和从库 2 上执行
# MySQL 8.0.23 及这个版本之后执行下面的命令。
# 主数据库的IP地址
change replication source to source_host='182.169.69.185',
# 在主数据库创建的用于同步数据的用户账号
source_user='test',
# 在主数据库创建的用于同步数据的用户密码
source_password='123456',
# 主数据库的运行端口
source_port=3307,
# 指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数
source_log_file='mysql-bin.000003',
# 指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数
source_log_pos=1273,
# 连接失败重试的时间间隔,单位为秒
source_connect_retry=30;
# 在 MySQL 8.0.23之前执行这个命令
CHANGE MASTER TO
-> MASTER_HOST='source_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
4、开启从库
# 开启从库
start slave; (旧)
或者
start replica;
# 查看从库状态
# 看到Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates基本说明配置成功了,已经开始了主从复制。
show slave status \G; (旧)
或者
show replica status \G;