什么是分布式锁?
随着互联网的发展,传统的单应用单DB早已不适应现在高速互联网的发展,分布式已经成为各大企业解决高用户高访问量的解决方案,包括分布式应用,分布式数据库,负载均衡等。
对于分布式的应用和分布式数据库如何做到分布式锁呢,那什么是分布式锁呢?分布式锁是控制分布式系统之间同步访问共享资源的一种方式,比如把应用分别部署到应用服务器A和应用服务器B,而应用服务器A连着数据库A,应用服务器B连着数据库B,然后通过Nginx负载均衡服务器分别把应用服务器A和应用服务器B连接,现在有用户A和用户B同时访问应用并修改同一个订单号为5的价格,如果修改前,此订单的价格为10,用户A和用户B都想在此价格上在加上10元,由于这两个用户恰好被nginx服务器分配到了应用服务器A和应用服务器B,由于两个应用服务器连着不同的数据库,所以它们无法持有同一把锁,那如何保证最后的金额是30,而不是20呢?如下图所示
ZooKeeper是什么?
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户,Zookeeper给我们提供了文件系统和通知机制,正因为这两个特点,就为我们解决分布式锁提供了方案,实现原理如下: 当用户A修改订单前,会根据订单号到Zookeeper找对应的值,如果找到了,说明有用户在操作相同订单号的数据,这时用户A需要等待,如果没有获取到则在Zookeeper中创建订单号为5的节点,然后在去操作数据库A,把订单5的价格改为20,然后把数据库数据同步到数据库B,此时如果用户B想操作订单为5的数据,它先去zookeeper判断是否有值,这是肯定有,所有用户B等待,等A操作结束后,本次会话结束,Zookeeper自动删除此节点,此时B在去操作数据库,这样就实现了分布式锁问题。 Zookeeper在分布式锁问题上就起到了协调数据库的作用。