深入浅出Docker技术- Redis sentinel 集群的搭建

本章目录:

 1.环境准备;

 2.集群启动与测试:

 3. redis ha 常用方案:

 4. sentinel.conf 介绍:

 5.Java 操作 sentinel

 

本文主要介绍基于redis高可用的集群搭建

环境准备:

   docker/centos7

上一章介绍了基于redis slaveof 实现的redis主从复制;但是有一个问题是就, 当master节点失效时,应选举出一个slave节点作为新的master。然而Redis本身(包括它的很多客户端)没有实现自动故障发现并进行主备切换的能力,需要外部的监控方案来实现自动故障恢复。Redis Sentinel是官方推荐的高可用性解决方案。它是Redis集群的监控管理工具,可以提供节点监控、通知、自动故障恢复和客户端配置发现服务。

 

Redis slaveof 部署拓扑结构图

image.png

 

Redis sentinel部署拓扑结构图:

 image.png 

分别有3个Sentinel节点,1个主节点,2个从节点组成一个Redis Sentinel。采用docker 容器方式:

 

role

IP

port

master

127.0.0.1

6379

slave1

127.0.0.1

6379

slave2

127.0.0.1

6379

Sentinel1

127.0.0.1

26379

Sentinel2

127.0.0.1

26379

Sentinel3

127.0.0.1

26379


 docker compose
文件编写:

    https://gitee.com/gz-tony/viemall-dubbo/tree/master/viemall-docekr/compose/redis-sentinel

docker compose 服务启动;


  docker-compose up –d


检查一下docker 集群容器:

   image.png 

验证一下是否成功:

 

查看 redis-sentinel_sentinel_1 容器日记:

  image.png

查看 redis-master 的主从关系:

docker exec -it redis-master  redis-cli info Replication

  image.png

查看 redis-sentinel_redis-slave_1  的主从关系:

docker exec -it redis-sentinel_redis-slave_1  redis-cli info Replication

image.png

停止 redis-master 容器,看是否会自动切换master :

# docker stop redis-master

#

发现Redi-master主节点已经不能连接,redis-sentinel_redis-slave_1 成了主节点!

说明 sentinel 部署成功;

启动sentinel 多实例:

使用docker-compose scale指定某一个服务启动的容器的个数;

启动3个sentinel服务:

docker-compose scale sentinel=3

 image.png 

启动两次从节点:

docker-compose scale redis-slave=2

 image.png 

Docker ps –a 查看:

 image.png 

最终保持了有3个Sentinel节点,1个主节点,2个从节点组成一个Redis Sentinel;

验证测试如上面操作一样;

 

注意:在生产环境下建议sentinel节点的数量能在3个以上,并且最好不要在同一台机器上(使用同一网卡)。 所以一般正式环境上的操作,是采用docker 单个服务运行;

 

 

sentinel.conf配置文件介绍:

 

port 26379 #当前Sentinel服务运行的端口

 

# Sentinel服务运行时使用的临时文件夹

dir /tmp

 

#指定别名  主节点地址  端口  哨兵个数(有几个哨兵监控到主节点宕机执行转移)

sentinel monitor mymaster redis-master 6379 $SENTINEL_QUORUM

 

# Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址redis-master 容器,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行

 

#如果哨兵3s内没有收到主节点的心跳,哨兵就认为主节点宕机了,默认是30秒 

sentinel down-after-milliseconds mymaster $SENTINEL_DOWN_AFTER

 

#选举出新的主节点之后,可以同时连接从节点的个数

#指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长

sentinel parallel-syncs mymaster 1

 

#如果在该时间(ms)内未能完成failover操作,则认为该failover失败

sentinel failover-timeout mymaster $SENTINEL_FAILOVER

 

#配置连接redis主节点密码 

#sentinel auth-pass mymaster 123456 

# sentinel notification-script <master-name> <script-path>:指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,但是很常用

 

 

 

常用的redis HA 方案:

 

Redis 一般以主/从方式部署(这里讨论的应用从实例主要用于备份,主实例提供读写)该方式要实现 HA 主要有如下几种方案: 


  1)keepalived:通过 keepalived 的虚拟 IP,提供主从的统一访问,在主出现问题时, 通过 keepalived 运行脚本将从提升为主,待主恢复后先同步后自动变为主,该方案的好处是主从切换后,应用程序不需要知道(因为访问的虚拟 IP 不变),坏处是引入 keepalived 增加部署复杂性,在有些情况下会导致数据丢失; 


  2) zookeeper: 通过 zookeeper 来监控主从实例, 维护最新有效的 IP, 应用通过 zookeeper取得 IP,对 Redis 进行访问,该方案需要编写大量的监控代码; 


  3)sentinel:通过 Sentinel 监控主从实例,自动进行故障恢复,该方案有个缺陷:因为主从实例地址(IP&PORT)是不同的, 当故障发生进行主从切换后, 应用程序无法知道新地址,故 在 Jedis2.2.2 中 新 增 了 对 Sentinel 的 支 持 , 应 用 通 过redis.clients.jedis.JedisSentinelPool.getResource()取得的Jedis实例会及时更新到新的主实例地址。 

 

 

Java 客户端操作:

public class RedisSentinelTest {

 

      public static void main(String[] args) {

 

           Set<String> sentinels = new HashSet<String>();

        sentinels.add("127.0.0.1:26379");

        sentinels.add("127.0.0.1:26380");

        sentinels.add("127.0.0.1:26381");

 

           String clusterName = "redis-master";

           String password = "";

 

           JedisSentinelPool redisSentinelJedisPool = new JedisSentinelPool(clusterName, sentinels, password);

           Jedis jedis = null;

           try {

                 jedis = redisSentinelJedisPool.getResource();

                 jedis.set("key", "value");

           } catch (Exception e) {

                 e.printStackTrace();

           } finally {

                 redisSentinelJedisPool.close();

           }

          

      }

 

}

 

 

 

参考资料:

 https://www.cnblogs.com/LiZhiW/p/4851631.html