[喵咪Redis]Redis-Sentinel 前言 redis-Sentinel 是我们这次来一同学习 redis 的重点,在我们现在的系统已经离不开 redis 的时候 , redis 挂掉了或者是一些其他问题都是致命的 , 那么怎么做到 redis 的高可用呢 , 官方有提供一个管理 redis 集群自动容灾的一个应用 Redis-Sentinel .那么我们就来一同搭建一个 redis 高可用的 redis 集群. 虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 的程序,我们把他 cp 到 /usr/local/bin/ 下面就可以直接使用 redis-sentinel 命令了 3. 分表在2台服务器上面 redis-sentinel sentinel_6379.config redis-sentinel sentinel_6380.config redis-sentinel sentinel
ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/redis-cli ln -s /usr/local/redis/bin/redis-sentinel /usr/local/bin/redis-sentinel ln -s /usr/local/redis/bin/redis-server /usr/local/bin/redis-server 配置文件 /etc/redis/sentinel_26379.conf redis-sentinel /etc/redis/sentinel_26380.conf 查看进程是否都已经启动 [root@iZj6cqZ 00:00:00 redis-sentinel *:26379 [sentinel] root 10944 1 0 08:15 ? 00:00:00 redis-sentinel *:26380 [sentinel] root 10948 10851 0 08:15 pts/1 00:00:00 grep --color
mymaster 60000 启动 redis 主从节点 systemctl start redis systemctl enable redis 启动 sentinel 节占 systemctl start redis-sentinel systemctl enable redis-sentinel 查看状态 # 查看 redis 主从状态 redis-cli -h 192.168.1.240 -p 6379 -a 123456 info
当前的Redis集群不支持NAT网络模式以及被重新映射的IP和端口。如果使用docker部署redis,要使用 --network=host
Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案, 当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能 而redis-sentinel就是一个独立运行的进程,用于监控多个master-slave集群, 自动发现master宕机,进行自动切换slave > master。 但是问题是: 一旦主节点宕机,从节点上位,那么需要人为修改所有应用方的主节点地址(改为新的master地址),还需要命令所有从节点复制新的主节点 那么这个问题,redis-sentinel就可以解决了 然后启动三个sentinel哨兵 redis-sentinel /etc/redis-sentinel-26379.conf redis-sentinel /etc/redis-sentinel-26380 .conf redis-sentinel /etc/redis-sentinel-26381.conf 监控拓扑图 ?
本文介绍基于docker和redis-sentinel的高可用redis集群搭建,大多数情况下,redis-sentinel也需要做高可用,这里先对redis搭建一主二从环境,另外需要3个redis-sentinel 很显然,只使用单个redis-sentinel进程来监控redis集群是不可靠的,由于redis-sentinel本身也有single-point-of-failure-problem(单点问题),当出现问题时整个 实战拓扑图 redis-sentinel redis-sentinel作为独立的服务,用于管理多个redis实例,该系统主要执行以下三个任务: 监控 (Monitor): 检查redis主、从实例是否正常运作 启动 redis-sentinel启动有以下两种方式: redis-sentinel /path/to/sentinel.conf redis-server /path/to/sentinel.conf -sentinel redis-sentinel /usr/local/etc/redis/sentinel.conf 连接并使用redis-sentinel API查看监控状况:
同样,我们使用docker进行搭建 新建一个mkdir redis-sentinel文件夹 进入项目文件夹 cd redis-sentinel,再建立一个sentinel专门来存放哨兵脚本 REDIS_PASSWORD="" ports: - '6381:6379' depends_on: - redis networks: - app-tier redis-sentinel : image: 'bitnami/redis-sentinel:latest' environment: - REDIS_MASTER_PASSWORD="" depends_on 使用桥接的方式分别跑在6379,6380,6381端口号上 ,一主两从,并且会有哨兵实例来监控它们,最后项目结构是这样的 在项目根目录下,启动服务: docker-compose up --scale redis-sentinel
{redis-server,redis-sentinel} /data/redis-sentinel/9000/ cp src/{redis-server,redis-sentinel} /data/redis-sentinel /9001/ cp src/{redis-server,redis-sentinel} /data/redis-sentinel/9002/ cp redis.conf sentinel.conf /data /redis-sentinel/9000/ cp redis.conf sentinel.conf /data/redis-sentinel/9001/ cp redis.conf sentinel.conf /9001/redis.conf # \cp /data/redis-sentinel/9000/redis.conf /data/redis-sentinel/9002/redis.conf sed -i 's/9000/9001/g' /data/redis-sentinel/9001/redis.conf # vim /data/redis-sentinel/9001/redis.conf port
Redis Client App独立组网遇到的问题 很多时候,Redis Client App与Redis-Sentinel独立组网,这样对Redis-Sentinel的访问就会涉及Docker宿主机NAT (这里我们就不提Docker Host模式搭建Redis-Sentinel了) ? C#两大客户端访问Redis-Sentinel的方式 归根到底一张图: ? 存在测试键值:testKey:hello Redis-sentinel! Redis-Sentinel在Docker环境因NAT,Forward_Port触发的问题, 以及Redis官方给出的方案 2.
服务 [root@master bin]# redis-sentinel sentinel.conf [root@master bin]# redis-sentinel sentinel-s1.conf 00:00:04 redis-sentinel *:26379 root 2646 1 0 01:13 ? bin]# redis-sentinel sentinel-s2.conf [root@slave bin]# redis-sentinel sentinel-s3.conf [root@slave 00:00:00 redis-sentinel *:26378 root 2649 1 0 01:14 ? 00:00:00 redis-sentinel *:26379 root 2653 2502 0 01:15 00:00:00 grep --color=auto redis-sentinel
version: '3.7' services: sentinel1: image: redis container_name: redis-sentinel-1 command: redis-sentinel etc/redis/sentinel.conf restart: always ports: - 26379:26379 volumes: - /home/redis-sentinel services: sentinel2: image: redis container_name: redis-sentinel-2 command: redis-sentinel /sentinel.conf:/usr/local/etc/redis/sentinel.conf 在各自主从服务器中docker-compose up -d 执行 三、测试验证 进入redis-sentinel 容器中,查看redis连接状态 # 查看redis-sentinel是否启动成功 docker ps # 进入redis-sentinel容器中,查看redis连接状态 docker exec -it
具体步骤如下:创建一个Docker网络docker network create redis-sentinel启动3个Redis容器,并将它们加入到同一个集群中docker run -d --name redis-0 --net redis-sentinel redis redis-server --appendonly yesdocker run -d --name redis-1 --net redis-sentinel redis redis-server --appendonly yesdocker run -d --name redis-2 --net redis-sentinel redis redis-server --appendonly yes启动3个哨兵容器,并让它们监控Redis容器docker run -d --name sentinel-0 --net redis-sentinel redis redis-sentinel mymaster 172.18.0.2 6379 2docker run -d --name sentinel-2 --net redis-sentinel redis redis-sentinel
其中Redis并未完成容器化改造(目前是主机单点),本文记录将Redis升级到容器化Redis-Sentinel集群。 升级思路: 《Docker-compose搭建Redis高可用哨兵集群》,这里将Redis-Sentinel容器接入现有Docker Swarm overlay网络,规避Redis ClientApp访问不同网络的 Redis-Sentinel引发的混乱(因NAT转换和Port映射)。 注意事项 现有的应用程序处于Docker Swarm Overlay网络,默认是不允许附加其他容器,这里我们需要将该Overlay网络配置成可附加,方便Redis-Sentinel接入该网络,所有容器同网络 name: eqidstack_webnet // 使用现有的Dokcer Overlay网络 经过验证,StackExchange.Redis最新版本2.1.58 可以更简洁的方式支持Redis-sentinel
[root@redis-sentinel-05 ~]# redis-sentinel /etc/redis/sentinel-29736.conf 启动信息: ? ❞ 再次启动三台Sentinel: [root@redis-sentinel-05 ~]# redis-sentinel /etc/redis/sentinel-29736.conf [root@redis-sentinel 00:00:00 redis-sentinel 192.168.2.30:29736 [sentinel] root 12012 7129 0 12:02 pts/0 00:00:
,分别是:10.0.16.12(主节点)、10.0.16.7(从节点1)、10.0.16.16(从节点2) 手动安装 下面,说明一下Redis哨兵集群的安装步骤: 主节点 【步骤1】安装 redis、redis-sentinel main" | sudo tee /etc/apt/sources.list.d/redis.list sudo apt-get update sudo apt-get install redis redis-sentinel master-password>/masterauth 123456/" /etc/redis/redis.conf sudo systemctl restart redis-server # config redis-sentinel 从节点1: 【步骤1】安装 redis、redis-sentinel,同上 【步骤2】配置IP、密码、哨兵监控对象,并设为从主节点同步 # config redis-server sudo sed - :0 master0:name=mymaster,status=ok,address=10.0.16.12:6379,slaves=1,sentinels=2 从节点2: 【步骤1】安装 redis、redis-sentinel
/9000/redis-server /data/redis-sentinel/9000/redis.conf /data/redis-sentinel/9001/redis-server /data /redis-sentinel/9001/redis.conf /data/redis-sentinel/9002/redis-server /data/redis-sentinel/9002/ redis.conf # start sentinel /data/redis-sentinel/9000/redis-sentinel /data/redis-sentinel/9000 /sentinel.conf /data/redis-sentinel/9001/redis-sentinel /data/redis-sentinel/9001/sentinel.conf /data/redis-sentinel/9002/redis-sentinel /data/redis-sentinel/9002/sentinel.conf ;; stop
/redis-sentinel .. /sentinel.conf 因为之前设置了环境变量,所以直接用命令执行 # 到配置文件目录 cd /usr/local/redis/config # 启动sentinel服务 redis-sentinel 自启动脚本文件 vi redis-sentinel 加上自启动执行脚本,redis配置的位置请自行更改 #! sleep 1 done echo "Redis-sentinel stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac 保存配置文件,加上可执行权限 # 加上可执行权限 chmod +x /etc/init.d/redis-sentinel
172.18.254.75 [node3] 配置主从复制环境 构建Redis集群自动故障转移的前提是已配置主从复制环境,相关内容请参见 Redis主从复制 配置主节点 启用监听,并启动主节点上的redis-sentinel redis-sentinel.service [root@node1 ~]# ss -tnlp |grep redis* LISTEN 0 128 *:26379 *:* users:(("redis-sentinel *:6379 *:* users:(("redis-server",pid=11037,fd=4)) 配置从节点 [root@node2 ~]# systemctl restart redis-sentinel [root@node3 ~]# systemctl restart redis-sentinel 检查故障转移关系 [root@node2 ~]# redis-cli -h 172.18.253.123
26379 -v /home/redis4/conf/sentinel.conf:/etc/redis/sentinel.conf -v /home/redis4/data:/data -d redis redis-sentinel 26378 -v /home/redis5/conf/sentinel.conf:/etc/redis/sentinel.conf -v /home/redis5/data:/data -d redis redis-sentinel 26377 -v /home/redis6/conf/sentinel.conf:/etc/redis/sentinel.conf -v /home/redis6/data:/data -d redis redis-sentinel /etc/redis/sentinel.conf redis-sentinel sentinel.conf info 配置会重写,自动发现slave 四 客户端连接 import redis
,所以笔者在这里就基于一个redis-sentinel的部署介绍一下Portainer的日常操作步骤。 图片 创建redis-sentinel专用网络驱动 为了确保redis-sentinel可以统一管理且和其他容器隔离,我们在部署sentinel之前需要基于Portainer创建一个自定义的brige网络 图片 重点来了,我们的redis主从节点现在都处于默认的网络驱动中,我们必须手动将其配置到redis-sentinel网络中,当然有了portainer,这种操作也不会很难。 我们只需要点击容器列表,找到我们的主动节点容器,然后分别进入他们的管理列表最下方,找到network选项,在network列表中找到redis-sentinel选择join network即可。 图片 自此我们的redis-sentinel部署完成了。