关于NewSQL数据库对于CAP的再解释

关于NewSQL数据库对于CAP的再解释,第1张

作者 石默研

关于CAP的讨论已经很多,包括作者的另一篇文章“对CAP的初步解释”,基本已经即定思维的理解就是:分布式系统必须遵循CAP,一个分布式系统的设计只能同时满足其中两个,不可能同时满足;传统关系数据库选择A与C,代表了互联网新兴技术的NoSQL数据库则选择A与P(或者C与P,虽然这种情况其实需要详细讨论)。

但是,近年来,新兴的NewSQL数据库(TiDB或者OceanBase),则是一种在分布式环境下,保证的ACID强事务特征的强一致性数据库,并且很显然,它同时也满足了高可用性与优秀的分区可容忍性(很好的可扩展特性便是其一个层面的证明),似乎看起来,C、A、P都同时保证了,这不是违反了已经经过严格证明的CAP理论吗?

这个问题初看起来,似乎是比较神奇,但仔细分析,其实答案是很明显的。

首先,需要读者区分“分布式”与CAP中所提到的分区可容忍性Paritition Tolerance并不是一回事。分区可容忍性P是指以下两种分布式的情况:

同一份数据的多个副本的可分布性

有相互关联的数据的可分布性( *** 作中表现为保证ACID的强分布式事务)

即使是分库分表,如果不存在以上两种情况,只是独立数据在同一个节点上的情况,虽然也是分布式,但跟CAP中的P没有半毛钱关系。

那么,还是回到上面的问题,NewSQL数据库,确实也是在保证了同一份数据多副本的强读写一致性、以及强分布式事务特性这样的C的情况下,同时保证了A与P呀!事实确实如此,但这还是要仔细分析:

无论是TiDB,还是OceanBase,其在保证数据多副本的强一致性时,都采用了Paxos协议或者Raft,它们简单来讲就是多数选举的原则,即写不需要全部副本都完成,就能保证读的强一致性,反过来也是一样。因此,其在分布式情况下,保证数据读写强一致性的效率还是很高的,就是说,在同一个数据中心的网络环境下,虽然这种分布可容忍性的满足理论上讲也会比单节点多一点点效率损失,但实际上是可以忽略不计的。但需要指出的是,在跨数据中心、跨城市的分布式情况下,如果要保证数据多副本的强一致性,即保证分区可容忍性,对效率(实际上是可用性A)的影响那还是不可忽略的。因此,在这种情况下,CAP理论依然成立。

再来看相互关联数据的可分布性,这就涉及到了分布式事务。现有的NewSQL数据库,即使在同一数据中心,为了保证强的分布式事务,对效率的折衷都是不可忽略的,所谓的乐观事务,只是因为客观问题本身冲突就少,并不改变冲突很多时效率明显受影响的现实。因此,NewSQL数据库虽然提供强分布式事务的能力,但在现实应用中,都是提倡尽量避免大量的分布式事务出现。如果你所遇到的应用场景是确实需要大量的分布式事务执行,又不做应用优化全交给数据库执行,那么,现有的NewSQL分布式数据库,依然会遇到明显的性能问题,其实就是可用性A降低了。同学仔细去研究应用中的实际情况就会发现,很多互联网应用,当其所需要的QPS很高很高,而对读写一致性与强分布式事务的要求又不那很高时候,其实,NewSQL数据库还是不能满足他们的需求的,他们仍然需要根据自己的情况改造或者选用NoSQL数据库,这也是CAP理论并没有被NewSQL打破的现实证明。

因此,总结来讲,NewSQL数据库,也是遵循CAP理论的,只不过,在同中心数据多副本情况下,保证P的同时对A的影响微乎其微;而在分布式事务的情况下,又采用了与应用特性相关的策略(其实乐观、悲观事务本质上就有根本应用特性区分的意思)来保证性能而已。当然,随着网络与计算机性能的提高,CAP三个特征中,保证其中两个,折衷另外一个,所带来的影响也会逐渐变小,但其理论依然是正确的。

一、先定义一个添加节点的方法:

void

jiedian(TreeView

tv,

string

zd)

{

TreeNode

xz

=

tvSelectedNode;

if

(xz

==

null)

//判断是否选择了父节点

{

MessageBoxShow("先选择");

return;

}

TreeNode

nd

=

new

TreeNode(zd);

xzNodesAdd(nd);

}

二、子节点添加:

//首先连接并打开数据库;

sqlConnection

con;

sqlCommand

com;

string

s

=

"select

部门

from

公司";

com

=

new

sqlCommand(s,

con);

sqlDataReader

dr

=

comExecuteReader();

while

(drRead())

{

jiedian(treeView1,

drGetString(0));

}

以上就是关于关于NewSQL数据库对于CAP的再解释全部的内容,包括:关于NewSQL数据库对于CAP的再解释、怎么让treeview控件连接sql数据库,让treeview的子节点是数据表字段的名称、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10145974.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存