当前位置: 首页 > news >正文

Redis篇-21--运维篇3-集群(分片,水平扩展,高可用,集群配置案例,扩展哨兵案例)

1、概述

Redis集群(Cluster)通过分片(sharding)实现了水平扩展,允许数据分布在多个节点上,从而提升性能和存储容量。

在Redis集群中,数据被分割成16384个哈希槽(hash slots),每个哈希槽可以分配给集群中的不同节点。每个节点负责一部分哈希槽,并且每个哈希槽都有一个主节点和零个或多个从节点(用于高可用性)。
客户端在发送命令时,会根据键的哈希值计算出对应的哈希槽,并直接连接到持有该槽的主节点。

2、集群配置

假设我们要构建一个包含3主3从的Redis集群,总共6个节点。每个节点都需要一个独立的redis.conf配置文件。

1、主节点1 (Node 1) 配置

 端口号
port 7000绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7000.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7000.log"日志级别
loglevel notice

2、主节点2 (Node 2) 配置

端口号
port 7001绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7001.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7001.log"日志级别
loglevel notice

3、主节点3 (Node 3) 配置

端口号
port 7002绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7002.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7002.log"日志级别
loglevel notice

4、从节点1 (Node 4) 配置

端口号
port 7003绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7003.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7003.log"日志级别
loglevel notice指定主节点(启动后由集群自动分配)
slaveof 127.0.0.1 7000   这一行可以注释掉,因为集群会自动处理主从关系

5、从节点2 (Node 5) 配置

端口号
port 7004绑定IP地址(根据实际情况修改)
bind 0.0.0.0开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7004.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7004.log"日志级别
loglevel notice指定主节点(启动后由集群自动分配)
slaveof 127.0.0.1 7001   这一行可以注释掉,因为集群会自动处理主从关系

6、从节点3 (Node 6) 配置

端口号
port 7005绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7005.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7005.log"日志级别
loglevel notice指定主节点(启动后由集群自动分配)
slaveof 127.0.0.1 7002   这一行可以注释掉,因为集群会自动处理主从关系

3、配置详解

1、port

  • 解释:指定Redis实例监听的TCP端口号。每个节点必须使用不同的端口。
  • 固定/可变:port是固定的关键词,后面的端口号(如7000)可以根据实际情况调整。

2、bind

  • 解释:指定Redis实例绑定的IP地址。0.0.0.0表示绑定所有可用的网络接口。如果你希望Redis只监听特定的IP地址,可以替换为实际的IP地址。
  • 固定/可变:bind是固定的关键词,后面的IP地址可以根据实际情况调整。

3、cluster-enabled

  • 解释:开启Redis集群模式。这是启用分片和分布式功能的关键配置。
  • 固定/可变:cluster-enabled是固定的关键词,值必须设置为yes以启用集群模式。

4、cluster-config-file

  • 解释:指定集群配置文件的路径。这个文件用于保存集群的拓扑结构和状态信息。每个节点都应该有一个独立的配置文件,通常命名为nodes-<端口号>.conf。
    说明下:这个文件是自动生成的,且是动态更新的。每当集群的拓扑结构发生变化(例如,新的节点加入、旧的节点离开、哈希槽重新分配等),Redis 会自动更新这个文件,以确保集群的最新状态被正确记录。无需人为维护,仅在配置文件中指定名称即可。
  • 固定/可变:cluster-config-file是固定的关键词,后面的文件名可以根据实际情况调整。

5、cluster-node-timeout

  • 解释:设置集群节点之间的通信超时时间(毫秒)。如果一个节点在这个时间内一直没有响应,哨兵则认为该节点已经失效。
  • 固定/可变:cluster-node-timeout是固定的关键词,后面的超时时间(如5000,单位毫秒)可以根据实际情况调整。

6、appendonly

  • 解释:开启AOF(Append Only File)持久化模式。这可以确保Redis在重启后能够恢复数据。你可以根据需求选择是否开启持久化。
  • 固定/可变:appendonly是固定的关键词,值可以设置为yes或no。

7、requirepass

  • 解释:设置Redis实例的访问密码。如果启用了密码保护,客户端在连接时需要提供正确的密码。
  • 固定/可变:requirepass是固定的关键词,后面的密码(如yourpassword)可以根据实际情况设置。

8、cluster-auth-pass

  • 解释:设置集群内部通信的密码。如果Redis实例启用了密码保护,集群中的节点之间也需要使用相同的密码进行通信。
  • 固定/可变:cluster-auth-pass是固定的关键词,后面的密码(如yourpassword)可以根据实际情况设置。

