MySQL的主从搭建

时间:2024-11-18 13:11:20

MySQL主从搭建

1.为什么要建立主从搭建

在说明为什么要建立主从关系前,先解释下什么是MySQL的主从。它是一种常见的数据库架构其中一个数据库服务器(主服务器)将其更新或更改复制到一个或多个其他数据库服务器(从服务器)。

它的好处有:

1.负载分摊:当我们进行读的操作时,可以从多个服务器上读取,减轻主服务器的负载,其中从服务器只负责读的操作。

2.高可用性:当我们的主服务器出现故障的时候,可以使用从服务器,不至于当我们的主服务器宕机的时候,我们的系统就停用了。

3.数据备份:当我们的主服务器出现问题的时候,数据丢失,可以在从服务器进行恢复、备份。

原理图:master为主服务器,slave为从服务器。

2.主从搭建的步骤

2.1创建储存的文件夹

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

这里我们在mysql文件夹下又创建了三个文件夹对应不同的端口号,并每个文件夹下都创建了conf、data两个文件夹。大家可以tree看下目录结构,如果没有tree这个操作可以通过 yum -y install tree 这个命令进行下载。

2.2将文档拷贝到conf文件夹下

这里我们是还没有创建mysql容器的,所以我们先创建一个简单的测试的容器来生成文档。

docker run -it --name mytest -e MYSQL_ROOT_PASSWORD=123 -d mysql  #生成容器

生成容器好以后,我们进入到容器。

[root@localhost mysql]# docker exec -it mysql_3306 bash
root@aa39b507c2fe:/# cd /etc/mysql
root@aa39b507c2fe:/etc/mysql# ls

这里可以看到我们的这个测试的mysql的容器是有一个的文档了。我们下一步就是把这个文档复制到我们的3306底下的conf文件下里面。

第一步:我们先推出容器内部,exit。

第二步:cd到我们要的目录底下。

第三步:拷贝。

docker cp mytest:/etc/mysql/ ./

这里解释下:

docker cp 容器名称:文件地址 目标地址

mytest 就是我们的容器名称

/etc/mysql/ 就是我们刚刚看到的容器内的路径

./ 是当前位置

就是把这个容器的这个文档复制到当前位置。

这里我们就成功在conf文件夹下复制了一份的文档

2.3搭建主和从的服务器

[root@localhost conf]# docker run -it \
> --name mysql_3306 \
> --privileged \
> -p 3306:3306 \
> --network wn_docker_net \
> --ip 172.18.12.2 \
> -v /usr/local/software/mysql/3306/conf/:/etc/mysql/ \
> -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=123 \
> -d mysql
8082746f0166b1b2931fd628bbe41343bbcb2437263bc812174b6fc3637aaf8b
[root@localhost conf]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
8082746f0166   mysql     "…"   7 seconds ago   Up 6 seconds   33060/tcp, 0.0.0.0:3311->3306/tcp, :::3311->3306/tcp   mysql_3311
90a492f14ab9   mysql     "…"   4 hours ago     Up 3 hours     33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql_3310
aa39b507c2fe   mysql     "…"   5 hours ago     Up 4 hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_3306

注:这里我是已经将三个容器都创建好了,3306为主服务器,其它两个为从服务器。在run的时候记住一些注意事项:

1.--name 容器名称

2.--privileged 权限

3.-p 端口号 右边的3306不能动,只改左边的

4.--newwork 自定义网络

--ip 自定义ip 不能重复

5.-v 挂载 在容器内部,相当于一个小的Linux,有一些命令是没有的,我们通过-v之后,就可以在外面的Linux编辑后,容器内部的文件也跟着改变,方便我们操作。

6.-e 设置容器运行时的环境参数 这里设置的是我们的密码

7.-d 后台运行

这里我们重复操作之后,就会创建好我们的三个服务器了(容器)。这里创建报错的时候我们可以 docker logs 容器名称 查看日志来看为什么创建失败,run的时候一定要注意路径什么的有没有问题。

接着我们就是验证下我们的链接到数据库有没有问题:

这里我们就成功的把三个容器都成功的创建好,并和数据库绑定好了。如果失败了,有很多原因,这里展示下因为防火墙问题的解决办法。

