【docker】Docker配置Mysql主从

1. 为什么搭建主从服务

​ 由于单个服务器如tomcat同时接收请求的数量有限,当存在大量请求时,就需要使用多个服务器(此处为mySQL)协同工作来解决。即采用分布式来保证服务器的稳定性

2. 实现原理(以1主1从为例)

创建两个docker容器扮演主服务器(master)和从服务器(slave)

  1. 接收一条请求 在book_tab表中添加一条数据 ( insert)

  2. master: 执行sql,并写入到bin log日志【二进制文件】中用以记录master的数据库操作

  3. slave:开启IO线程读取bin log文件,并随后写入slave的relay log文件中

  4. slave:开启SQL线程,读取relay log中的数据,更新slave数据库中的内容

  5. 最终slave服务器中也添加了一条数据。

3. 关于bin log文件

3.1 数据库中查看日志是否启用
show variables like 'log_bin';
3.2 查看bin log的位置
show variables like '%datadir%';
3.3 显示所有日志文件
show binary logs;
3.4 查询bin log日志内容
show binlog events in 'wnhz-master-bin.000001';

4. 搭建步骤

4.1 创建各个服务器在宿主机挂载的存储文件夹

image-20230728145745467

[root@localhost local]# mkdir -p  softwares/mysql/3306  software/mysql/3310 software/mysql/3311
[root@localhost local]# cd software/
[root@localhost local]# mkdir -p  mysql/3306/conf mysql/3306/data

4.2 从容器中拷贝原始配置文件my.cnf

/etc/mysql/my.cnf 容器原始my.cnf位置

注意:也有可能my.cnf文件不在/etc/mysql下可以使用mysql --help | grep my.cnf查找

docker cp 容器名称:容器文件地址 [空格]目标地址(此处为宿主机外的目标地址)

./ —表示当前位置

# 创建一个容器,将其原始配置文件my.cnf 拷贝到宿主机指定位置
docker run -it --name mytest -e MYSQL_ROOT_PASSWORD=123 -d mysql
docker cp mytest:/etc/mysql/my.cnf ./

4.3 搭建主(master)服务器(docker容器)

image-20231009194039958

docker run \
-it \
--name mysql_3306 \
--privileged \
--network wn_docker_net \
--ip 172.18.12.2 \
-p 3306:3306 \
# -v 为挂载参数, :前为宿主机的文件 :后为容器中的数据文件
-v  /usr/local/software/mysql/3306/conf/my.cnf:/etc/mysql/my.cnf \
-v  /usr/local/software/mysql/3306/data:/var/lib/mysql \
# 该行非必须
-v /usr/local/software/mysql/3306/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
4.3.1 图形化客户端测试
image-20231009143810137
4.3.2 防火墙开启指定端口
firewall-cmd --add-ports=3306/tcp --permanent 
firewall-cmd --reload
firewall-cmd --list-ports 

image-20231009150400719

4.4 master服务器配置my.cnf

​ 由于已经将宿主机的文件与容器进行关联了,因而只需修改宿主机目标位置的配置文件,随后重启包含master服务器的容器即可实现同步修改。

# 在拷贝的my.cnf文件中添加以下配置
default_authentication_plugin=mysql_native_password #非必须
# Custom config should go here
server-id=200    #server‘id
log_bin=wnhz-master-logbin    #logbin name
binlog_format=row #设置binlog 文件按找记录行的形式存储
4.4.1 vim—linux的文本编辑器简单使用
  • 编辑: 按下i键,或者insert键

    image-20231009151255780

  • 按下esc键,退出编辑状态

  • 存储:按下shift+;

    image-20231009151413784

  • 退出并存储

    image-20231009151452625

4.5 创建从(slave)服务器

4.5.1 创建宿主机挂载文件夹与配置文件

​ 拷贝my.cnf文件,这里可以直接复制主服务器的my.cnf文件,随后进行修改

# mysql_3306 即为主服务器的容器名 ./表示的是当前宿主机目标地址
docker cp mysql_3306:/etc/mysql/my.cnf ./
4.5.2 修改从服务器的配置文件
default_authentication_plugin=mysql_native_password #非必须

# Custom config should go here
!includedir /etc/mysql/conf.d/

server-id=201    #slave's id
log_bin=slave-01-logbin    #logbin name
relay_log=slave-01-relay   #relay_log name
read-only=1  #设置只读权限
4.5.3 创建slave容器
docker run \
-it \
--name mysql_3310 \
--privileged \
--network wn_docker_net \
--ip 172.18.12.3 \
-p 3310:3306 \
-v  /usr/local/software/mysql/3310/conf/my.cnf:/etc/mysql/my.cnf \
-v  /usr/local/software/mysql/3310/data:/var/lib/mysql \
-v /usr/local/software/mysql/3310/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql

4.6 master创建用户进行主从关联