9、logfile

  • 解释:指定Redis的日志文件路径。日志记录了Redis的操作和状态变化,有助于调试和监控。
  • 固定/可变:logfile是固定的关键词,后面的路径(如/path/to/redis-7000.log)可以根据实际情况调整。

10、loglevel

  • 解释:设置Redis的日志级别。常见的日志级别包括debug、verbose、notice、warning等。notice是一个常用的级别,记录重要的信息而不产生过多的噪音。
  • 固定/可变:loglevel是固定的关键词,后面的级别(如notice)可以根据需求调整。

11.、slaveof

  • 解释:指定从节点复制的主节点。虽然你可以在配置文件中显式指定主节点,但通常不需要这样做,因为集群会自动处理主从关系。如果你手动指定了主节点,哨兵或集群可能会覆盖这个配置。
  • 固定/可变:slaveof是固定的关键词,后面的IP地址和端口号可以根据实际情况设置。不过,建议将其注释掉,让集群自动管理主从关系。

4、启动集群

(1)、启动所有Redis实例

 redis-server /path/to/redis-7000.confredis-server /path/to/redis-7001.confredis-server /path/to/redis-7002.confredis-server /path/to/redis-7003.confredis-server /path/to/redis-7004.confredis-server /path/to/redis-7005.conf

(2)、创建并启动集群

说明下:启动所有的节点并不代表启动了集群。
启动各个Redis节点只是第一步,真正的集群化操作需要通过redis-cli --cluster create命令来完成。这个命令会分配哈希槽、建立节点间的通信关系,为每个主节点分配一个从节点,初始化集群的拓扑结构,并更新每个节点的cluster-config-file。

确保所有节点都已启动后,执行以下命令,创建集群:

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

命令解释下:

  • –cluster create:创建一个新的Redis集群。
  • 127.0.0.1:7000 … 127.0.0.1:7005:列出所有参与集群的节点的IP地址和端口号。
  • –cluster-replicas 1:指定每个主节点应该有1个从节点。说明下:因为命令指定了6个服务,这里cluster-replicas配置为1,即每一个主节点有一个从节点,所以才实现3主3从的结构;如果配置为2,即每个主节点有2个从节点,那么6个服务就形成了2主4从的结构。以此类推。

(3)、验证集群状态

你可以通过以下命令查看集群的状态:

redis-cli -p 7000 cluster info
redis-cli -p 7000 cluster nodes

说明下:

  • cluster info:显示集群的基本信息,如集群状态、节点数量等。
  • cluster nodes:显示集群中所有节点的详细信息,包括主节点、从节点、哈希槽分配等。

5、集群总结

通过上述配置,你可以搭建一个包含3个主节点和3个从节点的Redis集群。每个节点的配置文件都非常相似,唯一的区别在于端口号和集群配置文件的名称。Redis集群会自动处理主从关系、哈希槽分配和故障转移,因此你不需要为每个从节点单独配置主节点信息。
这种架构不仅提供了水平扩展的能力,还通过主从复制和自动故障转移确保了高可用性。通过合理配置和管理,Redis集群可以满足大规模应用对高性能和可靠性的要求。

6、集群扩展哨兵机制

在Redis集群中实现哨兵机制(Sentinel)可以进一步提升系统的高可用性。哨兵机制可以为集群提供额外的监控和管理功能,尤其是在处理复杂的网络分区或节点故障时。

扩展哨兵后集群优势:

  • 增强监控能力:哨兵不仅可以监控单个主从对,还可以监控整个集群的状态,确保所有节点都正常工作。
  • 自动化故障转移:虽然Redis集群本身支持自动故障转移,但在某些复杂情况下(如网络分区),哨兵可以更灵活地处理故障转移。
  • 通知机制:哨兵可以配置为向管理员发送通知,当集群中的某个节点发生故障时,及时提醒运维人员。
  • 手动干预:哨兵允许你手动触发故障转移,或者在某些情况下阻止不必要的自动故障转移。

集群基础上扩展哨兵机制配置示例:

假设我们现在要实现3主3从3哨兵的架构。

1、搭建集群

可参考上面的示例,实现3主3从的集群结构,以及正确启动每一个节点服务和创建集群。

2、创建哨兵配置文件

为每个哨兵节点创建一个独立的sentinel.conf配置文件。示例基本同之前介绍的哨兵配置文件。

哨兵节点1 (sentinel-26379.conf)

 哨兵监听的端口号
