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,就会很恼火,要重新配置了!!!遇到问题的时候,记得看日志,日志是有报错信息的!!!