基于docker实现主从复制

1:实现主从复制这个过程我是趟过坑的,后面是自己动手搞了几遍都成功了以后才开始决定记录的,(所以有的截图和上下文对不上的,比如说docker容器的名字对应不上,大家就用自己的就好),打算从centos8安装docker开始到最后实现主从复制,所以我从一开始将原有docker卸载开始记录的,如果你有docker了的话,可以跳过卸载docker步骤。
2:建议刷到帖子的小伙伴不着急上手,先浏览完再上手
3:描述有误的地方欢迎大家不吝赐教,找到我v:star2020082220210611

卸载docker

1:删除docker容器

 sudo docker stop $(docker ps -aq)

基于docker实现主从复制_第1张图片
注意:这个命令会停止所有容器,包括正在运行的容器和已经停止的容器
2:删除所有容器:

sudo docker rm $(docker ps -aq)

注意:由于我这里只有一个docker,而且已经执行了docker rm 容器id/容器名称这个命令来删除容器了。所以这里就不贴图了

3:删除所有镜像(我这里就一个mysql5.7的镜像,不过删除的这个过程有点花时间,稍微等下哈)

sudo docker rmi $(docker images -q)

基于docker实现主从复制_第2张图片
基于docker实现主从复制_第3张图片
注意:这个命令会删除所有镜像,包括正在运行的镜像和已经停止的镜像;执行这个命令时,命令行会给出二次确认提示y/n,选择y代表继续执行删除操作。出现上面第二个界面代表删除完毕。

4:卸载docker

sudo yum remove docker-ce docker-ce-cli containerd.io

基于docker实现主从复制_第4张图片

5:删除docker数据目录

sudo rm -rf /var/lib/docker

注意:这个命令会删除 Docker 数据目录,包括所有容器、镜像和数据卷。

上面这些操作是因为我想从安装docker开始从头到尾记录,在搭建的过程中躺了几次坑,后面搭建成功后我又删除了几次,反复实验都能实现主从复制,所以记录下。大家不需要删除docker的可以直接从下面的步骤开始,希望能帮到其他小伙伴。

接下来从centos中安装docker镜像开始。

首先centos中安装docker镜像:
1:更新数据源

 sudo yum update

基于docker实现主从复制_第5张图片

2:安装docker运行时需要的一些工具和依赖库,因为这些centos8中并不完整,需要进行安装

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

基于docker实现主从复制_第6张图片
3:下载docker包

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在这里插入图片描述

4:安装docker社区版:(这个过程也需要等待会儿哈)

sudo yum install -y docker-ce

基于docker实现主从复制_第7张图片
基于docker实现主从复制_第8张图片
5:设置docker服务并启动

sudo systemctl enable docker

在这里插入图片描述

sudo systemctl start docker

在这里插入图片描述

注意:也可以一起执行:sudo systemctl enable docker &&sudo systemctl start docker

6:查询docker版本

sudo docker --version

在这里插入图片描述
至此docker已经安装完成了,接下来是mysql

拉取mysql镜像,这里以mysql5.7版本为例

1:拉取mysql5.7镜像

docker pull mysql:5.7

基于docker实现主从复制_第9张图片
注意:这个过程需要等待哈
2:查看镜像

docker images

在这里插入图片描述
3:随便创建一个mysql容器,这里的主要目的是为了复制mysql配置文件,因为我是想将mysql的配置文件my.cnf挂载出去,方便修改

docker run -d --name master mysql:5.7

基于docker实现主从复制_第10张图片

注意:这里是创建一个mysql容器并运行,如果需要查看mysql的配置文件my.cnf需要执行以下命令,不需要的可以跳过
步骤1:创建容器并启动

docker run -d -p 3333:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7

在这里插入图片描述

解释下含义:

docker run -d -p 3333:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7
这个 docker 命令用于在 docker 中运行一个 MySQL 容器,以下是命令中各个参数的含义:
docker run:用于在 docker 中运行一个容器的命令。
-d:表示在后台(detached 模式)运行容器,即不在终端上显示容器的输出。
-p 3333:3306:将主机(Host)的 3333 端口映射到容器的 3306 端口。这意味着你可以通过主机的 3333 端口访问容器中的 MySQL 服务。
--name master:指定容器的名称为 "master"。
-e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 根用户的密码为 "123456"。这里使用环境变量来传递密码给容器内的 MySQL 服务。
docker.io/mysql:5.7:表示使用 Docker Hub 上的 mysql 镜像,并指定标签为 5.7。
综合起来,这个命令的作用是在 Docker 中创建一个 MySQL 5.7 版本的容器,
容器名称为 "master",
通过主机的 3333 端口访问 MySQL 服务,并设置根用户密码为 "123456"。
容器在后台运行,不在终端上显示输出。

