可调节的一致性
1一致性指一行数据的所有replica是否最新和同步。Cassandra扩展了最终一致性的概念,对一个读或者写操作,所谓可调节的一致性的概念,指发起请求的客户端,可以通过consistency level参数,指定本次请求,需要的一致性。
写操作的Consistency Level
写操作的consistency level指定了写操作在通知客户端请求成功之前,必须确保已经成功完成写操作的replica的数量。
注意:
即使指定了consistency level ON或LOCAL_QUORUM,写操作还是会被发送给所有的replica节点,包括其他数据中心的里replica节点。consistency level只是决定了,通知客户端请求成功之前,需要确保写操作成功的replica节点的数量。
读操作的Consistency Level
关于QUORUM级别
QUORUM级别确保数据写到指定quorum数量的节点。一个quorum的值由下面的公式四舍五入计算而得:
(sum_of_replication_factors / 2) + 1
sum_of_replication_factors指每个数据中心的所有replication_factor设置的总和。
例如,如果某个单数据中心的replication factor是3,quorum值为2-表示集群可以最多容忍1个节点down。如果replication factor是6,quorum值为4-表示集群可以最多容忍2个节点down。如果是双数据中心,每个数据中心的replication factor是3,quorum值为4-表示集群可以最多容忍2个节点down。如果是5数据中心,每个数据中心的replication factor of 3,quorum值为8 。
如果想确保读写一致性可以使用下面的公式:
(nodes_written + nodes_read) > replication_factor
例如,如果应用程序使用QUORUM级别来读和写,replication factor 值为3,那么,该设置能够确保2个节点一定会被写入和读取。读节点数加上写写点数(4)个节点比replication factor (3)大,这样就能确保一致性。
连接哪个节点?
一个客户端请求会连接集群上的哪个节点由客户端driver的配置决定。
例如,如果使用Datastax drivers,主要由下面这两个客户端配置决定连接到哪个节点:
Contact points
Load balancing policies
Contact Points
Contact points设置的值是一个或者多个节点IP的列表。当driver在客户端创建Cluster实例时,driver首先会按照指定的顺序尝试连接contact points中的节点地址。如果第一个节点连接失败,则尝试连接第二个。只要任何一个节点连接成功,则停止尝试连接后面的节点地址。
为什么此时不需要连接所有的节点,是因为集群中的任何一个节点都保存了集群上所有节点的元数据,也就是说,只要连上一个节点,driver就能得到所有其他节点的配置信息。接下来,driver会使用获得到所有节点的配置信息构造连接池(构造连接池的时候,driver会连接所有的节点,但是,不是根据contact points中指定的节点地址,而是根据从服务端获得的所有节点的元数据)。这也意味着,contact points设置中,不必要指定集群中所有节点的地址。最佳实践是,在contact points中设置相对于客户端响应最快的所有节点的地址。
Load Balancing Policies
默认情况下,一个客户端的Cluster实例管理了集群中所有节点的连接,并且,将客户端请求随机连接到任意节点。不过,在某些情况下,尤其是多数据中心时,默认行为的性能可能不是最优的。
例如,如果集群包含两个数据中心,一个在中国,一个在美国。如果客户端在中国,那么,应该避免直接连接美国的节点,不然太慢。
Cluster实例的Load balancing policies设置,决定了,客户端请求如何分配节点的连接。
Datastax driver中最常用的内置Load balancing policies是DCAwareLoadBalancePolicy。它可以指定客户端请求只连接到指定的数据中心的节点。
当然,你也可以实现自定义的load balanacing policies,实现自定义的客户端连接分配。
Coodinator
1当客户端读写请求连接到某个节点时,这个被连接的节点被称作本次请求的coordinator。一个coordinator的职责是客户端请求和真正拥有数据的节点之间的代理(Proxy)。coordinator根据服务端的分区器配置和replication策略设置来决定应该和集群中的哪些节点通信。
写请求
1如果所有的节点在同一个数据中心,coordinator会将写请求发到所有的replica。如果所有的replica节点可用,无论客户端指定的consistency level是什么,每一个replica都会处理写请求。写操作的consistency level只决定了coordinator在通知客户端写操作成功之前,多少个replica节点必须返回成功。
例如,一个单数据中心集群有10个节点,replication factor值为3,一个写请求,会被发给所有的三个replica节点。如果,客户端指定的consistency level是ONE,那么,只要任何一个replica节点通知coordinator写成功,coordinator就会返回客户端写成功。一个节点返回写成功,表示,写数据已经保存到这个节点的内存中的memtable和磁盘上的commit log。
2如果是多数据中心部署,Cassandra为了优化写性能,对于远程数据中心,会在每个远程数据中心的节点中,选择一个作为远程数据中心中的coordinator。因此,和远程数据中心里的replica nodes的通信,本地数据中心的coordinator,只需要和每个远程数据中心的这一个coordinator节点通信。
如果使用consistency level ONE或者LOCAL_QUORUM,coordinator只需要和本地数据中心的节点通信。因此,可以避免,跨数据中心的的通信影响写操作性能。
读请求
客户端请求需要读的replica数量,由客户端指定的consistency level决定。coordinator会将读请求发给响应最快的replica。如果多个节点返回了数据,coordinator会在内存中比较每一列的timestamp,返回合并后的最新的数据。
为了确保所有的replica对于经常访问的数据的一致性,在每一次读操作返回之后,coordinator会在后台同步所有其他replica上的该行数据,确保每个replica上拥有该行数据的最新版本。
举例
单数据中心,consistency level QUORUM
如果是单数据中心,replication factor值为3,读操作consistency level为QUORUM,那么,coordinator必须等待3个replica中的2个返回数据。 如果返回的数据版本不一致,合并后的最新的数据被返回。在后台,第三个replica的数据也会被检查,确保该行数据的最新版本在所有replica的一致性。
单数据中心,consistency level ONE
如果是单数据中心,replication factor值为3,读操作consistency level为ONE,coordinator访问并返回最近的replica返回的数据。在后台,其他两台replica的数据也会被检查,确保该行数据的最新版本在所有replica的一致性。
双数据中心,consistency level QUORUM
如果是双数据中心,replication factor值为3,读操作consistency level为QUORUM,coordinator必须等待4个replica返回数据。4个replica可以来自任意数据中心。在后台,其他所有数据中心的replica的数据也会被检查,确保该行数据的最新版本在所有replica的一致性。
双数据中心,consistency level LOCAL_QUORUM
如果是双数据中心,replication factor值为3,读操作consistency level为LOCAL_QUORUM, coordinator必须等待本地数据中心的2个replica返回数据。在后台,其他所有数据中心的replica的数据也会被检查,确保该行数据的最新版本在所有replica的一致性。
双数据中心,consistency level ONE
如果是双数据中心,replication factor值为3,读操作consistency level为ONE, coordinator访问并返回最近的replica返回的数据,无论该replica是本地数据中心的还是远程数据中心的。在后台,其他所有数据中心的replica的数据也会被检查,确保该行数据的最新版本在所有replica的一致性。
双数据中心,consistency level LOCAL_ONE
如果是双数据中心,replication factor值为3,读操作consistency level为LOCAL_ONE,coordinator访问并返回本地数据中心最近的replica返回的数据。在后台,其他所有数据中心的replica的数据也会被检查,确保该行数据的最新版本在所有replica的一致性。
使用speculative_retry做快速读保护(Rapid read protection)
快速读保护允许,即使coordinator最开始选择的replica节点down了或者超时了,依然能返回数据。如果一个表配置了speculative_retry参数,假如coordinator最先选择的replica读取超时,coordinator会尝试读取其他可用的replica代替。
微信扫一扫
关注该微信号
标签: 客户端创造失败
评论列表
据。4个replica可以来自任意数据中心。在后台,其他所有数据中心的replica的数据也会被检查,确保该行数据的最新版本在所有replica的一致性。 双数据中心,consistency level LOCAL
意味着,contact points设置中,不必要指定集群中所有节点的地址。最佳实践是,在contact points中设置相对于客户端响应最快的所有节点的地址。 Load Balancing Policies 默认情况下,一个客户端的Clu
cation策略设置来决定应该和集群中的哪些节点通信。 写请求 1如果所有的节点在同一个数据中心,coordinator会将写请求发到所有的replica。如果所有的replica节点可用,无论客户端指定的cons
内存中的memtable和磁盘上的commit log。 2如果是多数据中心部署,Cassandra为了优化写性能,对于远程数据中心,会在每个远程数据中心的节点中,选择一个作为远程数据中心中的coordinator。因此
f 3,quorum值为8 。 如果想确保读写一致性可以使用下面的公式: (nodes_written + nodes_read) > replication_factor 例如,如果应用程序使用QUORUM级别来读和写,replication fa