面试题答案
一键面试分片键选择
- 用户ID:由于是社交平台,每个用户都有唯一ID。以用户ID作为分片键可以将不同用户的数据均匀分布在各个分片上。这样在处理用户相关操作,如获取用户操作记录时,能够直接定位到相应分片,减少跨分片查询。例如,查询用户
user_123
的操作记录,系统可直接找到存储user_123
数据的分片,而无需遍历所有分片。 - 时间戳(结合用户ID):考虑到每个用户操作记录多且读写频繁。若仅用用户ID,同一用户的操作记录会集中在一个分片上,在高并发读写时可能造成该分片压力过大。可以结合时间戳,比如操作时间,形成复合分片键(用户ID + 操作时间)。这样按时间顺序的操作记录会分布到不同分片,减轻单个分片的负载。如用户
user_123
在不同时间的操作记录会分布在不同分片,降低了读写热点。
分片优化
- 副本集:为每个分片创建副本集,其中一个节点作为主节点处理读写操作,其他副本节点用于数据备份。当主节点出现故障时,副本节点中的一个会自动提升为主节点,保证数据的高可用性。例如,某个分片的主节点硬件故障,副本集中的其他节点会继续提供服务,用户几乎无感知。
- 预分片:根据预估的数据量和增长趋势进行预分片。提前创建足够数量的分片,避免后期因数据增长过快导致分片不足而进行数据迁移。如预计平台在未来一年内用户数据量翻倍,提前规划好翻倍后所需的分片数量并创建。
- 读写分离:对于读操作频繁的场景,将读请求分发到副本集的副本节点上,减轻主节点的读压力。可以通过驱动程序或中间件实现读写分离。例如,应用程序通过配置将读请求发送到副本节点,写请求发送到主节点,提高系统整体性能。
- 索引优化:在分片键以及常用查询字段上创建合适的索引。对于以用户ID为分片键的情况,在用户ID字段上创建索引可加快查询速度。若经常按操作类型查询用户操作记录,也在操作类型字段上创建索引。这样在查询时能够快速定位到所需数据,减少查询时间。