【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容器扮演主服务器(master)和从服务器(slave)
- 接收一条请求 在book_tab表中添加一条数据 ( insert)
- master: 执行sql,并写入到bin log日志【二进制文件】中用以记录master的数据库操作
- slave:开启IO线程读取bin log文件,并随后写入slave的relay log文件中
- slave:开启SQL线程,读取relay log中的数据,更新slave数据库中的内容
- 最终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 创建各个服务器在宿主机挂载的存储文件夹
[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 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 图形化客户端测试
4.3.2 防火墙开启指定端口
firewall-cmd --add-ports=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports
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 中查看的
4.8 启动slave服务器
start slave;
4.9 成功性验证
show slave status\G;
当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,修改步骤
- 关闭slave
stop slave;
- 重置slave的replay log
reset slave;
- 重新配置连接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
- 重新运行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
- 重新运行slave
start slave;