Couchbase 是一个具有高性能、可扩展性和可 用性强的数据库引擎。它可以让开发人员通过 NoSQL 的键值存储(二进制或者JSON)或者使用 N1QL 的形式对数据进行操作(N1QL 是非常类似于 SQL 的一种语法操作 JSON 数据的方式)。以现在整体架构来看,Couchbase 是往分布式数据库的方向发展下去。
分布式数据库一般是从单机关系数据库扩展而来,用于存储结构化数据。分布式数据库采用二维表格组织数据,提供SQL关系查询语言,支持多表关联,嵌套子查询等复杂操作,并提供数据库事务以及并发控制。
Couchbase 的数据服务在单机、 集群安装,集群、多集群通信都是非常简单去做的。在一定的场景下,使用Couchbase是非常好的选择。
本文主要使用分布式储存的一些理论来分析 Couchbase 的数据服务的分布式数据储存模型。
存储引擎直接决定了存储系统能够提供的性能和功能。在 Couchbase 的数据储存分对象缓存和数据储存引擎。如下图所示应用对数据的操作首先是对内存操作,然后才会异步更新至数据储存引擎中。对于 Couchbase,数据层 以 memcached API 对数据进行交互,系统在 memcached 程序中嵌入持久化引擎代码对数据进行缓存、复制、持久化等操作,持久化操作就是同步数据至 CouchDB 中(新版代码中增加了forestDB引擎)。对于图中的复制是在第四节中详细介绍。
对象缓存提供先内存储存的架构,使得的读与写的操作降低了延迟。对象储存是属于在内存中以hash储存方式储存,支持增、删、改,以及随机读取操 作,其哈希分片大小,根据所储存的数据项的量会动态变动。如下图,对象缓存根据key值得相关运算计算出分片的哈希值,然后会根据根据所储存项的多少,在 一个哈希分片以链表串连数据,每个内存中储存的数据结构见图所示。
注:对于对象缓存大小的设置,在管理员操作平台中,可以为每个bucket设置对应的RAM内存的大小。
Couchstore(Couchbase的数据储存引擎)是按vbucket为单位的文件储存在文件系统中。Couchstore应用B+树算法 通过key值去快速指向它的内容。 为了高效的写, Couchstore应用了追加写的模型(见下文介绍)对每一个文件进行高效和安全的写操作。
注:在Couchbase中,bucket是用户所操作文档数据的集合,vbucket是系统平均划分bucket的数据进行分片数据的集合。
如下图所示:主节点指向中间节点. 这些中间节点指向叶节点。主节点和中间节点针对它们的子树可以划分指向文档范围的大小。叶节点储存了文档ID和元数据指向值所储存的文件位置。
追加写模式即所有的写操作只追加数据到文件尾部,而不修改老的数据,系统中的数据删除或者更新后,原来的数据成为垃圾数据,这可以加快磁盘的写速 度。如果 这些数据一直保存下去,文件会无限膨胀下去,为了解决这个问题,需要定期执行合并操作以实现垃圾回收。所谓合并操作,即将所有老数据文件中的数据扫描一遍 并生成新的数据文件,这里的合并其实就是对同一个key的多个操作以只保留最新一个的原则进行删除,每次合并后,新生成的数据文件就不再有冗余数据了。
分布式系统区别于传统单机系统在于能够将数据分布到多个节点,并在多个节点之间实现负载均衡。
在Couchbase数据分布是按计算分配到多个节点上,每个节点都储存两部分数据有效数据和副本数据,客户端对数据的操作主要是按照节点中对应的有效数据进行操作,执行压力会部分到不同的节点,类似如下图所示:
在 Couchbase 中,我们所操作的每一个bucket会逻辑划分为1024个vbucket,其数据的储存基于每个vbucket储存并且每个 vbucket都会映射到相对应的服务器节点,这种储存结构的方式叫做集群映射。如下图所示,当应用与Couchbase服务器交互时,会通过SDK的与 服务器数据进行交互,当应用操作某一个的bucket的key值时,在SDK中会通过哈希的方式计算,使用公式crc32(key)%1024确定key 值是属于1024个vbucket中的某个,然后根据vbucket所映射的节点服务器对数据进行操作。
为了保证分布式存储系统的高可靠和高可用,数据在系统中一般存储多个副本。当某个副本所在的存储节点出现故障时,分布式存储系统能够自动将服务切换到其它的副本,从而实现自动容错。
集群内复制主要针对同一个集群中多个节点的数据进行多份复制备份,并且复制的份数会分布到不同的节点中。在数据分布中我们知道每个节点都会储存有效 的 vbucket和复制的vbucket。如下图展示,当应用对对数据进行写操作,此操作会先到集群节点中所对应有效的vbucket的数据进行写操作,并 且有效的vbucket节点会根据DCP协议传输写操作的变更传输到复制的vbucket所对应的节点,对复制的vbucket进行变更。可复制的 vbucket的份数,可以在操作bucket的时候进行配置,备份数量为1-3份。
注:在程序流程中,第2,3,4种储存方式持久化数量节点和备份节点的数量是由客户端进行设置和进行检测的。第1种储存方式客户端是直接进行操作并且没有检测过程的。
跨数据中心复制主要是针对多个集群间的数据复制,此种复制主要以异步的方式通过XDCR协议同步数据到其它集群中备份,从而实现单集群或机房出现问 题级的容灾。跨数据中心复制是以bucket为单位进行复制的,在管理员操作界面可以通过配置XDCR来进行此种复制方式,下图为跨数据中心复制示例图:
分布式存储系统要求能够自动容错,也就是说,分区可容忍性总是需要满足的,因此,一致性和写操作的可用性不能同时满足。
部署拓扑结构 | 故障范围保护 | CAP 平衡 | 评论 |
单Couchbase服务器机群 | 节点故障(例如, 节点之前硬件故障,通信失败) | 可以配置成CP,并且可以通过配置auto failover操作得到有效性 | 当故障时,Couchbase服务器允许有效的读和配置 auto-failover一个很少的时间超时来恢复写的可用性。 |
多Couchbase服务器机群单向XDCR复制 | 节点或机群故障 (例如: 数据中心自然灾害) | AP是通过XDCR机群间单向复制来防止节点故障或者 | 单向复制可以用于同步数据在秒级计算能力数据中心中,
目的集群数据就可以通过最终一致性的数据用来读取和当原集群故障时,升级为读写集群(主从模式业务,读写分离)
|
多Couchbase服务器机群双向XDCR复制 | 节点或机群故障(例如: 数据中心自然灾害) | AP是通过XDCR机群间双向向复制来防止节点故障或者 | 双向服务可以用于有效/划分计算能力的跨数据中心,目的集群数据就可以读取和写最终一致性的数据在稳定状态,你会发现两个集群在操作同一个数据时发生了冲突,许多用户使用写在不同的划分段来让各自集群来处理避免冲突。(多主模式) |
基本可用(Basically Available)
基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。
电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
软状态( Soft State)
软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。
最终一致性( Eventual Consistency)
最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
以上大致介绍 Couchbase 服务器的数据的分布式储存架构及一些分布式理论的知识。
Couchbase在系统分布式方面提供了基础的支持,然而在分布 式储存的一致性、可用性和分区性是需要有所权衡,Couchbase 服务器提供了多种选择的方式让用户根据自己的业务场景选择不同的非功能性的需求点,来 实现对数据的储存。欢迎大家访问一下极光推送