• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Redis分片集群的实现

    发布者: 山止川行 | 发布时间: 2025-6-19 12:39| 查看数: 73| 评论数: 0|帖子模式

    1. Redis Cluster的核心概念


    哈希槽(Hash Slots)

    Redis Cluster使用哈希槽来实现数据分片。整个数据空间被划分为16384个哈希槽(slot),这些槽均匀分布到不同的主节点上。

    • 哈希计算:对于每一个键,Redis使用CRC16算法计算其哈希值,并对16384取模,确定该键属于哪个哈希槽。
    • 槽分配:每个主节点负责一部分哈希槽。例如,如果有三个主节点,它们可以分别负责5461个哈希槽。


    主从复制与故障转移

    为了保证高可用性,每个主节点都有一个或多个从节点。当主节点发生故障时,集群会自动进行故障转移,提升其中一个从节点为新的主节点。

    • 主从同步:从节点会持续地从主节点同步数据,以保持数据的一致性。同步过程包括全量同步和增量同步。
    • 故障检测与恢复:集群中的节点会定期交换信息,监测其他节点的状态。如果某个主节点失效,集群会选择一个从节点升级为主节点,并重新分配哈希槽。

    2. 详细的配置步骤


    准备节点

    假设我们有6个Redis实例(3个主节点和3个从节点),分别运行在不同的端口上。

    节点配置示例 (redis-node.conf)

    每个节点的配置文件略有不同,主要是端口号和角色的不同。以下是每个节点的配置文件示例:

    主节点1: redis-node1.conf (Port: 7000)
    1. # 端口号
    2. port 7000

    3. # 启用集群模式
    4. cluster-enabled yes

    5. # 集群配置文件路径,用于存储集群状态信息
    6. cluster-config-file nodes-7000.conf

    7. # 节点超时时间(毫秒),超过此时间未响应视为故障
    8. cluster-node-timeout 5000

    9. # 开启AOF持久化
    10. appendonly yes

    11. # 可选配置项
    12. # 设置密码保护
    13. # requirepass yourpassword

    14. # 设置最大内存使用量
    15. # maxmemory 2gb

    16. # 设置持久化策略
    17. # appendfsync everysec
    复制代码
    从节点1: redis-node2.conf (Port: 7001)
    1. # 端口号
    2. port 7001

    3. # 启用集群模式
    4. cluster-enabled yes

    5. # 集群配置文件路径,用于存储集群状态信息
    6. cluster-config-file nodes-7001.conf

    7. # 节点超时时间(毫秒),超过此时间未响应视为故障
    8. cluster-node-timeout 5000

    9. # 开启AOF持久化
    10. appendonly yes

    11. # 设置从节点的主节点
    12. slaveof 127.0.0.1 7000

    13. # 可选配置项
    14. # 设置密码保护
    15. # requirepass yourpassword

    16. # 设置最大内存使用量
    17. # maxmemory 2gb

    18. # 设置持久化策略
    19. # appendfsync everysec
    复制代码
    主节点2: redis-node3.conf (Port: 7002)
    1. port 7002
    2. cluster-enabled yes
    3. cluster-config-file nodes-7002.conf
    4. cluster-node-timeout 5000
    5. appendonly yes
    复制代码
    从节点2: redis-node4.conf (Port: 7003)
    1. port 7003
    2. cluster-enabled yes
    3. cluster-config-file nodes-7003.conf
    4. cluster-node-timeout 5000
    5. appendonly yes
    6. slaveof 127.0.0.1 7002
    复制代码
    主节点3: redis-node5.conf (Port: 7004)
    1. port 7004
    2. cluster-enabled yes
    3. cluster-config-file nodes-7004.conf
    4. cluster-node-timeout 5000
    5. appendonly yes
    复制代码
    从节点3: redis-node6.conf (Port: 7005)
    1. port 7005
    2. cluster-enabled yes
    3. cluster-config-file nodes-7005.conf
    4. cluster-node-timeout 5000
    5. appendonly yes
    6. slaveof 127.0.0.1 7004
    复制代码
    启动节点

    依次启动所有节点:
    1. redis-server /path/to/redis-node1.conf
    2. redis-server /path/to/redis-node2.conf
    3. redis-server /path/to/redis-node3.conf
    4. redis-server /path/to/redis-node4.conf
    5. redis-server /path/to/redis-node5.conf
    6. redis-server /path/to/redis-node6.conf
    复制代码
    创建集群

    使用
    1. redis-cli
    复制代码
    工具创建集群:
    1. 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
    复制代码
    这里的
    1. --cluster-replicas 1
    复制代码
    表示每个主节点有一个从节点。

    3. 实际操作示例


    写入数据

    你可以像平常一样写入数据,Redis Cluster会自动将数据分配到合适的节点上。
    1. redis-cli -c -p 7000
    2. 127.0.0.1:7000> SET key1 value1
    3. -> Redirected to slot [12182] located at 127.0.0.1:7002
    4. OK
    复制代码
    注意这里
    1. -c
    复制代码
    参数表示启用集群模式,这样客户端会自动处理重定向命令。

    读取数据

    读取数据时,同样可以通过任意节点访问:
    1. redis-cli -c -p 7000
    2. 127.0.0.1:7000> GET key1
    3. -> Redirected to slot [12182] located at 127.0.0.1:7002
    4. "value1"
    复制代码
    故障模拟与恢复

    你可以手动关闭一个主节点来模拟故障,并观察集群如何进行自动故障转移。

    关闭主节点
    1. redis-cli -p 7002 shutdown
    复制代码
    检查集群状态
    1. redis-cli -p 7000 cluster nodes
    复制代码
    你应该看到原来的从节点已经被提升为主节点,并接管了原主节点的哈希槽。

    4. Redis Cluster的内部机制


    数据分片与重定向


    • 数据分片:每个键通过哈希槽映射到特定的主节点。客户端发送的请求会被路由到相应的节点。
    • 重定向:如果客户端请求了一个不属于当前节点的哈希槽,集群会返回一个
      1. MOVED
      复制代码
      响应,指示客户端应该连接到正确的节点,客户端收到这个响应后,会自动重定向到指定的节点。
    1. # 连接到集群中的任意节点
    2. redis-cli -c -p 7000

    3. # 尝试设置一个键
    4. 127.0.0.1:7000> SET key1 value1
    5. -> Redirected to slot [12182] located at 127.0.0.1:7002
    6. OK

    7. # 从同一个客户端再次尝试获取相同的键
    8. 127.0.0.1:7000> GET key1
    9. -> Redirected to slot [12182] located at 127.0.0.1:7002
    10. "value1"
    复制代码
    主从复制与故障转移


    • 主从同步:从节点会持续地从主节点同步数据,以保持数据的一致性。同步过程包括全量同步和增量同步。

      • 全量同步:首次同步时,从节点会从主节点获取完整的数据集。

        • 过程:从节点向主节点发起全量同步请求,主节点生成RDB文件并传输给从节点。从节点加载RDB文件并开始接收后续的增量更新。

      • 增量同步:后续同步时,从节点会接收主节点的增量更新(如写操作日志)。

        • 过程:主节点记录写操作日志(称为复制积压缓冲区),从节点根据偏移量请求缺失的部分日志。


    • 故障检测:集群中的节点会定期交换信息,监测其他节点的状态。如果某个主节点连续多次未能响应心跳消息,它会被标记为疑似下线(PFAIL)。

      • 心跳检查:每个节点会定期向其他节点发送心跳消息,默认间隔是1秒。
      • 标记PFAIL:如果一个节点在一定时间内没有回应心跳消息,它会被标记为疑似下线(PFAIL)。
      • 标记FAIL:如果大多数节点都标记某个节点为PFAIL,则该节点会被标记为FAIL。

    • 故障转移:一旦主节点被确认下线,集群会选择一个从节点提升为主节点,并重新分配哈希槽。具体步骤如下:选举:集群中的节点会选举一个新的主节点。选举过程基于Raft一致性算法,确保只有一个从节点被选中。

      • 投票过程:每个从节点会根据一定的规则投票给一个候选者。最终得票最多的从节点会被选为新的主节点。
      数据同步:新当选的主节点会从其他节点获取最新的数据,确保数据一致性。

      • 部分同步:如果从节点已经有部分数据,可以只同步缺失的部分数据。
      • 全量同步:如果从节点的数据完全丢失,需要进行全量同步。
      重新分配哈希槽:新的主节点接管原主节点的哈希槽,集群恢复正常服务。


    5. 总结

    Redis Cluster通过哈希槽实现了数据的分布式存储,并提供了高可用性和自动故障转移功能。这使得它非常适合于需要处理大量数据和高并发请求的应用场景。同时,现代的Redis客户端库也能够很好地支持集群模式下的自动重定向和负载均衡。
    到此这篇关于Redis分片集群的实现的文章就介绍到这了,更多相关Redis分片集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/339193sdq.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表