Pika 最佳实践
我们根据360内部的pika使用经验及社区用户的问题反馈,整理了如下文档并会不断更新
为了避免以后你可能找不到本文,可点击右上方的star进行关注
pika最佳实践之零:
在群里提问主动带上版本号能大幅度加快问题解决速度(QQ群:294254078)
pika最佳实践之一:
我们建议使用3.0的最新版,如果不愿意使用3.X,请使用2.3.6,否则你会发现你遇到的很多问题都在我们的bug修复列表中。(目前2.0版本已不再维护)
pika最佳实践之二:
pika的线程数量建议和cpu总线程数一致,如果是单机多实例的部署,每个pika实例的线程数量可以酌情降低,但不建议低于cpu总线程数的1/2
pika最佳实践之三:
pika的性能和IO性能息息相关,我们不建议在机械盘上部署耗时敏感项目的pika,另外为了避免一些稀奇古怪的问题,主从服务器的硬件性能应当尽量一致
pika最佳实践之四:
在使用pika多数据结构的时候,尽量确保每个key中的field不要太多,建议每个key的field数量不要超过1万个,特大key可以考虑拆分为多个小key,这样可以避免超大key很多潜在的性能风险
pika最佳实践之五:
root-connection-num
参数非常有用,意为“允许通过127.0.0.1登录pika的连接数”,它与最大连接数配置项maxclients
独立,maxclients
的用尽并不会影响root-connection-num
,因此在发生异常maxclients
被用尽的场景中,管理员仍然可以登录pika所在服务器并通过127.0.0.1来登入pika处理问题,避免了maxclients
耗尽无法登录处理的尴尬局面
pika最佳实践之六:
client kill
命令被加强了,如果你想一次性杀掉当前pika的所有连接,只需要执行client kill all
,不用担心,用于同步的连接不会受到影响
pika最佳实践之七:
适当的调整timeout
参数,通过该参数pika会主动断开不活动时间超过timeout
值的连接,避免连接数耗尽问题的发生,由于连接也需要申请内存,因此合理的配置timeout
参数也能够在一定程度上降低pika的内存占用
pika最佳实践之八:
pika的内存占用主要集中在sst文件的cache和连接申请内存,而通常连接申请内存会比sst的cache要大很多,pika目前已支持连接申请内存的动态调整、回收,因此连接占用的总内存大小是可以粗略估算的,如果你的pika内存占用远超预估或大于10g,那么可能是内存泄漏了,尝试依次执行命令client kill all
和tcmalloc free
来对连接内存进行强制回收,如果效果不好请升级到最新版本
pika最佳实践之九:
非常不建议单机运行pika,最简集群状态应为一主一从,而主从集群的容灾模式有很多种,可以考虑使用lvs、vip漂移、配置管理中间件等
pika最佳实践之十:
建议使用主从集群而不是双主模式,在实际使用中双主模式对使用规范的要求、网络环境要求相对更高,使用不规范、网络环境不好会造成双主模式出现问题,在出现问题后,双主模式的数据修复比主从集群数据修复复杂度要大
pika最佳实践之十一:
如果你的pika单机运行(非主从、主主集群),并部署在可靠的存储上,那么可以考虑通过关闭binlog(将write-binlog
参数设置为no)来提高写入性能,不过我们并不推荐单机运行,至少应当有一个从库用于容灾,所以非单机运行pika 不建议关闭binlog
pika最佳实践之十二:
pika的数据目录中有大量的sst文件,这些文件随着pika数据量的增加而增加,因此你需要为pika配置一个更大的open_file_limit
避免不够用,如果你不希望pika占用太多的文件文件描述符,可以通过适当增大单个sst的体积来降低sst的总数量,对应参数为target-file-size-base
pika最佳实践之十三:
不要修改log目录中的write2file
文件和manifest
,它们是同步相关的重要文件,write2file
为binlog
角色,而manifest
则用来确保实例重启后的binlog续写及实例为从库时帮助同步中断重连后续传
pika最佳实践之十四:
pika的全量同步是通过rsync来进行的,因此我们提供了rsync的传输限速参数db-sync-speed
,该参数的单位是mb,我们建议在千兆环境中该参数设置不应高于75,而在万兆环境中不应高于500,这样可以避免pika在全量同步的时候将所在服务器网卡用尽而影响到部署在服务器上的其它服务
pika最佳实践之十五:
在pika中执行key *
并不会造成pika阻塞(pika是多线程的),但在存在巨量key的场景下可能会造成临时占用巨量内存(这些内存用于该连接存放key *
的执行结果,会在key *
执行完毕后释放),因此使用keys *
一定要小心谨慎
pika最佳实践之十六:
如果发现pika有数据但info keyspace
的显示均为0,这是因为pika并没有像Redis对key的数量做实时统计并展示,pika中key的统计需要人工触发,执行info keyspace 1
,注意执行info keyspace
是不会触发统计的,没有带上最后的参数1
将会仅仅展示上一次的统计结果,key的统计是需要时间的(这是一个异步的操作),执行状态可以通过info stats
中的is_scaning_keyspace
进行查看,该项值为yes
表明统计正在进行,为no
时表明没有正在进行的统计/上一次统计已结束,在统计执行完毕前info keyspace
不会更新,info keyspace
的数据是存放在内存里的,重启将清零
pika最佳实践之十七:
不要在pika执行全量compact
的时候触发key统计(info keyspace 1
)或执行keys *
,否则会造成数据体积暂时膨胀直到key统计、keys *
执行结束
pika最佳实践之十八:
对存在大量过期、多数据结构内元素操作的实例配置compact-cron
可以非常好的避免无效但还未被彻底清理的数据对性能造成的影响,或升级到3.0后打开新的key级auto_compact
功能
如果你遇到了下面的情况,那么你的实例可能存在未及时清理的无效数据带来的性能风险:
- 异常的数据体积(大于估算值10%以上),可以通过执行
compact
命令,在compact
执行完毕后观察数据体积是否恢复正常 - 请求耗时突然异常增大,可以通过执行
compact
命令,在compact
执行完毕后观察请求耗时是否恢复正常
pika最佳实践之十九:
在pika3.0中我们提供了过期key的统计(可通过info keyspace 1