步骤2:进入容器的shell

docker exec -it master bash

步骤3:查看默认的my.cnf配置文件

ls /etc/my.cnf
cat /etc/my.cnf
或者是
ls /etc/mysql/my.cnf
cat /etc/mysql/my.cnf

基于docker实现主从复制_第11张图片
4:创建并启动了docker开始创建文件夹,将mysql的默认配置文件拷贝进来,然后修改配置,在挂载出去,这样方便我们修改mysql的配置文件。

mkdir mysql // home文件下创建mysql文件

mkdir /home/mysql/master // mysql文件夹下创建主库文件夹master

mkdir /home/mysql/slave // mysql文件夹下创建从库文件夹slave

基于docker实现主从复制_第12张图片
5:复制配置文件到上面创建的主从文件的my.cnf配置文件中
主文件夹:

docker cp master:/etc/my.cnf /home/mysql/master

从文件夹:

docker cp master:/etc/my.cnf /home/mysql/slave

查看是否复制成功
在这里插入图片描述
6:删除上面正在运行的容器

docker ps -a  //查看
docker stop master  //停止 ,test是我上面创建的容器的名字
docker rm master //删除

基于docker实现主从复制_第13张图片

7:启动主容器

docker run -d \
--restart=always \
-p 3306:3306 \
-v /home/mysql/master/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
--name master mysql:5.7

以上docke命令中各个参数的含义:

docker run:用于在 Docker 中运行一个容器的命令。
-d:表示在后台(detached 模式)运行容器,即不在终端上显示容器的输出。
-p 3333:3306:将主机(Host)的 3333 端口映射到容器的 3306 端口。这意味着你可以通过主机的 3333 端口访问容器中的 MySQL 服务。
--name master:指定容器的名称为 "master"。
-e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 根用户的密码为 "123456"。这里使用环境变量来传递密码给容器内的 MySQL 服务。
docker.io/mysql:5.7:表示使用 Docker Hub 上的 mysql 镜像,并指定标签为 5.7。

基于docker实现主从复制_第14张图片

8:进入主库的配置文件并在文件[mysqld]下新增以下内容,保存后退出。

vim /home/mysql/master/my.cnf

在这里插入图片描述

## 设置server_id, 同一个局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql,information_schema
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

基于docker实现主从复制_第15张图片
9:重新启动主库容器

docker restart master

基于docker实现主从复制_第16张图片
注意:要保证master库启动成功后再继续下面的步骤,否则就会再登录mysql的时候报错,提示用户名密码不正确,如图所示。可以查看日志,当出现图二红框中所示代表启动成功了,这个时候再继续下面的步骤,去登录mysql的时候就不会报错
基于docker实现主从复制_第17张图片

docker logs master   //查看容器名为master的日志

基于docker实现主从复制_第18张图片

10:主库中创建数据同步,分为以下几个步骤
步骤1:mysql容器

docker exec -it master bash

步骤2:登录mysql

mysql -uroot -p123456

步骤3:授予 名为"slave" 的用户从主数据库复制数据的权限

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

具体含义:

GRANT REPLICATION SLAVE:授予从数据库复制数据的权限。
ON *.*:将权限应用于所有数据库和所有表。
TO 'slave'@'%':授予 "slave" 用户在任何主机上的访问权限。'%' 表示任意主机。
IDENTIFIED BY '123456':设置用户 "slave" 的密码为 "123456"。

步骤4:授予名为 “slave” 的用户在从数据库复制数据和执行一些客户端操作所需的权限

grant replication slave, replication client on *.* to 'slave'@'%';

具体含义:

grant replication slave:授予从数据库复制数据的权限。
replication client:授予从数据库执行一些客户端操作的权限,例如读取主数据库的二进制日志信息。
on *.*:将权限应用于所有数据库和所有表。
to 'slave'@'%':授予 "slave" 用户在任何主机上的访问权限。'%' 表示任意主机

步骤5:刷新

flush privileges;

步骤6:查看主从同步状态记录该状态下的master_log_file和master_log_pos,这两个参数值需要记住,后面会用到

show master status;

基于docker实现主从复制_第19张图片
然后ctrl+d退出即可。
注意:上面的步骤也可以在navicat中操作 。
1:新建mysql链接登录数据库
2:执行命令(按顺序执行哈)

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456'; 
grant replication slave, replication client on *.* to 'slave'@'%';
flush privileges;
show master status;

