zookeeper分布式锁思路(无代码)

什么是分布式锁

想必大家肯定很熟悉多线程之间的锁,他们属于同一个jvm,才能实现资源的共享,保证数据一致性,但是,如果在分布式的机器中,我们如何保证数据的一致性呢,这里就需要用到分布式锁的问题。

分布式读写数据库的分布式锁

假设有以下场景。

  1. 一个WEB应用,部署到多台服务器中,其中通过nginx等一些手段进行负载均衡,每个用户的请求数据,都会负载均衡的由多台服务器处理。
  2. 如果多台服务器同时对数据库进行修改的时候,如何保证数据的一致性呢?

上面的例子我们可以看到,肯定数据库也做了集群模式。例如主从复制,当某个服务器的数据库实例进行修改之后,会update到其余的多台服务器中,保证数据的一致性。但是我们可能会出现这样一种情况。服务器A收到一条数据库请求,需要对user表的某条数据的年龄字段进行+1操作,服务器B也收到一条数据库请求,也需要对这条数据进行年龄+1的操作在,这个时候,假如之前的年龄是10,服务器A加1,变成了11,服务器B在A对数据库写之前在本地也得到了年龄为10,然后服务器B操作后,数据还是11,导致了数据的不一致问题。因为我们想要的却是年龄应该变成12。这时候我们应该有这样的想法,服务器A在操作这个年龄更新的时候,需要加一把锁,让其他机器不能操作,当A操作完后,数据库内部进行数据同步之后,其他的服务器才能进行这个年龄更新的操作。这个当然可以使用zookeeper来实现分布式锁的功能。
简单思考一下解决方案

  1. 对某个ID的数据进行操作的时候,在zookeeper上,建立一个znode,名称为这个ID 。
  2. 服务器需要操作某条数据的时候,先去zookeeper get一下这个ID,看看能不能get到,如果get不到才能进行数据的操作,负责就等待,直到这个能get到为止
  3. 上面说的比较浅显,但是大概的思路就是这样,利用一个第三方的工具,来判断某个数据是否正在被操作,从而实现分布式的功能。

zookeeper分布式的一个流程图