docker - MySQL8.0 一主两从复制实战

环境:腾讯云轻量级服务器-安装系统(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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值