firewall-cmd --add-ports=3306/tcp --permanent 
firewall-cmd --reload
firewall-cmd --list-ports 

这是永久关闭防火墙了,可以自行查资料怎么用。

2.4编辑服务器配置

我们前面在每个端口相应的文件夹下的conf文件夹下的文档就是我们的服务器配置了,我们接下来就进行编辑操作,来实现我们的主从搭建的准备工作,这里编辑的时候一定要注意,一不小心就会导致容器启动失败。

[root@localhost conf]# pwd
/usr/local/software/mysql/3306/conf
[root@localhost conf]# vim 

这里我们是在3306底下通过vim 命令来编辑文档

进入到这个页面过后,我们就开始编辑:

1.按i键进入到编辑的功能

2.进行配置

后按住shift加;也就是我们的:后面输wq就是保存退出 q!强制退出不保存

下面展示三个配置文件的内容:

主3306:

server-id=200   
log_bin=wnhz-master-logbin    
binlog_format=row

从3310:

server-id=201    
log_bin=wnhz-slave-01-logbin    
relay_log=wnhz-slave-01-relay
read-only=1

从3311:

server-id=202    
log_bin=wnhz-slave-01-logbin    
relay_log=wnhz-slave-01-relay
read-only=1

server-id:服务器id唯一的

log_bin:主服务器的日志文件

relay_log:从服务器的日志文件

read-only:只读

这里id必须是唯一的,其它的名称自行更改

我们这里修改保存退出以后,将容器重新启动然后进入到容器内看下信息

第一步:重启容器

[root@localhost conf]# docker restart mysql_3311

第二步:查看容器

[root@localhost conf]# docker ps

第三步:进入容器

[root@localhost conf]# docker exec -it mysql_3311 bash
root@8082746f0166:/# mysql -uroot -p123

第四步:查看信息

mysql> show master status;

这里可以看到我们是成功修改了的,然后这个信息我们是在容器内查看的,我们也可以在数据库中通过sql语句查到的。

红色框出来的信息很重要,一会要搭建主从关系的时候会用到。

2.5进行主从关联

2.5.1主服务器创建用户slave

在数据库中,在mysql_3306下新建一个查询,然后直接sql语句

create user 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123';
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;

2.5.2进入从容器的内部连接mysql
change master to master_host='172.18.12.2', master_user='slave',master_password='123',MASTER_LOG_FILE='wnhz-master-logbin.000004',MASTER_LOG_POS=156;
2.5.3启动slave
start slave;
2.5.4查询slave状态
show slave status \G;

如果这两个都是yes那么就是搭建成功了。如果有一个no或者两个都是那就是有问题。

ps:解决办法步骤

1.关闭slave

stop slave;

2.重置slave:replaylog

reset slave;

3.重新配置change to

show master status;    #maseter   在数据库mysql_3306下查询
​
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

4.重新启动slave

start slave;

这里都是yes之后就是弄好了。

2.6在数据库中进行验证

在mysql_3306底下建一个book_tab的表字段如下,随意建就行。

在mysql_3310下刷新会出现刚刚我们建的表和信息。

这里还是有问题的,在我们的mysql_3310下,我们是用root登录的,它的权限很高,在mysql_3310中也可以进行添加等操作,我们最开始的时候就说了,主从中,从只负责读,不负责其它的操作。所以我们需要创建用户来实现只读的操作。

2.6.1创建只读的用户
create user 'sd'@'%' IDENTIFIED WITH mysql_native_password BY '123';   #sd是随意创建的名称
GRANT SELECT ON *.* TO 'sd'@'%';
flush privileges;

点击编辑,然后用我们刚刚创建的用户进行登录,然后进行测试就ok了,这里基本上是把主从的搭建流程过了一遍。

补充:如果第一次用3310这个从的服务器搭建成功后,我们建表测试后,想再搭建一个从的服务器,也就是一主二从的时候,一定要注意,将之前我们测试建的表全部删除,或者在3311下导入之前建的表,总之就是要同步信息,否则你在进行测试的时候由于它的不一致性,会导致mysql_3306建表之后,mysql_3311是没有反应的,当你进入mysql_3311的容器的时候,进行show的操作时,会发现下面那个yes变成了no,就会很恼火,要重新配置了!!!遇到问题的时候,记得看日志,日志是有报错信息的!!!