- 全局性 。分布式系统中必须存在一个单一的、全局的进程通信机制,使得任何一个进程都能与其他进程通信,并且不区分本地通信与远程通信 。同时,还应当有全局的保护机制 。系统中所有机器上有统一的系统调用集合,它们必须适应分布式的环境 。在所有CPU上运行同样的内核,使协调工作更加容易 。Cassandra是完全符合这个定义的,Coordinator节点并不是固定的 。每个节点都可以接受任何的CQL,并且来充当协调者的角色 。重要的是,对于一个应用程序或者客户端而且,可以不关心Cassandra后来是怎么样存储和查询数据的 。它从外面看到的,始终只有一张完整的逻辑数据表 。
可扩展这个词其实,并不是特别准确,它的重点其实是可水平扩展 。简而言之,就是在图中环上加Node,就可以提高Cassandra的处理能力 。这其实和它的分布式特点是密不可分的 。Cassandra的拆分粒度最细,理论上几乎可以到一个Partition KEY 。或者说,每一个Partition KEY,都可以被看作可以拆分的,独立处理的最小的单位 。增加数据的同时只要增加Node就可以了,这就使得它的水平扩展性是很好的 。
做一个偏激的假设,如果Cassandra只有一份数据存储,就凭Key独立的特点,把不同的Key分到不同的机器上提供服务,也可以算得上是分布式、去中心和可扩展的 。但是它这个特点是不完美,不彻底的 。因为机器分得越多,任何一台机器故障,它提供的服务就是不完整的 。
高可用、容错性、可配置一致性
接下来,我们继续看另外三个特点,高可用、容错性、可配置的一致性,这些特点围绕的核心就数据冗余 。
任何的高可用背后,一定是有数据冗余的 。传统数据库通常偏爱的是主备模式,就是当提供服务的数据库节点DOWN掉之后,备节点开始提供服务 。这时候往往故障检测、主备切换,应用切换的时间就会成为关注的焦点,做得好一点的数据库可以在1分钟或者几十秒内完成切换 。不过在如今7*24*365的环境下,1分钟的故障恢复时间通常并不能让用户十分满意,当切换时间压缩到一定程度,还会出现一个矛盾点,就是数据库异常时间监测阈值 。如果设得太长,主备切换就慢,设太短了,一个网络抖动,就可能触发不必要的主备切换误判 。
Cassandra的数据复制(replicas)并不像传统的备份数据,它更像是多份主数据,这些数据都是时时刻刻对外提供服务的,换句话说,有一个数据库节点DOWN掉,完全不需要主备切换时间 。在资源充足的情况下,甚至是几乎无感的(比如7个replicas坏了1个) 。
在Cassandra里面,数据复制(replicas)多少份,怎么存储,这个策略是可以根据不同的Keyspace来设置的,相当于提供一个灵活的选择,可以根据数据库表的实际使用场景和形态,来决定数据复制的策略 。
数据冗余可以说是分布式系统中的常规操作,像参数数据之类的,经常会采用数据冗余的方法来处理 。然而,有冗余的地方就有同步 。数据一致性问题,永远和数据冗余相伴而生 。好在Cassandra有Timestamps来解决一致性问题,容错性只是一致性的一个衍生产品,简单的说,只是Cassandra发现了一个老Timestamps的错误数据,后台修复一下而已 。
而可配置一致性,就是Cassandra的一个特别重要的特性了 。因为它的影响但不仅仅是对于高可用,它还直接影响数据库性能 。就传统数据库而言,开不开备库,对OLTP交易性能也是有直接影响的(包括redis也是) 。从理论上来说,Cassandra要等更多的Node写入数据,那响应时间就会越慢 。这个响应时间取决与最慢的那个Node 。若要交易响应更快,就需要通过异步的方式 。所以Cassandra通常都不会等所有的Node都响应,等多少Node,等哪些Node,就是可配置一致性 。
在数据写入读取方面Cassandra的一直性级别有:
ANY(仅写入),ONE,TWO,THREE ,QUORUM,ALL
LOCAL_ONE, LOCAL_QUORUM,EACH_QUORUM
以上这些级别很好理解,不需要逐个解释 。关于高可用和强一致性,永远都是鱼和熊掌 。假如我们的系统使用了最快的方式写入,比如写ANY,读ONE 。那么读到的数据并不是最实时的准确数据的可能性就会大幅增加 。如上面的图,有6个节点在写入数据,任意一个写成功,程序就成功返回 。那么假定其余5个节点还没有完成写入 。那这时候,有一个读ONE的程序,恰好读到了这5节点中的一个,并成功返回,这就产生了数据的不一致 。要做到数据的强一致,读写策略就必须配合设置,满足这样的条件 。
推荐阅读
- Win10 WSL配置centos的运行环境
- 使用Python「秒开」100GB+数据
- MySql主从复制,从原理到实践
- 五险一金:知道这6条才算懂
- 30 分钟包你学会 AWK
- 民间借贷中,借条中的“今借”和“今借到”有何区别?
- Dart 语言基础入门篇
- 淘宝店铺怎么样才算开店成功 淘宝店怎么样才能开好
- SQL优化的几种方式
- 数据库架构举例说明