11:启动从容器

docker run -d \
--restart=always \
-p 3307:3306 \
-v /home/mysql/slave/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
--name slave mysql:5.7

基于docker实现主从复制_第20张图片
12:修改从库配置文件,并在[mysqld]下新增以下内容:

vim /home/mysql/slave/my.cnf

在文件[mysqld]中新增以下内容:


## 设置server_id, 同一个局域网内需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql,information_schema
## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置只读(具有super权限的用户除外)
read_only=1

基于docker实现主从复制_第21张图片
13:重新启动从容器

docker restart slave

在这里插入图片描述
14:从库中创建数据同步用户,分为以下几个步骤
步骤1:进入mysql容器

docker exec -it slave bash

基于docker实现主从复制_第22张图片

步骤2:登录mysql

mysql -uroot -p123456

基于docker实现主从复制_第23张图片

步骤3:配置 MySQL 主从复制中从数据库的连接和同步信息,它告诉从数据库如何连接到主数据库以获取数据的复制更新。

CHANGE MASTER TO master_host = '192.168.0.25',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mall-mysql-bin.000001',
master_log_pos = 807,
master_connect_retry = 30;

上面这段 SQL 各个参数的含义:

master_host = '192.168.0.25':这是主数据库的 IP 地址或主机名。从数据库将连接到该主数据库来获取复制数据。

master_user = 'slave':这是连接主数据库所使用的用户名。通常创建一个用于复制的专用用户。

master_password = '123456':连接主数据库所使用的密码,与上述用户名对应。

master_port = 3306:主数据库的端口号,通常为 MySQL 默认的端口号 3306。

master_log_file = 'mall-mysql-bin.000001':这是主数据库二进制日志中的日志文件名,它包含复制数据的更新记录。

master_log_pos = 807:这是主数据库二进制日志文件中的位置,指示从数据库在何处开始读取二进制日志以进行复制。

master_connect_retry = 30:在连接主数据库失败时,从数据库会尝试重新连接的时间间隔(以秒为单位)。

总体而言,这些配置参数告诉从数据库应该连接到哪个主数据库,使用哪个用户和密码来获取复制数据,并从主数据库的指定二进制日志位置开始同步数据。这是主从复制配置的一部分,使得从数据库可以与主数据库保持数据同步。在执行 CHANGE MASTER TO 后,从数据库可以开始运行复制进程,从主数据库同步数据更新。

基于docker实现主从复制_第24张图片
13:查看状态,此时Slave_IO_Running、Slave_SQL_Running都为No

show slave status \G;

基于docker实现主从复制_第25张图片

14:开启主从同步

start slave;

基于docker实现主从复制_第26张图片

15:再次查看主从同步状态, 此时Slave_IO_Running、Slave_SQL_Running都为 Yes

show slave status \G;

基于docker实现主从复制_第27张图片
注:上面的步骤也可以在navicat中进行,步骤如下:
步骤1:新建mysql链接登录数据库
步骤2:配置 MySQL 主从复制中从数据库的连接和同步信息

CHANGE MASTER TO master_host = '192.168.0.25',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mall-mysql-bin.000001', //与主库中一致
master_log_pos = 1444, // 与主库中一致
master_connect_retry = 30;

步骤3:查看主从同步状态# 此时Slave_IO_Running、Slave_SQL_Running都为 No

show slave status;

步骤4:开启主从同步

start slave;

步骤5:再次查看主从同步状态# 此时Slave_IO_Running、Slave_SQL_Running都为 Yes

show slave status;

16:从库的Slave_IO_Running、Slave_SQL_Running都为Yes时代表主从配置成功了,接下来就可以去nacivat中创建链接,连接成功后创建数据库,插入数据,就可以验证主从是否同步啦,也可以在命令行中进行,我以nacivat中为例,创建库,表,插入数据,看是否同步
验证1:库是否同步
主库新建一个数据库:test
基于docker实现主从复制_第28张图片
从库刷新一下再看:
基于docker实现主从复制_第29张图片
结论:从数据库中也存在了一个test库
验证2:表是否同步
主库中创建一张表
基于docker实现主从复制_第30张图片基于docker实现主从复制_第31张图片

从库刷新下再看:
基于docker实现主从复制_第32张图片
结论:从库中也存在了user表
验证3:数据是否同步

基于docker实现主从复制_第33张图片
从库刷新下再看:
基于docker实现主从复制_第34张图片
结论:从库中也存在了user表中的数据
到此,就算完结啦,描述有误的地方欢迎大家指正。

你可能感兴趣的:(docker,mysql,docker)