-- 创建名为slave的用户,%表示任意ip都可登录该用户
create user 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123';
-- 授权slave 主从关联权限  ON 后 *.* 表示任意数据库、任意表
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
-- FLUSH PRIVILEGES 是一条用于刷新授权表的命令。
-- 当对MySQL的用户和权限进行更改时,比如创建新用户、修改用户权限等操作,这些更改不会立即生效。相反,MySQL会将更改缓存起来,并在下次启动MySQL时加载到内存中。
-- 使用 FLUSH PRIVILEGES 命令可以使MySQL立即重新加载授权表,以便在更改用户或权限后立即生效。执行这个命令后,MySQL会关闭和重新加载授权表,从而强制更新当前连接下的用户、角色和权限设置。
flush privileges;

4.7进入slave容器,使用上步创建的用户进行连接master

change master to master_host='172.18.12.2', master_user='slave',master_password='123',MASTER_LOG_FILE='wnhz-master-logbin.000001',MASTER_LOG_POS=156;
-- MASTER_LOG_FILE、MASTER_LOG_POS 变量是从主服务器的show master status 中查看的

image-20231009151816611

4.8 启动slave服务器

start slave;

4.9 成功性验证

show slave status\G;

image-20231009170203333

​ 当master中添加数据时,slave中会自动同步数据(表、记录等)

5. 相关问题

5.1 slave数据库中为什么依然能够写入数据?

原因:从服务器使用root用户登录,不受到my.cnf 配置中只读的约束

解决方案:

​ 创建一个用户做从处理,权限只能是读操作。

create user 'sd'@'%' IDENTIFIED WITH mysql_native_password BY '123';
GRANT SELECT ON *.* TO 'sd'@'%';
flush privileges;

5.2 主从配置出现非两个YES,修改步骤

  1. 关闭slave
stop slave;
  1. 重置slave的replay log
reset slave;
  1. 重新配置连接master的用户和MASTER_LOG_FILE等参数
show master status;    #先在maseter中执行

change master to master_host='172.18.12.2', master_user='slave',master_password='123',MASTER_LOG_FILE='wnhz-master-logbin.000001',MASTER_LOG_POS=156;  #slave
  1. 重新运行slave
start slave;
show master status;    #先在maseter中执行

change master to master_host='172.18.12.2', master_user='slave',master_password='123',MASTER_LOG_FILE='wnhz-master-logbin.000001',MASTER_LOG_POS=156;  #slave
  1. 重新运行slave
start slave;
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
配置 MySQL 主从复制在 Docker 中,你可以按照以下步骤进行操作: 1. 首先,创建一个用于存储 MySQL 数据的文件夹。例如,创建一个名为 `mysql-data` 的文件夹: ``` mkdir mysql-data ``` 2. 创建一个名为 `mysql-master` 的容器,并启动一个 MySQL 实例作为主数据库: ``` docker run -d --name mysql-master -v /path/to/mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=<root密码> -e MYSQL_DATABASE=<数据库名> mysql:latest ``` 3. 创建一个名为 `mysql-slave` 的容器,并连接到主数据库的网络中。确保将 `<master_IP>` 替换为主数据库容器的 IP 地址: ``` docker run -d --name mysql-slave --network container:mysql-master -e MYSQL_ROOT_PASSWORD=<root密码> -e MYSQL_DATABASE=<数据库名> mysql:latest ``` 4. 检查容器是否正常运行: ``` docker ps ``` 5. 在主数据库中进行配置。进入 `mysql-master` 容器内部: ``` docker exec -it mysql-master bash ``` 6. 进入 MySQL 命令行: ``` mysql -uroot -p<root密码> ``` 7. 在 MySQL 命令行中执行以下命令来配置主数据库: ``` GRANT REPLICATION SLAVE ON *.* TO '<用户名>'@'<从节点IP>' IDENTIFIED BY '<密码>'; FLUSH PRIVILEGES; SHOW MASTER STATUS; ``` 8. 记下 `SHOW MASTER STATUS;` 命令的输出内容,包括 `File` 和 `Position` 的值。 9. 在从数据库中进行配置。进入 `mysql-slave` 容器内部: ``` docker exec -it mysql-slave bash ``` 10. 进入 MySQL 命令行: ``` mysql -uroot -p<root密码> ``` 11. 在 MySQL 命令行中执行以下命令来配置从数据库: ``` CHANGE MASTER TO MASTER_HOST='<主节点IP>', MASTER_USER='<用户名>', MASTER_PASSWORD='<密码>', MASTER_LOG_FILE='<主节点的File值>', MASTER_LOG_POS=<主节点的Position值>; START SLAVE; ``` 12. 检查主从复制是否正常运行: ``` SHOW SLAVE STATUS\G ``` 完成上述步骤后,你应该已经成功配置Docker 中的 MySQL 主从复制。请确保在命令中替换 `<root密码>`、`<数据库名>`、`<用户名>`、`<从节点IP>`、`<密码>`、`<主节点IP>`、`<主节点的File值>` 和 `<主节点的Position值>` 为实际的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值