1.基础安装
注:基础安装是根据已有博客搭建的,有很多问题,不是最终步骤。最终步骤在第三部分总结给出,当然也可能有问题,毕竟各个环境可能不同。
(1)在虚拟机中安装docker-compose
默认已经安装过了docker。
1)拉取安装包
curl -L “https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-
(
u
n
a
m
e
−
s
)
−
(uname -s)-
(uname−s)−(uname -m)” -o /usr/local/bin/docker-compose
2)给docker-compose增加执行权限
chmod +x /usr/local/bin/docker-compose
注:最开始安装docker-compose是先安装python的pip,再通过pip安装docker-compose,但升级pip时问题太多,干脆直接找个拉取源代码的直接下载。惭愧之前搞了那么久的python。
(2)搭建redis集群
1)新建docker-compose.yml文件
复制代码
version: ‘2.0’
services:
master:
image: redis
container_name: redis-master
ports:
- 6379:6379
slave1:
image: redis
container_name: redis-slave-1
ports:
- 6380:6379
command: redis-server --slaveof redis-master 6379
slave2:
image: redis
container_name: redis-slave-2
ports:
- 6381:6379
command: redis-server --slaveof redis-master 6379
复制代码
2)启动redis集群
docker-compose up -d
启动后,
docker ps; # 查看容器启动情况
如果容器启动不成功,docker ps不会列出正在运行的容器,需要查看已经启动过的容器
docker ps -a; #查看启动过的容器
这个时候,如果启动失败,通过docker ps -a知道启动失败的容器id,再通过查看日志的方式找出错误:
docker logs 容器id(一部分即可); # 查看容器的日志
docker logs -f 容器id(一部分即可); # 动态查看容器的日志
(3)搭建sentinel集群
1)sentinel配置文件
一共三台sentinel,准备三份配置文件,分别是sentinel1.conf、sentinel2.conf和sentinel3.conf,将这三份配置文件放在
/usr/local/etc/redis/sentinel.conf目录下。
复制代码
port 26379
dir “/tmp”
自定义集群名,其中 127.0.0.1 为 redis-master 的 ip,6379 为 redis-master 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2)
sentinel deny-scripts-reconfig yes
#自己的虚拟机ip地址
sentinel monitor mymaster 192.168.165.10 6379 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
Generated by CONFIG REWRITE(后面这3个注释掉了)
sentinel known-replica mymaster 172.26.0.2 6379
sentinel known-replica mymaster 172.26.0.3 6379
sentinel current-epoch 0
复制代码
同样的内容,复制到sentinel2.conf和sentinel3.conf’
2)docker-compose.yml
复制代码
version: ‘2.0’
services:
sentinel1:
image: redis
container_name: redis-sentinel-1
ports:
- 26379:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: redis-sentinel-2
ports:
- 26380:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: redis-sentinel-3
ports:
- 26381:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
复制代码
docker-compose.yml文件也放在/usr/local/etc/redis/sentinel.conf目录下
3)启动sentinel集群
docker-compose up -d
redis集群和sentinel集群按照上面步骤,可以通过docker运行,以为已经搭建成功,也可以连接到redis集群中。测试在主库中写,两个从库中都可以读出来,从库也不可以写内容。但是测试主库下线时,此时2个从库并没有有一个切换到主库。开始进行找错。
2.找问题与解决
主要问题:
redis集群的主从是成功的,但故障迁移时是失败的。
先看看测试故障迁移的方法:
1)进入redis-master容器
docker exec -it redis-master /bin/bash
2)进入redis环境
redis-cli -p 6379
3)查看redis角色
info
查看,知道redis-master是master节点。同样步骤查看redis-slave-1和redis-slave-2,都是slave节点
4)停掉master节点
docker stop redis-master
再去查看redis-slave-1和redis-slave-2,发现这两个节点还是slave,并没有一个成为master,表示sentinel故障转移失败。
注:之前没有找到查看sentinel日志的方法(docker logs -f 容器id),在master节点下线时直接查看sentinel的日志可以直观看到redis的下线、选举和当选主节点的过程。
初步认为原因可能是sentinel监控节点失败的原因:
查看过程:
1)进入到redis-sentinel-1节点,查看节点信息
docker exec -it redis-sentinel-1/bin/bash
redis-cli -p 26379
sentinel master mymaster
sentinel slaves mymaster
2)发现redis-slave节点都下线了
但实际redis-slave节点是在线的,表明是sentinel认为redis-slave下线 了。可能是之间网络不通的原因导致的。
此时,查找其他网页,发现可以看到sentinel的logs。
查看sentinel的日志:
docker logs redis-sentinel-1
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com