docker搭建redis集群和Sentinel,实现故障转移

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)- (unames)(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值