欢迎投稿

今日深度:

AerospikeC客户端手册———事务级一致性保证

AerospikeC客户端手册———事务级一致性保证




事务级一致性保证

作为分布式数据库,Aerospike支持自动的数据复制。最常见的,数据库被配置成每条记录维护两个完全相同的拷贝。即所说的“复制因子为2。 服务器也支持其它复制因子,以namespace为基础进行配置。
(关于数据复制的更多细节,请参见Aerospike架构主题【数据分布】)
自动数据复制提供了高性能和容错的系统优势,但增加了事务延迟的(潜在的)耗用。读取事务的延迟耗用一般发生在集群重配置阶段,这时副本可能还未被同步到最新拷贝。写事务延迟受复制因子影响,因为提交修改到主副本服务器以外节点上的备副本增加了集群内部通讯。
每次事务都操作所有副本能够保证完全的数据一致性。但是,经常可取的是,选择运行在降低的一致性保证水平下,意味着事务处理不一定访问一个记录所有的副本。
Aerospike服务器/客户端结合的默认行为是提供一致性保证的最常见选择:

读事务默认只查阅单一副本,即使在集群重配置期间。

写事务(包括删除与UDF应用)默认同步提交所有副本后再返回事务成功。

单一副本读和同步所有副本写,这个选项组合工作得很好,提供给Aerospike低延迟的即时一致性。

然而,应用开发人员在自己的应用中,有时想要改变一下系统默认的副本相关行为。

注意:即使使用低于最高水平的一致性保证,数据读写仍然很有可能被视为是一致的。为了速度,使用较低的一致性保证水平,只是打开了一个短暂时间窗口,在这个窗口内,一个事务涉及到的数据从整个集群范围看,可能暂时是不完全一致的。这种取舍权衡是否可接受,完全取决于应用设计者。

在读取场景下,使用较低的一致性保证,后面的读可能返回记录以前的值。(这是可能发生的,例如,由于集群正在进行重配置并且主副本还不是最新拷贝。)

在写入场景下,使用较低的一致性保证,在主副本已经提交、备副本还未提交期间,可能会读到记录以前的值(“脏读”)。

为了应用的最大灵活性,Aerospike提供可选择的事务级一致性保证。使用副本相关的策略,允许应用在所需的性能与一致性保证间取舍。

副本与一致性保证相关策略

Aerospike C客户端提供三种副本与一致性保证相关的策略选择:1)读副本选择 (read replica);2) 读一致性水平(read consistency level);3)写提交水平(write commit level)。

应用开发人员可指定期望的副本选择和一致性保证水平策略,通过在客户端配置中设定连接级全局策略,或在单独的C客户端API函数调用时指定事务级策略。应用未更改的策略将使用默认值。在内部,C客户端使用这些策略设置,来发送恰当的线路协议命令给服务器。

读副本选择策略

读副本选择策略,由read.replica设定,应用于读操作,指定客户端读取数据时访问哪一个副本。

默认读取主副本(master)。

另一个选择是读取副本之一(any)。(实际上是随机选择一个来读)

读一致性水平策略

读一致性水平策略,由read.consistency_level设定,应用于读相关操作。指定服务器内部查阅多少个副本来确定最近的记录值,并将它返回客户端。

默认值是读一个(one)。

另一个选择是读所有(all)。

写提交水平策略

写提交保证,由write.commit_level设定,应用于任何写相关操作。指定服务器在返回客户端成功之前必须成功提交修改到多少个副本。

默认值是在返回前提交到所有(all),副本。

另一个选择是在只提交主副本(master)就返回,异步复制到各备副本。

服务器一致性保证水平覆盖原则

客户端选择的事务级一致性保证,覆盖服务器端namespace级可动态配置的相关参数。(注意:读副本选择策略仅限于客户端,因此没有服务器端覆盖的说法)

请参见【配置参考手册】中服务器主题中有关一致性覆盖参数部分,以了解详细内容。

事务级一致性保证策略使用代码示例

为使用任何副本选择或一致性保证相关策略,首先需创建并初始化一个客户端连接:

as_config config;
as_config_init(&config);

// [(A): Non-default policies may be set on 'config.policies' here.]

aerospike client;
aerospike_init(&client, &config);

as_policies *p_policies = &client.config.policies;

// [(B): Non-default policies may be set via 'p_policies' here.]

配置对象config里的policies将被初始化成默认策略值,并用来初始化客户端对象client。

可在【A】点通过config.policies来设置非默认策略,在初始化客户端对象之前。

在客户端对象初始化之后(例如:【B】点),仍然可改变客户端连接的策略设置,通过取出polices的指针(p_policies)并使用指针获取和设置个别策略。

设置客户端连接级策略

下面三小节展示应用如何选择客户端连接级的非默认策略行为。

选择读取任意副本

默认情况下,所有客户端读取将被引导到主副本(策略值:AS_POLICY_REPLICA_MASTER)。然而在某些场景,可能需要把读分散到所有可用副本上。(例如:降低读取热键的性能影响,可以被降低约复制因子倍)。在此场景中,应用可选择读取任意一个副本(“随机”),通过设置read.replica策略为AS_POLICY_REPLICA_ANY:

p_policies->read.replica = AS_POLICY_REPLICA_ANY;

选择较高读一致性保证

默认的客户端记录读取行为(包括读取和操作API函数)是只读取一个副本(策略值:AS_POLICY_CONSISTENCY_LEVEL_ONE,由read.replica指定)。然而在集群重配置期间,只读取一个副本会返回非最新版本的值。在要求最高读取一致性水平的场景中,设置策略read.consistency_level为AS_POLICY_CONSISTENCY_LEVEL_ALL:

p_policies->read.consistency_level = AS_POLICY_CONSISTENCY_LEVEL_ALL;

注意:读取所有副本的潜在性能影响只有在集群重配置期间才会显著。

选择较低写一致性保证

默认的客户端记录修改行为(如:写、移除、操作和应用UDF的API函数)是在成功提交修改到所有副本后才返回AEROSPIKE_OK。此默认策略(AS_POLICY_COMMIT_LEVEL_ALL)保证最高水平写一致性。

若需要较低的写延迟,而且应用能容忍较低的写一致性保证(有“脏读”的可能,如:从一个未被提交的非主副本中读取记录的值,可能会读回一个旧值),设置write.comit_level策略为AS_POLICY_COMMIT_LEVEL_MASTER:

p_policies->write.commit_level = AS_POLICY_COMMIT_LEVEL_MASTER;

使用事务级一致性保证

上面的示例代码定义了客户连接级别使用的全局策略。为设置事务级策略,可把所需策略的设置当参数传递给单个API调用。例如:用主副本提交(master)保证水平来执行写入记录,按如下步骤做:

as_policy_write my_write_policy;
as_policy_write_init(&my_write_policy);

my_write_policy.commit_level = AS_POLICY_COMMIT_LEVEL_MASTER;

// [...Define other variables, etc...]

as_status status = aerospike_key_put(&as, &err, &my_write_policy, &key, &rec);

在单个API调用上指定的策略,若是非空(NULL),则会覆盖客户端连接级别上的相应策略设置。(注意:若设置了相应的服务器设置,则会覆盖客户端策略设置)。

www.htsjk.Com true http://www.htsjk.com/DB2/20345.html NewsArticle AerospikeC客户端手册———事务级一致性保证 事务级一致性保证 作为分布式数据库,Aerospike支持自动的数据复制。最常见的,数据库被配置成每条记录维护两个完全相同的拷贝。即所说...
评论暂时关闭