如何定位及解决分布式锁缓慢问题,看这里!

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

如何定位及解决分布式锁缓慢问题,看这里!

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差导致的性能瓶颈。




#往期推荐#


# 看完这份攻略,“苍穹分布式锁”拿捏得稳稳的

苍穹分布式ID,你知多少?

处理分布式事务效率低下?苍穹TCC助你一臂之力

MQ高阶:基于MQ的分布式事务解决方案


更多精彩内容,“码”上了解!↓


上传图片

如何定位及解决分布式锁缓慢问题,看这里!

1 业务背景在苍穹系统中,zookeeper的使用场景包括:微服务配置服务、微服务注册中心、分布式ID、分布式锁、后台任务调度、分布式计算集群...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息