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