port 26379绑定IP地址(根据实际情况修改)
bind 127.0.0.1指定要监控的集群名称和任意一个主节点的地址
sentinel monitor mycluster 127.0.0.1 7000 2设置法定人数(quorum),即至少需要多少个哨兵同意才能认为主节点下线
sentinel quorum mycluster 2设置哨兵认为主节点失效的时间阈值(毫秒)
sentinel down-after-milliseconds mycluster 5000设置故障转移的超时时间(毫秒)
sentinel failover-timeout mycluster 180000如果设置了Redis密码,还需要配置密码
sentinel auth-pass mycluster yourpassword可选:设置哨兵日志级别
logfile "/path/to/sentinel-26379.log"
loglevel notice可选:指定哨兵之间的通信端口(通常不需要修改)
sentinel announce-ip 127.0.0.1
sentinel announce-port 26379

哨兵节点2 (sentinel-26380.conf)

 哨兵监听的端口号
port 26380绑定IP地址(根据实际情况修改)
bind 127.0.0.1指定要监控的集群名称和任意一个主节点的地址
sentinel monitor mycluster 127.0.0.1 7000 2设置法定人数(quorum),即至少需要多少个哨兵同意才能认为主节点下线
sentinel quorum mycluster 2设置哨兵认为主节点失效的时间阈值(毫秒)
sentinel down-after-milliseconds mycluster 5000设置故障转移的超时时间(毫秒)
sentinel failover-timeout mycluster 180000如果设置了Redis密码,还需要配置密码
sentinel auth-pass mycluster yourpassword可选:设置哨兵日志级别
logfile "/path/to/sentinel-26380.log"
loglevel notice可选:指定哨兵之间的通信端口(通常不需要修改)
sentinel announce-ip 127.0.0.1
sentinel announce-port 26380

哨兵节点3 (sentinel-26381.conf)

哨兵监听的端口号
port 26381绑定IP地址(根据实际情况修改)
bind 127.0.0.1指定要监控的集群名称和任意一个主节点的地址
sentinel monitor mycluster 127.0.0.1 7000 2设置法定人数(quorum),即至少需要多少个哨兵同意才能认为主节点下线
sentinel quorum mycluster 2设置哨兵认为主节点失效的时间阈值(毫秒)
sentinel down-after-milliseconds mycluster 5000设置故障转移的超时时间(毫秒)
sentinel failover-timeout mycluster 180000如果设置了Redis密码,还需要配置密码
sentinel auth-pass mycluster yourpassword可选:设置哨兵日志级别
logfile "/path/to/sentinel-26381.log"
loglevel notice可选:指定哨兵之间的通信端口(通常不需要修改)
sentinel announce-ip 127.0.0.1
sentinel announce-port 26381
3、启动哨兵节点

启动每个哨兵节点,确保它们能够正常运行并与集群中的Redis节点通信。

redis-sentinel /path/to/sentinel-26379.conf
redis-sentinel /path/to/sentinel-26380.conf
redis-sentinel /path/to/sentinel-26381.conf
4、验证哨兵

你可以通过以下命令连接到任意一个哨兵节点,查看其监控的集群状态:

redis-cli -p 26379 sentinel masters

说明:这条命令会返回哨兵监控的所有主节点的信息,包括集群名称、主节点的地址、从节点的数量等。

你还可以查看特定主节点的从节点信息:

redis-cli -p 26379 sentinel slaves mycluster

这条命令会返回与mycluster主节点关联的所有从节点的详细信息。

7、哨兵和集群对比总结

Redis哨兵(Sentinel)机制和Redis集群(Cluster)是两种不同的高可用性和可扩展性解决方案,它们各自解决的问题不同,并且在架构设计、使用场景以及实现方式上都有显著的区别。

Redis 哨兵(Sentinel)机制

1、目标

  • 高可用性:主要目的是为单个Redis实例提供自动故障转移能力,确保即使主节点发生故障,服务也可以通过从节点继续提供。
  • 监控:哨兵不仅负责故障检测和自动故障转移,还可以监控Redis实例的健康状况,并向管理员发送通知。

2、架构

  • 哨兵节点:由一个或多个哨兵进程组成,每个哨兵都独立地监控Redis主从节点的状态。
  • 主从复制:依赖于Redis的主从复制机制,其中有一个主节点负责处理写操作,多个从节点用于读取副本和数据备份。
  • 法定人数:需要达到一定数量的哨兵同意才能进行故障转移,以避免错误决策。

