面试题答案
一键面试数据模型
- 基本信息:用户ID、姓名、年龄、性别等基础属性。可以将这些信息归为一个实体,以用户ID作为唯一标识。
- 动态发布:每条动态关联用户ID,包含动态内容、发布时间等信息。可以构建一个以动态ID(可基于时间戳或其他唯一生成规则)为标识,关联用户ID的模型。
- 好友关系:以用户ID为中心,记录与其建立好友关系的其他用户ID列表。
分片策略
- 基于用户ID哈希分片:
- 基本信息:对用户ID进行哈希计算,例如使用MD5、SHA - 1等哈希函数,将哈希值对分片数量(如N个分片节点)取模,得到的结果决定该用户基本信息存储在哪个分片上。这种方式可以保证用户基本信息的均匀分布,并且通过用户ID能快速定位到其基本信息所在分片。
- 动态发布:同样以用户ID为哈希依据,由于动态与用户紧密相关,按照用户ID哈希分片可以使同一用户的动态存储在同一分片或少量分片中,方便查询该用户所有动态。
- 好友关系:以用户ID哈希分片,能确保每个用户的好友关系数据存储在固定的分片上,便于查询和维护好友关系。
- 范围分片:可以按照注册时间范围,比如将用户按注册时间划分为不同的时间区间,每个时间区间对应一个分片。对于一些按时间维度查询频繁的场景(如查看早期注册用户的相关信息),这种方式更高效。
扩展机制
- 水平扩展:当数据量增长导致单个分片负载过高时,可以增加新的分片节点。重新计算哈希值对新的分片数量取模,将部分数据迁移到新节点。例如,原来有N个分片节点,新增一个节点后变为N + 1个节点,重新计算每个数据项的分片位置。
- 负载均衡调整:监控每个分片节点的负载情况(如CPU使用率、内存使用率、I/O读写速率等),当某个节点负载过高时,动态迁移部分数据到负载较低的节点。可以定期进行负载评估和数据迁移,以保持系统整体的负载均衡。
方案可能存在的风险及应对措施
- 哈希热点问题:如果部分用户ID哈希后集中在某些分片上,会导致这些分片负载过高。
- 应对措施:引入虚拟节点技术,将每个物理节点映射为多个虚拟节点,在计算哈希时以虚拟节点为目标。这样可以更均匀地分配数据,避免物理节点的负载不均衡。
- 数据迁移风险:在水平扩展或负载均衡调整进行数据迁移时,可能出现数据丢失、不一致等问题。
- 应对措施:在数据迁移前进行全量备份,迁移过程中采用双写机制,即同时写入原分片和目标分片,确保数据一致性。迁移完成后进行数据校验,验证迁移的正确性。
- 跨分片查询问题:当查询涉及多个分片数据时,如查询共同好友关系可能跨多个分片。
- 应对措施:构建索引表,记录部分跨分片关联信息,减少跨分片查询次数。或者采用分布式查询框架,对跨分片查询进行优化和统一管理。