当前位置:网站首页>Docker实践经验:Docker 上部署 mysql8 主从复制
Docker实践经验:Docker 上部署 mysql8 主从复制
2022-08-01 23:44:00 【前端的哭】

文章目录
环境准备
需要一个 MySQL8 版本的 MySQL,因为我个人没有用过 mysql5,不知道二者是否会有一些特性上的偏差。
默认你与我的环境是一样的。
简易版本安装
先仅仅安装一个 MySQL,一上来就主从的话很多细节都会杂糅在一起。
docker run -d -p 3306:3306 --privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql
这里的参数介绍一下:
-p:指定内外端口映射,虚拟机为外,docker 容器为内,写在前面的为外部端口,写在后面的为内部端口。因为 MySQL 本身端口为 3306,为了不使你们混淆,我外部端口不设置为 3306。
-v:指定内外存储卷映射,Docker 实践经验(三)讲的就是这个。
-e:往容器内部传参,最后会由 MySQL 来接收。关于这个 -e 其实我也还没研究它的一个走势。
这样一个简易的 MySQL 就能动了。
设置密码
没有设置密码的话,不确定第二次要登录的时候是否还能进得去了。
不确定的意思就是可能进得去,可能进不去。
所以我们自行设置一个密码比较保险。
mysql> use mysql
mysql> update user set authentication_string='123456' where user='root' and host='localhost';
mysql> flush privileges;
不用注释吧。
现在这个 MySQL 能动了吧,可以考虑删掉了,咱开始做主从复制。
如果想留着用的:
修改 my.cnf,通过数据卷同步给MySQL:
cd /mysql/conf
vim my.cnf
插入以下内容:
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
重启MySQL:
docker restart mysql
docker exec -it mysql bash
配置 MySQL 主从复制
创建 bridge 网络并指定 IP 区间
docker network create --driver bridge mysql-master-slave
mysql连接数默认不够
set global max_connections=500;
set global mysqlx_max_connections=500;
创建数据和配置存放目录
# 创建主库数据存放目录
mkdir -p /home/docker/mysql/master/data
# 创建主库配置存放目录
mkdir -p /home/docker/mysql/master/conf
# 创建从库1数据存放目录
mkdir -p /home/docker/mysql/slave1/data
# 创建从库1配置存放目录
mkdir -p /home/docker/mysql/slave1/conf
准备配置文件
主数据库
[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
server-id=10
# 启用二进制日志
log-bin=mysql-bin
# 最大连接数
max_connections=10000
# 设置默认时区
default-time_zone='+8:00'
# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1
!includedir /etc/mysql/conf.d/
从数据库
[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
server-id=11
# 启用二进制日志
log-bin=mysql-bin
# 最大连接数
max_connections=10000
# 设置默认时区
default-time_zone='+8:00'
# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1
!includedir /etc/mysql/conf.d/
启动数据库
启动主数据库
如果上面完全按照我的步骤来,这里的命令也不用改参数。
docker run -d -p 3316:3306 --name mysql_master --restart=always --network mysql-master-slave -v /home/docker/mysql/master/data:/var/lib/mysql -v /home/docker/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql
启动从数据库
docker run -d -p 3326:3306 --name mysql_slave1 --restart=always --network mysql-master-slave -v /home/docker/mysql/slave1/data:/var/lib/mysql -v /home/docker/mysql/slave1/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql
远程访问配置(主从)
# 在容器 mysql_master 中开启一个交互模式的终端
docker exec -it mysql_master /bin/bash
# 在容器 mysql_slave1 中开启一个交互模式的终端
docker exec -it mysql_slave1 /bin/bash
# mysql 登录
mysql -u root -p
# 给予远程用户所有表所有权限
GRANT ALL ON *.* TO 'root'@'%';
# 更改加密规则
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
# 远程访问
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新权限
flush privileges;
主库创建复制用户
CREATE USER 'woniu'@'%' IDENTIFIED WITH mysql_native_password BY 'woniu123456';
GRANT REPLICATION SLAVE ON *.* TO 'woniu'@'%';
flush privileges;
查看 master 机器的状态
SHOW MASTER STATUS;

从库设置 master 的信息
如果前面完全按我的步骤来,这里需要填写你们自己宿主机上的 ip、还有上图中显示的那两个数据。
change master to master_host='192.168.190.133', master_user='woniu', master_password='woniu123456', master_port=3316, master_log_file='mysql-bin.000003', master_log_pos=2838, master_connect_retry=30;
参数释义:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
开启主从复制
# 开始同步
start slave;
# 同步状态
show slave status ;

如果成功,圈出来的地方要都是 yes、
如果失败,会显示日志:
可自行百度,不过百度出来的不一定就适用于咱,毕竟咱是在 docker 上部署的,现有资料较少。
要靠经验。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- Convert LocalDateTime to Date type
- 加载字体时避免隐藏文本
- 部门项目源码分享
- 高效工作文档产出归类
- nodejs--process
- YOLO等目标检测模型的非极大值抑制NMS和评价指标(Acc, Precision, Recall, AP, mAP, RoI)、YOLOv5中[email protected]与
- Making a Simple 3D Renderer
- [LeetCode304周赛] 两道关于基环树的题 6134. 找到离给定两个节点最近的节点,6135. 图中的最长环
- The third chapter of the imitation cattle network project: develop the core functions of the community (detailed steps and ideas)
- 使用Jenkins做持续集成,这个知识点必须要掌握
猜你喜欢

程序员如何优雅地解决线上问题?

The monthly salary of the test post is 5-9k, how to increase the salary to 25k?

TexturePacker使用文档

UML diagram of soft skills

2022还想上岸学习软件测试必看,测试老鸟的肺腑之言...

技术分享 | 接口测试中如何使用Json 来进行数据交互 ?

字节跳动面试官:请你实现一个大文件上传和断点续传

Making a Simple 3D Renderer

Classical Literature Reading--DLO

Appears in oozie on CDH's hue, error submitting Coordinator My Schedule
随机推荐
一道golang中关于iota的面试题
Check if point is inside rectangle
Several interview questions about golang concurrency
辛普森悖论
问题解决方式了
2022还想上岸学习软件测试必看,测试老鸟的肺腑之言...
如何进行数据库备份
解决端口占用
qt-faststart 安装使用
@Resource和@Autowired的区别
Oracle 数据库设置为只读及读写
几道关于golang并发的面试题
对于在新标签页中打开的链接,始终使用“noopener”或“noreferrer”
6133. Maximum number of packets
程序员如何优雅地解决线上问题?
Is TCP reliable?Why?
Nacos配置中心之加载配置
架构基本概念和架构本质
numpy.unique
Calculate the midpoint between two points