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

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/s
如何定位及解决分布式锁缓慢问题,看这里!
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



