前言:
redis的主从复制算是redis的进阶使用了,不再停留于redis的键值对使用。看了两篇博客,又看了看狂神的视频,简单了解了一下主从复制。 其实就是启动多个redis,把多个redis给连接在一起,master主机用来存写,slave用来读取。
我在服务器里面输命令的时候一直出现下面问题,就顺便解决了一下。
Xshell一直出现^c ,不知道怎么一直按Ctrl +C_干净的坏蛋的博客-CSDN博客
一些需要用到的命令:
docker exec -it 容器名 bash// 进入到容器里面
cd /usr/local/bin //进入到这个目录下面
//我们可以看到redis-cli 和redis-server都在这个地方
redis-cli -p 端口号 //登录到redis里面,报错WRONGPASS invalid username-password pair or user is disabled的话,我们输入一下redis的密码即可
info replication //查看此redis的一些信息
# Replication
role:master //主机
connected_slaves:0 //从机数量
master_failover_state:no-failover
进行上面的操作之后,觉得有点不对劲,既然主从复制的每一个redis库都是一个redis服务端,那我docker启动一个redis,只能算是一个redis,所以我应该使用docker启动多个redis。
我去网上找了一篇博客,发现确实如此Docker搭建redis主从复制xiaoweiwei99的博客-CSDN博客docker redis主从复制。
我们直接启动两个redis
docker run -d --privileged=true -p 6379:6379 --restart always -v /usr/local/redis/conf/redis.conf:/etc/redis.conf -v /root/usr/local/redis/data:/data --name redisStudy redis redis-server /etc/redis.conf docker run -d --privileged=true -p 6380:6379 --restart always -v /usr/local/redis/conf/redis6380.conf:/etc/redis6380.conf -v /root/usr/local/redis/data6380:/data --name redis-slave1 redis redis-server /etc/redis6380.conf
我们上面使用的配置文件,虽然名字不同,但是里面的内容是相同的(先提前说一下这样是不对的,但是为了发现问题,我们需要故意这样做)
再补充一点就是,上面的端口映射,前面是外部访问我们服务器的端口,后面是我们容器内的端口,由于不是同的容器,所以后面都写6379是没有任何问题滴。
我们通过上面的命令启动了多个redis服务端,我们已经可以开始实现主从复制了
通过快捷命令登录到客户端
我们先来登录到主机redisStudy中=
docker exec -it redisStudy redis-cli -p 端口号// 这里的端口号必须和redis.conf配置文件里面的相对应,配置文件里面默认的是6379,如果我们不指定端口进入的话,默认就是6379 #接下来查看一下redis-slave1的信息 info replication //我们可以通过这个命令来看到到我们的机器是从机还是主机,如果没有配置的话,任何一个redis都是master主机
在主从复制的时候,我们一般不用动主机,只用动从机就可以了。
我们登录到从机上,在从机上面添加主机
docker exec -it redis-slave1 redis-cli #直接进入启动redis客户端,如果不加-p的话,就默认进入6379端口
我们现在进入到了redis-slave1,我们可以看到我们当前的redis服务端也是主机,我们需要给redis-slave1设置成redisStudy的从机
slaveof 主机地址 主机端口 //注意地址和端口中间有一个空格
那主机的地址是什么呢?主机的端口是什么呢?
现在说说主机的端口,我们在启动主机的时候,做了一个端口映射 -p 6379:6379
前面的6379是阿里云服务器开放的安全组,也就是外部访问我们服务器时候的端口,后面的6379是我们容器里面启动redis的端口,这个端口是在redis.conf配置文件里面设置的,一般配置文件默认的6379,所以我们后面的这个端口也直接6379就可以了。如果redis配置文件里面的的端口号发生了变化,那端口映射也就需要跟着改变。
那主机的地址是什么呢? 有两种写法,一种就是我们服务器的地址,直接写就可以。或者我们可以通过docker inspect 容器名 |grep IPAddress
来查看,后者现在还不是很清楚,好像是和docker网络有关系,我们掌握第一种方式即可。
slaveof 服务器地址 6379
我们看到了OK,我们再输入info replication
来看看
我们可以看到当前的redis服务端已经变成了一个从机,并且显示出了主机的host和port,但是链接状态确实down
我们去主机看看,确实是没有链接上。
那原因是什么呢?我去网上找了半天,发现说的错误可高级,还要去查看redis的日志。 后面我又找了找错误原因,发现其实是从机连接主机的时候没有设置密码,我们需要去对应的配置文件里面把 replicaof 和masterauth
配置一下
然后我我们把这个容器删掉,再重新启动一个redis-slave1容器。注意:我们新启动的这个容器必须是用上面设置过replicaof和masterauth的配置文件。
docker run -d --privileged=true -p 6380:6379 --restart always -v /usr/local/redis/conf/redis6380.conf:/etc/redis6380.conf -v /root/usr/local/redis/data6380:/data --name redis-slave1 redis redis-server /etc/redis6380.conf
也就是上面的这个命令,这个和启动主机命令所使用的配置文件是不同的。
好了,之后我们往主机里面写入数据的时候,从机就会自动也存储一份数据。