1.简介
(1).问题描述
2010年,Facebook有了3000个Memcache节点,但是发现一个问题,增加机器后性能没有提升反而下降了,这便是无底洞问题。
(2).问题关键点
执行一个命令,一次网络传输变成多次网络传输,增加了网络的开销。
- 更多的机器!=更高的性能
- 批量接口需求(mget或者mset等)
2.优化IO的方法
- 命令本身优化:如慢查询命令keys或hgetall bigkey
- 降低介入成本:例如客户端长连接/连接处或者NIO等
- 减少网络通信次数
3.四种批量优化的方法
(1).串行mget
(2).串行IO
(3).并行IO
(4).hash_tag
(5).四种方案对比
方案 | 优点 | 缺点 | 网络IO |
---|---|---|---|
串行mget | 编程简单,少量keys满足需求 | 大量keys请求延时严重 | O(keys) |
串行IO | 编程简单,少量节点满足需求 | 大量node延迟严重 | O(nodes) |
并行IO | 利用并行特性,延迟取决于最慢的节点 | 编程复杂,超时定位困难 | O(max_slow(node)) |
hash_tag | 性能最高 | 读写增加tag维护成本,tag分布易出现数据倾斜 | O(1) |