一、Redis主从复制
基本概念:
- 主节点 (Master):接收写入请求,并将数据更新到它的数据库中。
- 从节点 (Slave):从主节点同步数据,并可以处理读取请求,从而减轻主节点的负担。
主从复制的作用:
●数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
●故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
●负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
●高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
主从复制流程:
- 主节点初始化:主节点在启动时等待从节点的连接请求。
- 从节点连接:从节点向主节点发送同步请求。
- 主节点同步数据:
- 全量同步:从节点请求主节点进行全量数据同步。主节点将当前数据库快照发送给从节点。
- 增量同步:在全量同步完成后,主节点会将后续的写操作日志(AOF日志或复制积累的命令)发送给从节点,以保持数据的一致性。
- 从节点接收数据:从节点接收并应用主节点的数据快照和增量数据,确保其数据与主节点保持一致。
其他注意事项:
- 故障转移:可以结合工具如Redis Sentinel或Redis Cluster来实现高可用性和自动故障转移。
- 持久化:确保主节点和从节点的持久化策略一致,以防数据丢失。
- 网络延迟:主从复制对网络延迟敏感,确保网络连接稳定。
- 监控:监控主从复制的状态,以确保数据一致性和性能。
二、Redis哨兵模式
主要概念:
- Sentinel:一个守护进程,用于监控Redis主节点和从节点,进行故障检测,并在主节点出现故障时自动进行故障转移。
- 主节点 (Master):处理写请求,并将数据同步到从节点。
- 从节点 (Slave):从主节点同步数据,并可以处理读取请求。
- 故障转移 (Failover):当Sentinel检测到主节点失败时,它会选择一个从节点作为新的主节点,并更新集群中的所有从节点指向新的主节点。
Sentinel工作原理:
- 监控:Sentinel不断监控主节点和从节点的状态,检查它们的健康状况。
- 故障检测:如果Sentinel检测到主节点失效,会进行进一步的验证,以确认主节点确实不可用。
- 故障转移:当确认主节点不可用时,Sentinel会选择一个从节点提升为新的主节点,并更新其他从节点的配置,使它们从新的主节点同步数据。
- 通知:Sentinel将新的主节点信息通知客户端和应用程序,以确保它们能够重新连接到正确的主节点。
配置步骤:
-
配置主节点和从节点: 在主节点和从节点的
redis.conf
配置文件中,确保主节点和从节点已经正确配置,并能互相通信。 -
配置Sentinel: 在每个Sentinel的配置文件中,需要指定要监控的主节点的信息。配置示例如下:
sentinel monitor mymaster <master-ip> <master-port> <quorum> sentinel auth-pass mymaster <password> # 如果Redis启用了密码保护 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1
mymaster
:监控的主节点名称(可以是任意自定义名称)。<master-ip>
和<master-port>
:主节点的IP地址和端口。<quorum>
:Sentinel需要的最小同意数,以确认主节点故障。通常是Sentinel实例数的一半加一。down-after-milliseconds
:Sentinel判定主节点为故障之前等待的时间。failover-timeout
:故障转移过程中的超时时间。parallel-syncs
:在故障转移过程中,可以同时进行数据同步的从节点数量。
-
启动Sentinel: 启动Redis Sentinel进程,指向配置文件:
redis-sentinel /path/to/sentinel.conf
-
监控和管理: 使用
SENTINEL
命令监控Sentinel的状态,如SENTINEL slaves mymaster
或SENTINEL master mymaster
。
其他注意事项:
- 多Sentinel实例:为了确保高可用性,通常建议至少运行三个Sentinel实例,以避免单点故障。
- 客户端配置:确保客户端库支持Sentinel模式,并能够根据Sentinel提供的信息自动连接到新的主节点。
- 持久化:确保所有Redis节点的持久化配置正确,以防数据丢失。
- 网络延迟:Sentinel对网络延迟比较敏感,确保Sentinel和Redis节点之间的网络稳定。
三、Redis集群模式
主要概念:
- 集群节点:Redis Cluster由多个Redis节点组成,包括主节点和从节点。主节点负责数据存储和处理请求,从节点用于数据备份和故障转移。
- 分片 (Sharding):Redis Cluster将数据分布到多个主节点上,通过分片机制实现数据的水平扩展。数据通过哈希槽(hash slots)分布在不同的主节点上。
- 哈希槽 (Hash Slots):Redis Cluster将数据键值映射到16384个哈希槽上,每个主节点负责一部分哈希槽。
- 故障转移和副本:每个主节点可以有一个或多个从节点(副本)。如果主节点发生故障,从节点会被提升为新的主节点,确保数据的高可用性。
Redis Cluster工作原理:
- 数据分片:Redis Cluster通过哈希槽将数据分布到不同的主节点上。每个主节点负责一部分哈希槽,从而分担存储和处理数据的负担。
- 请求路由:客户端请求会根据数据的键被路由到相应的主节点。如果主节点不可用,客户端会根据集群的响应自动重试。
- 故障检测和转移:Redis Cluster会定期检查主节点的健康状况,如果检测到主节点故障,会通过选举机制将从节点提升为新的主节点,并重新配置集群。
- 数据复制:主节点会将数据同步到其从节点,以确保数据的备份和高可用性。
配置步骤:
-
准备环境: 确保你有多个Redis节点用于集群配置。每个节点需要有足够的存储空间和计算资源。
配置Redis节点: 在每个Redis节点的配置文件(
redis.conf
)中,需要启用集群模式并配置集群相关选项。例如:port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
cluster-enabled yes
:启用集群模式。cluster-config-file nodes.conf
:指定存储集群节点信息的文件。cluster-node-timeout 5000
:节点超时时间,单位为毫秒。
-
启动Redis实例: 启动Redis实例,确保每个实例的配置文件正确。
-
创建Redis Cluster: 使用
redis-cli
工具创建集群。例如:redis-cli --cluster create <node1-ip>:6379 <node2-ip>:6379 <node3-ip>:6379 <node4-ip>:6379 <node5-ip>:6379 <node6-ip>:6379 --cluster-replicas 1
这里
<node1-ip>:6379
等是你要加入集群的节点地址。--cluster-replicas 1
指定每个主节点有一个从节点。 -
验证集群状态: 使用以下命令检查集群状态:
redis-cli --cluster info <node-ip>:6379
-
管理和监控: 通过
redis-cli
的CLUSTER
命令可以管理和监控集群状态。例如:CLUSTER NODES
:查看集群中的节点信息。CLUSTER MEET
:将新节点加入集群。CLUSTER FORGET
:从集群中移除节点。
其他注意事项:
- 数据迁移:Redis Cluster会在节点之间自动迁移数据,以实现负载均衡。
- 网络配置:确保集群节点之间的网络连接稳定,以便节点可以正常通信。
- 客户端支持:使用支持Redis Cluster模式的客户端库,确保客户端能够正确处理集群模式下的数据路由和故障转移。