浅谈分布式锁与Redis集群实现分布式锁
分布式系统
什么是分布式系统?
一个分布式系统是一组计算机系统一起工作,在终端用户看来,就像一台计算机在工作一样。
这些机器具有共享状态,并发操作并可独立故障,而不会影响整个系统的正常运行时间。
如设计一个分布式数据库:假设我们使用了三台机器来构建这台分布式数据库,我们追求的结果是,在机器1上插入一条记录,需要在机器3上可以返回那条记录,当然,机器1和2也要能够返回这条记录。
分布式系统的优点
分布式系统最大的好处就是能够让你横向的扩展系统。
-
以单一数据库为例,能够处理更多流量的唯一方式就是升级数据库运行的硬件,这就是纵向扩展。
而纵向扩展的是有局限性的。当到了一定程度以后,我们会发现即使最好的硬件,也不能够满足当前流量的需求。
-
横向扩展是指通过增加更多的机器来提升整个系统的性能,而不是靠升级单台计算机的硬件。
横向扩展则没有这个限制,它没有上限,每当性能下降的时候,你就需要增加一台机器,这样理论上讲可以达到无限大的工作负载支持。
分布式系统在容错和低延迟上也有很多优势。
容错性是指你的分布式系统的某个节点出现错误以后,并不会导致整个系统的瘫痪。而单机系统出错以后,可能会导致整个系统的崩溃。
低延迟是通过在不同的物理位置部署不同的机器,通过就近获取的原则降低访问的延迟时间。
上面讨论了分布式系统的种种好处,但是我们必须要清楚设计和运行分布式系统并非易事。
分布式带来的问题
CAP原则: 任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。
一致性Consistency : 依次读写的是什么就是什么。
可用性Availability : 整个系统不会崩溃, 每个非故障节点总会有一个相应。
分区容忍Partition tolerant : 尽管有分区,系统仍能继续运行并保持其一致性和可用性。
如何选取 ?
对于任何分布式系统来说,分区容忍是一个给定的条件,如果没有这一点,就不可能做到一致性和可用性。试想如果两个节点链接断掉了,他们如何能够做到既可用又一致?
最后你只能选择在网络分区情况下,你的系统要么强一致,要么高可用。