面试题答案
一键面试算法整体架构
- 中心调度器:负责管理整个集群的状态,接收客户端请求,决定数据应分配到哪个节点。它维护着集群节点信息、槽位分配表等关键数据。
- 节点通信层:各个Redis节点之间通过gossip协议等方式进行通信,交换彼此的状态信息,如节点是否正常、负载情况等。
数据结构
- 节点信息表:记录每个节点的IP、端口、负载指标(如当前处理的连接数、内存使用等)、是否正常等信息。
- 槽位分配表:存储每个槽位当前分配到的节点ID。槽位范围可以根据实际情况设定,例如0 - 16383。
- 设备 - 槽位映射表:记录每个物联网设备对应的槽位,以便快速定位数据所在节点。
分配策略
- 初始分配:
- 按照节点的处理能力(如CPU核心数、内存大小等)来按比例分配槽位。处理能力强的节点分配更多槽位。
- 例如,假设有三个节点A、B、C,处理能力比例为3:2:1,总槽位数为16384,则A节点分配8192个槽位,B节点分配5461个槽位,C节点分配2731个槽位。
- 动态分配:
- 当有新设备加入时,中心调度器根据当前各节点的负载情况,将新设备对应的槽位分配到负载最轻的节点。负载计算可以综合考虑连接数、内存使用、处理请求速率等因素。
- 例如,通过公式
负载 = 0.4 * 连接数 + 0.3 * 内存使用率 + 0.3 * (1 / 请求处理速率)
计算各节点负载,选择负载最小的节点分配槽位。
处理节点故障
- 故障检测:通过节点间的心跳机制和gossip协议,其他节点能快速发现故障节点。当中心调度器收到故障信息后,标记该节点为故障状态。
- 槽位重新分配:
- 中心调度器从故障节点接管其负责的槽位。
- 然后根据其他正常节点的负载情况,重新分配这些槽位。优先将槽位分配给负载较轻且处理能力较强的节点。
- 例如,故障节点原本负责1000 - 2000号槽位,中心调度器计算其他节点负载后,将1000 - 1500号槽位分配给节点X,1501 - 2000号槽位分配给节点Y。
- 数据迁移:正常节点根据新的槽位分配,从故障节点(若可访问,如磁盘数据仍可用)迁移对应的数据。
处理新增节点
- 节点加入:新增节点向中心调度器注册,中心调度器记录其节点信息。
- 槽位重新平衡:
- 中心调度器根据新增节点的处理能力和当前各节点负载,从其他节点匀出部分槽位给新增节点。
- 例如,新增节点处理能力与现有某个节点相当,中心调度器从其他节点平均分摊槽位给新增节点。
- 数据迁移:被分配了新槽位的节点,将对应的数据迁移到新增节点。