Redis拆分方案一

本文介绍了一种在用户数量增长时进行Redis扩容拆分的方法,包括通过主从复制实现读写分离,以及如何平滑迁移数据的过程。

      近2年多一直在移动互联网领域打拼,所做的移动交友类产品的用户数快速增长使得我们需要对系统架构不断的优化改变来适应。在优化存储的选择上从经历了MySQL+MC->MySQL+MC+Redis+Mongodb->MySQL+Redis+PostgreSQL的过渡。Redis作为一个优秀的NoSQL存储方案,在系统中得到很广泛的应用。

 

      本文记录一下在Redis扩容拆分是的一个思路:以粉丝关系的Redis为例,采用Master-Slave(主从复制,读写分离),在用户数达到一定规模后,增加一个Redis做扩容。

     具体做法:

          1、准备一个新的Redis作为Slave-A,配置后达到一主两从;

          2、在Master将数据全部复制到新的Slave-A后,按照特定规则将新的数据写到新的Slave-A;

          3、断开Master与新Slave-A的联系;

          4、再新增一个Redis作为Slave-B,关联到Slave-A上,提升Slave-A为Master-A;

          5、删除原有Master和Master-A的无效数据。

Redis Cluster 是 Redis 官方提供的分布式集群解决方案,旨在解决单机性能瓶颈和高可用性需求。它通过数据分片(sharding)实现横向扩展,并通过节点间的通信机制保障数据致性和故障转移能力。 ### 集群部署方案 Redis Cluster 的部署通常包括多个节点,这些节点分为 **主节点(Master)** 和 **从节点(Slave)** 两种角色。每个主节点负责部分数据槽(slot),而从节点则用于主节点的故障转移备份。 在部署时,建议至少使用三个主节点以保证集群的基本可用性和容错能力。官方推荐使用奇数个节点来避免脑裂问题(split-brain)[^1]。例如,在三节点集群中,若个节点失联,其余两个节点可以达成多数共识进行选举和恢复操作。 ### 实现原理 #### 数据分片与槽位定位 Redis Cluster 将所有数据划分为 16384 个哈希槽(hash slot),每个键通过 CRC16 校验后对 16384 取模得到对应的槽位,从而决定该键存储在哪个主节点上。这种设计使得数据分布均匀且易于扩展[^2]。 ```python def get_slot(key): import crc16 return crc16.crc16xmodem(key.encode()) % 16384 ``` #### 节点间通信机制 Redis Cluster 使用 Gossip 协议进行节点间通信,主要包括以下几种消息类型: - **PING 消息**:用于检测其他节点是否存活。 - **PONG 消息**:响应 PING 消息或主动告知自身状态。 - **MEET 消息**:新加入节点时通知已有节点认识它。 - **FAIL 消息**:当某个节点被认为下线时广播该消息。 - **PUBLISH 消息**:用于发布频道事件。 Gossip 协议的优点是去中心化、传播速度快;缺点是可能存在短暂的数据不致情况,以及在网络不稳定时容易产生误判[^1]。 #### 故障转移与选举机制 当某个主节点被标记为“疑似下线”(PFAIL)后,其他节点会通过定时间确认其确实不可达,随后将其标记为“已下线”(FAIL)。此时,与其相关的从节点将发起选举流程,争取成为新的主节点。选举基于 Raft 算法的思想,确保只有个从节点最终胜出并接管原主节点的工作负载[^3]。 #### 网络抖动处理 为了应对网络波动带来的临时性连接中断问题,Redis Cluster 设置了相应的超时阈值(如 node timeout),只有当某节点连续超过此时间未响应时才视为下线。此外,还可以配置适当的重试策略和心跳间隔以提高鲁棒性。 #### 批量操作支持 Redis Cluster 支持部分批量命令,但要求涉及的所有键必须位于同个槽内,否则客户端需要自行拆分成多个请求发送至不同节点执行。这限制了某些场景下的效率,但也简化了实现复杂度并降低了跨节点事务管理的成本[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值