3、工作流程

  • 心跳检测:哨兵定期检查Redis节点的可达性,如果主节点不可达,则会尝试发起故障转移。
  • 选举领头哨兵:当决定进行故障转移时,哨兵之间会选举出一个领头哨兵来协调整个过程。
  • 故障转移:领头哨兵选择一个新的主节点,更新所有从节点的配置,并通知客户端新的主节点地址。

4、使用场景

  • 适用于对数据一致性要求较高且希望保持单一入口点的应用场景。
  • 适合那些不需要水平扩展读性能的应用,因为所有的写入仍然集中在单个主节点上。

Redis 集群(Cluster)

1、目标

  • 水平扩展:旨在通过将数据分布在多个节点上来提升Redis的存储容量和吞吐量。
  • 高可用性:通过分片(sharding)和内置的复制机制,确保即使某些节点失效,整个集群仍能正常工作。

2、架构

  • 分片(Sharding):数据被分割成多个哈希槽(hash slot),每个槽可以分配给集群中的不同节点。
  • 多主模式:集群中每个分片都有一个主节点和零个或多个从节点,所有主节点都可以接受写操作。
  • 自动再平衡:当节点加入或离开集群时,集群能够自动调整哈希槽的分布,以保持负载均衡。

3、工作流程

  • 客户端路由:客户端必须能够根据键值计算出对应的哈希槽,并直接连接到持有该槽的主节点。
  • 故障转移:如果某个主节点失效,其对应的从节点会被自动晋升为主节点,其他节点也会相应地更新配置。
  • 数据迁移:当集群结构发生变化时,如添加新节点或移除旧节点,数据会在节点间迁移,以保证哈希槽的均匀分布。

4、使用场景

  • 适用于需要大规模水平扩展的应用,特别是那些对读写性能有较高要求的情况。
  • 适合那些可以容忍一定程度的数据不一致性的应用,因为集群中的多个主节点可能会导致短暂的数据异步。

比较与结合

  • 功能重叠:虽然两者都能提供高可用性,但哨兵更侧重于故障转移和监控,而集群则专注于数据分片和水平扩展。
  • 互斥性:理论上,哨兵和集群可以同时使用,但实际上这样做并不常见,因为集群本身已经包含了哨兵的部分功能,比如自动故障转移和复制。
  • 复杂度:哨兵相对简单,易于设置和管理;集群则更为复杂,涉及到哈希槽的管理和数据迁移等高级特性。
  • 适用性:对于小型或中型部署,哨兵可能就足够了;而对于大型应用或者对性能有极高要求的场景,集群可能是更好的选择。

总结

Redis哨兵和集群是针对不同需求设计的解决方案。哨兵适用于需要高可用性但不需要大规模扩展的应用,而集群则更适合那些既需要高可用性又需要良好扩展性的应用场景。


http://www.mrgr.cn/news/80370.html

相关文章:

  • 信号处理相关的东东(学习解惑)
  • 单片机:实现交通信号灯(附带源码)
  • Vue的常用修饰符
  • 39 基于单片机的角度、水位、温度、辅助热源、电机仿真
  • ctfshow xss
  • 国信华源科技赋能长江蓄滞洪区水闸管护项目验收成果报道
  • .Net WebAPI(一)
  • 【网络安全】Web Timing 和竞争条件攻击:揭开隐藏的攻击面
  • Vulhub:Redis[漏洞复现]
  • 交通道路上的车辆,人,自行车摩托车自动识别数据集,使用YOLO,COCO,VOC格式对2998张原始图片标注
  • 51c视觉~YOLO~合集6~
  • C/C++包含头文件的两种方式:尖括号方式 (<>)和双引号方式 (““)的区别
  • ubuntu服务器木马类挖矿程序排查、及安全管理总结
  • 【CSS in Depth 2 精译_079】第 13 章:渐变、阴影与混合模式概述 + 13.1:CSS 渐变效果(上)——使用多个颜色节点
  • 深度学习——激活函数、损失函数、优化器
  • 简单了解一下 Go 语言的构建约束?
  • F-Cooper论文精读
  • Apache Kylin最简单的解析、了解
  • 基于区块链技术的新能源管理平台
  • 【Linux】结构化命令
  • 前端项目初始化搭建(二)
  • 从 Router 到 Navigation:HarmonyOS 路由框架的全面升级与迁移指南
  • 流程引擎Activiti性能优化方案
  • Y3编辑器教程5:触发器进阶使用(镜头、UI、表格、函数库、排行榜、游戏不同步)
  • Linux+Docker onlyoffice 启用 HTTPS 端口支持
  • union find算法 c++