Redis 哨兵集群介绍

Redis 哨兵(Sentinel)是一种高可用性解决方案,用于监控 Redis 主从架构中的主节点和从节点,并在主节点发生故障时自动进行故障转移。哨兵提供了监控、通知、故障转移和配置管理等功能,确保 Redis 服务的高可用性。


集群IP示例

master

192.168.1.1

slave

192.168.1.2

arbiter

192.168.1.3

镜像

redis:alpine3.16


Redis 哨兵集群优缺点

  • 优点

    • 1. 高可用性

      • Redis 哨兵集群能够自动检测主节点的故障并进行故障转移。这意味着在主节点出现问题时,系统可以迅速恢复,确保服务的连续性。

    • 2. 自动故障转移

      • 当主节点不可用时,哨兵会自动选择一个从节点提升为新的主节点,并重新配置其他从节点以跟随新的主节点。这一过程是自动化的,减少了人工干预的需求。

    • 3. 监控功能

      • 哨兵提供了对主从节点的监控功能,可以实时检查节点的健康状态。管理员可以通过哨兵进行故障通知,及时获知系统问题。

    • 4. 易于配置

      • Redis 哨兵的配置相对简单,用户可以通过配置文件进行设置。哨兵支持多种配置选项,用户可以根据需求进行定制。

    • 5. 客户端透明性

      • 哨兵可以为客户端提供当前主节点的地址,客户端可以自动连接到新的主节点,无需手动修改配置。这简化了客户端的配置和管理。

  • 缺点

    • 1. 故障转移延迟

      • 在主节点故障时,哨兵需要一定的时间来检测故障并进行故障转移。这段时间可能会导致短暂的服务中断,特别是在网络延迟或节点恢复较慢的情况下。

    • 2. 单点故障

      • 虽然哨兵本身可以提高高可用性,但如果哨兵实例出现故障,可能导致整个监控和故障转移机制失效。因此,建议部署多个哨兵实例以避免单点故障。

    • 3. 配置复杂性

      • 尽管哨兵的基本配置相对简单,但在大规模集群或复杂场景下,配置和管理可能变得复杂。例如,管理多个哨兵和 Redis 实例的网络拓扑和配置可能需要额外的精力。

    • 4. 数据一致性

      • 在故障转移过程中,新的主节点可能会在与原主节点的最后一次同步后接收部分写请求。这可能导致短暂的数据不一致,尤其是在故障转移时间较长的情况下。

    • 5. 限制的功能

      • Redis 哨兵主要用于监控和故障转移,并不提供数据分片或负载均衡的功能。因此,在需要这些功能时,可能需要结合其他工具(如 Redis Cluster)。


部署前置服务*Docker


创建挂载目录

  • 部署所在服务器:master slave arbiter

mkdir -p /data/docker/redis/{data,conf,sentinel} &&
mkdir -p /data/docker/redis/sentinel/{conf,data,pid,logs} &&
chmod -R 777 /data/docker/redis/

导入镜像

  • 部署所在服务器:master slave arbiter

docker load < redis.tar

启动主节点Redis容器

  • 部署所在服务器:master

# 写入配置文件
cat << EOF > /data/docker/redis/conf/redis.conf

daemonize no
bind 0.0.0.0
port 6379
pidfile redis_6379.pid
logfile redis_6379.log
dir ./
databases 16
dbfilename redis_6369.rdb
requirepass redispassword   # 集群密码
masterauth redispassword   # 集群密码
# 节点可写权限
replica-read-only no
save 900 1
save 300 100
save 60 10000

EOF

# 启动容器
docker run -d -p 6379:6379 --name redis --privileged=true --restart=always -v /etc/hosts:/etc/hosts -v /data/docker/redis/data:/data -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf redis:alpine3.16 redis-server /etc/redis/redis.conf

启动从节点总裁节点Redis容器

  • 部署所在服务器:slave arbiter

# 写入配置文件
cat << EOF > /data/docker/redis/conf/redis.conf

daemonize no
bind 0.0.0.0
port 6379
pidfile redis_6379.pid
logfile redis_6379.log
dir ./
databases 16
# 认证密码
requirepass redispassword
# 主从同步密码和master的requirepass一致
masterauth redispassword
# 指定主节点
slaveof 192.168.1.1 6379
# 节点可写权限
replica-read-only no
save 900 1
save 300 100
save 60 10000

EOF

# 启动容器
docker run -d -p 6379:6379 --name redis --privileged=true --restart=always -v /etc/hosts:/etc/hosts -v /data/docker/redis/data:/data -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf redis:alpine3.16 redis-server /etc/redis/redis.conf

启动哨兵集群容器

  • 部署所在服务器:master slave arbiter

# 写入配置文件
cat << EOF > /data/docker/redis/sentinel/conf/redis_sentinel.conf

daemonize no
bind 0.0.0.0
port 26379
logfile /data/sentinel/logs/redis_26379.log
dir /data/sentinel/data
sentinel monitor master_point 192.168.1.1 6379 2   # 指认主节点
sentinel down-after-milliseconds master_point 3000
sentinel parallel-syncs master_point 1
sentinel failover-timeout master_point 18000
sentinel auth-pass master_point redispassword  # redis集群密码

EOF

# 添加权限
chmod 777 /data/docker/redis/sentinel/conf/redis_sentinel.conf

# 启动Rdis哨兵容器
docker run -d --name redis_sentinel -p 26379:26379 --restart=always -v /etc/localtime:/etc/localtime -v /etc/hosts:/etc/hosts -v /data/docker/redis/sentinel/conf:/etc/sentinel  -v /data/docker/redis/sentinel/pid:/data/sentinel/pid -v /data/docker/redis/sentinel/logs:/data/sentinel/logs -v /data/docker/redis/sentinel/data:/data/sentinel/data redis:alpine3.16 /etc/sentinel/redis_sentinel.conf --sentinel

查看集群数量

redis-cli -p 26379 SENTINEL masters