如何定位及解决分布式锁缓慢问题,看这里!
1 业务背景
在苍穹系统中,zookeeper的使用场景包括:微服务配置服务、微服务注册中心、分布式ID、分布式锁、后台任务调度、分布式计算集群模式(AlgoX)。其中,分布式锁使用了zookeeper客户端CuratorFramework框架的Lock接口,并进行了增强。
随着业务发展和用户数量不断增加,分布式锁服务使用愈加频繁(在分布式环境下,需要独占(锁定)某个资源的时候,需要用到分布式锁。关于分布式锁的介绍及使用方法可参考“看完这份攻略,'苍穹分布式锁'拿捏得稳稳的”)。在一些环境中,可能出现用户操作业务后获取分布式锁缓慢的问题,导致zookeeper性能瓶颈,进而阻塞业务功能,影响系统的稳定性和可用性。
那么,如何解决上述问题呢?本期文章便手把手教你如何定位及解决分布式锁缓慢问题,以确保系统正常运行~
2 如何分析zookeeper性能瓶颈
通过Monitor的组件检测(菜单路径为:【基础组件】→【组件检测】),可以对zookeeper进行测速,正常情况应该小于10ms。如果持续大于50ms,就可以判断zookeeper有性能瓶颈,以下图为例,测速时间288ms,表明有非常严重的性能瓶颈。
zookeeper性能瓶颈示例
那么,如何分析性能瓶颈的原因呢?根据经验,分布式锁由于频繁读写zookeeper,是造成zookeeper性能瓶颈的主要原因。具体分析步骤如下:
首先,进入zookeeper服务器,通过iotop命令观察IO(Input/Output)情况,zookeeper的读写IO高达86%,这台机器的磁盘读写速率不到300KB/s,属于比较差的IO磁盘。
通过iotop命令观察IO情况
其次,通过Monitor线程监控页面,观察是否有线程阻塞在获取分布式锁中,且等待时间较长,如下图,等待时间长达6秒。
monitor线程监控示例
如果出现了上面的现象,说明zookeeper遇到性能瓶颈,并且是由于分布式锁导致的。
3 解决方案
针对上述问题现象,建议为分布式锁单独部署一个zookeeper服务,同时,将分布式锁的zookeeper配置成不落盘,以降低磁盘IO差导致的性能瓶颈。方案具体实现步骤如下:
3.1 分布式锁独立部署zookeeper服务
部署一套新的zookeeper,然后在MC中将分布式锁的zookeeper地址改为新的zookeeper地址,最后为苍穹配置分布式锁zookeeper服务器信息,配置方法如下:
1. 在MC中新增公共配置DLock.zookeeper=部署的zookeeper地址:端口,例如:
单机部署:DLock.zookeeper=ip:port
集群部署:DLock.zookeeper=ip1:port,ip2:port,ip3:port
2. 在MC集群管理列表中编辑对应集群,配置后保存发布即可。
3.2 zookeeper部署配置为不落盘
分布式锁使用zookeeper是可以不落盘的,只作为临时存储。所以,为了提升zookeeper的读写性能,我们可以将zookeeper配置为不落盘。通过修改zookeeper的配置,让其不走磁盘IO,而是将数据和日志存储在内存中。具体步骤如下:
步骤一:在zookeeper部署机器的/dev/shm目录下创建两个目录,例如:
mkdir /dev/shm/datadir mkdir /dev/shm/logdir
步骤二:在zookeeper安装目录下找到conf/zoo.cfg文件,编辑该文件,设置以下属性值:
dataDir=/dev/shm/datadir dataLogDir=/dev/shm/logdir forceSync=no
完整的单机zoo.cfg文件配置如下:
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/dev/shm/datadir dataLogDir=/dev/shm/logdir forceSync=no clientPort=2181 maxClientCnxns=600 autopurge.snapRetainCount=3 autopurge.purgeInterval=1
以上配置是针对单机部署的情况,如果是集群部署,则需要在每个zookeeper服务中修改相应的配置文件。配置完成后,重新启动zookeeper服务即可生效。这样就可以将zookeeper的数据和日志存储在内存中,避免了磁盘IO对读写性能的影响。
注意事项
以上方法实际上是使用Linux的共享内存机制,/dev/shm目录实际上会映射到内存上,所以在内存分配上,需要给共享内存预留1G以上,比如虚拟机有8G内存,zookeeper JVM参数堆内存建议不要超过6G,即虚拟机内存和zookeeper的堆内存保持2G的差额,否则可能会触发Linux OOM。
4 划重点
1. 分布式锁由于频繁读写zookeeper,是造成zookeeper性能瓶颈的主要原因。
2. 解决分布式锁缓慢问题的方法如下:
(1)为分布式锁独立部署zookeeper服务:部署一套新的zookeeper,然后在MC中将分布式锁的zookeeper地址改为新的zookeeper地址,最后为苍穹配置分布式锁zookeeper服务器信息;
(2)将分布式锁的zookeeper配置成不落盘,以降低磁盘IO差导致的性能瓶颈。
#往期推荐#
更多精彩内容,“码”上了解!↓
如何定位及解决分布式锁缓慢问题,看这里!
本文2024-09-23 00:28:04发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-139651.html