【docker】利用docker进行MySQL主从搭建

  • 1. 为什么搭建主从服务
  • 2. 实现原理(以1主1从为例)
  • 3. 关于bin log文件
  • 3.1 数据库中查看日志是否启用
  • 3.2 查看bin log的位置
  • 3.3 显示所有日志文件
  • 3.4 查询bin log日志内容
  • 4. 搭建步骤
  • 4.1 创建各个服务器在宿主机挂载的存储文件夹
  • 4.2 从容器中拷贝原始配置文件my.cnf
  • 4.3 搭建主(master)服务器(docker容器)
  • 4.3.1 图形化客户端测试
  • 4.3.2 防火墙开启指定端口
  • 4.4 master服务器配置my.cnf
  • 4.4.1 vim—linux的文本编辑器简单使用
  • 4.5 创建从(slave)服务器
  • 4.5.1 创建宿主机挂载文件夹与配置文件
  • 4.5.2 修改从服务器的配置文件
  • 4.5.3 创建slave容器
  • 4.6 master创建用户进行主从关联
  • 4.7进入slave容器,使用上步创建的用户进行连接master
  • 4.8 启动slave服务器
  • 4.9 成功性验证
  • 5. 相关问题
  • 5.1 slave数据库中为什么依然能够写入数据?
  • 5.2 主从配置出现非两个YES,修改步骤


1. 为什么搭建主从服务

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

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

Docker的MySQL安装在什么目录下 docker配置mysql_笔记

创建两个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 创建各个服务器在宿主机挂载的存储文件夹

Docker的MySQL安装在什么目录下 docker配置mysql_笔记_02

[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容器)

Docker的MySQL安装在什么目录下 docker配置mysql_服务器_03

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 图形化客户端测试


Docker的MySQL安装在什么目录下 docker配置mysql_笔记_04

4.3.2 防火墙开启指定端口
firewall-cmd --add-ports=3306/tcp --permanent 
firewall-cmd --reload
firewall-cmd --list-ports

Docker的MySQL安装在什么目录下 docker配置mysql_服务器_05

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键
  • 按下esc键,退出编辑状态
  • 存储:按下shift+;
  • 退出并存储

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 中查看的

Docker的MySQL安装在什么目录下 docker配置mysql_服务器_06

4.8 启动slave服务器

start slave;

4.9 成功性验证

show slave status\G;

Docker的MySQL安装在什么目录下 docker配置mysql_docker_07

当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;