Docker Compose 篇 -- Redis Sentinel 高可用架构实践

简介

在云计算时代,容器化技术已经成为了一个热门话题。Docker 是最广泛使用的容器化解决方案之一,而 Docker Compose 则是用于定义和运行多个 Docker 容器的工具。

Redis 是一款高性能的 key-value 存储系统,被广泛应用于缓存、消息队列等场景。而 Redis Sentinel 则是 Redis 的高可用性解决方案之一,可以增加 Redis 的稳定性和可靠性。本文将结合 Docker Compose 和 Redis Sentinel 实现 Redis 的高可用架构。

Redis Sentinel 简介

Redis Sentinel 是 Redis 的高可用性解决方案之一,可以在主节点出现故障后自动切换到从节点上。Redis Sentinel 可以实现以下功能:

  • 监控主从节点的健康状态
  • 在主节点故障时自动将从节点提升为主节点
  • 在主节点故障后自动将新的从节点加入集群
  • 对 Redis Sentinel 进行监控和管理

Redis Sentinel 的工作原理是每个 Sentinel 进程实际上是一个独立的进程,由多个 Sentinel 进程协作完成主从切换等任务。

Redis Sentinel 高可用架构

Redis Sentinel 高可用架构通常由三个 Redis 实例和多个 Sentinel 实例组成。其中三个 Redis 实例分别为主节点、从节点1和从节点2,Sentinel 实例用于监控 Redis 实例的健康状态,当主节点故障时,从节点1会被 Sentinel 选为新的主节点,从节点2则成为新的从节点。

图片来源:Redis Sentinel Documentation

Docker Compose 实现 Redis Sentinel 高可用架构

接下来我们将使用 Docker Compose 来实现 Redis Sentinel 高可用架构。本文中使用的 Docker 镜像为官方提供的 Redis、Sentinel 镜像。

创建 Docker Compose 文件

创建 docker-compose.yaml 文件,填写内容如下:

version: '3'
services:
  redis_primary:
    image: redis
    command: ["redis-server", "--port", "6379", "--slaveof", "", "--save", "", "--save", ""]
    ports:
      - "6379:6379"
    volumes:
      - redis_primary:/data

  redis_replica1:
    image: redis
    command: ["redis-server", "--port", "6380", "--slaveof", "redis_primary", "6379"]
    volumes:
      - redis_replica1:/data

  redis_replica2:
    image: redis
    command: ["redis-server", "--port", "6381", "--slaveof", "redis_primary", "6379"]
    volumes:
      - redis_replica2:/data

  sentinel1:
    image: redis
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]
    volumes:
      - ./sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.conf
    depends_on:
      - redis_primary

  sentinel2:
    image: redis
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]
    volumes:
      - ./sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.conf
    depends_on:
      - sentinel1

  sentinel3:
    image: redis
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]
    volumes:
      - ./sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.conf
    depends_on:
      - sentinel1

volumes:
  redis_primary:
  redis_replica1:
  redis_replica2:

上述 yaml 文件启动了三个 Redis 实例和三个 Sentinel 实例。其中 redis_primary 为主节点,redis_replica1 和 redis_replica2 为从节点。sentinel1、sentinel2 和 sentinel3 为 Sentinel 实例。在启动 redis_primary 时,使用 --slaveof 选项将其作为主节点运行,同时在 sentinel1、sentinel2 和 sentinel3 中配置了相应的 Sentinel 信息。

在 Docker 中启动 Redis Sentinel 集群

执行以下命令启动 Redis Sentinel 集群:

测试 Redis Sentinel 高可用架构

启动 Redis Sentinel 集群后,使用 Redis-cli 操作集群来模拟主节点故障的情况。

连接 Redis 主节点

使用以下命令连接 Redis 主节点:

redis-cli -h 127.0.0.1 -p 6379

模拟主节点故障

在 Redis 主节点中执行以下操作模拟主节点故障:

DEBUG sleep 10 # 暂停 Redis 主节点的运行

等待 10 秒后,再次连接 Redis 主节点,发现无法连接:

redis-cli -h 127.0.0.1 -p 6379

连接 Sentinel 实例检查集群健康状态:

redis-cli -h 127.0.0.1 -p 26379
sentinel master mymaster # 查看主节点信息
sentinel replicas mymaster # 查看从节点信息

可以看到 Sentinel 实例已经将从节点1升级为新的主节点。

关闭 Sentinel 实例

在 Redis Sentinel 集群中,如果 Sentinel 实例发生故障,不会影响 Redis 集群的运行,但可能会导致 Sentinel 实例中的信息不准确,因此 Sentinel 实例也需要保证高可用性。在本例中,我们使用 3 个 Sentinel 实例来保证高可用性。

使用以下命令关闭 Sentinel1 实例:

等待一定时间后,Sentinel1 实例中保存的主节点信息将过期(默认 30 秒钟),其他 Sentinel 实例将自动发现该节点的故障。

连接其他 Sentinel 实例检查集群健康状态:

redis-cli -h 127.0.0.1 -p 26380
sentinel master mymaster # 查看主节点信息
sentinel replicas mymaster # 查看从节点信息

可以看到 Sentinel2 实例已经成为了新的领导者。

总结

本文详细介绍了 Redis Sentinel 的高可用架构,并结合 Docker Compose 实现了 Redis Sentinel 集群。通过模拟主节点故障和关闭 Sentinel 实例两种情况,我们验证了 Redis Sentinel 高可用架构的可靠性和稳定性。希望本文对大家了解 Docker Compose 和 Redis Sentinel 有所帮助,同时也鼓励大家在实际项目中应用容器化技术,提升应用程序的稳定性和可靠性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65acb9b3add4f0e0ff64f052