Couchbase权威指南(十一)

客户端接口

有许多couchbase的客户端可用,它们归为2类,一类是smart clients,另一类是memcached兼容客户端。smart clients完全与集群进行通信,根据内置的集群配置和基于vBuckets的分布式信息,数据自动写往集群里的正确节点。smart clients与集群保持通信,确保在故障转移或者rebalancing时,客户端更新自己的配置,将数据写入到正确的节点。

如果使用非智能的memcached兼容的客户端,就必须使用一个位于客户端的Moxi组件。Moxi作为一个代理服务器存在,位于客户端连接和couchbase集群之间。除了让传统的memcached客户端可以写往couchbase集群,Moxi还提供了集群级的分布和接口。使用Moxi还让你在不改变任何已存在的memcached应用的前提下,获取couchbase的特有功能所带来的优势。

在couchbase服务器里,存储和获取信息的方式根据实际情况而不同。所有方法可以归类为CRUD这4类基本操作:Create(创建),Retrieve(获取),Update(更新),Delete(删除)。

创建

使用couchbase的客户端接口,根据文档ID将文档信息存储到数据库里。批量操作也可行,并且比多个单次操作更有效。

对于基本的存储、获取信息的操作,couchbase兼容memcached客户端协议。对于更高级的操作,你需要使用couchbase客户端库。

存储的值可以是任何二进制值,包括结构化和非结构化的串,序列化对象,或者原生的二进制数据例如图片或音频。

获取

为了获取数据,你必须先知道文档ID。也可以执行批量操作,同时获取多个文档,这比单次操作更有效。

更新

包括更新整个文档的操作,也包括追加数据到已存在记录的操作,或者递增和递减整数值。

删除

有个单一的删除操作,用来从数据库里删除整个文档。

各语言的库

couchbase官方支持下列语言和环境的smart clients库:

  • Java (http://www.couchbase.com/develop/java/current)
  • .NET (http://www.couchbase.com/develop/net/current)
  • PHP (http://www.couchbase.com/develop/php/current)
  • Ruby (http://www.couchbase.com/develop/ruby/current)
  • C [libcouchbase] (http://www.couchbase.com/develop/c/next)

在笔者写此书时,也有一个实验性的Python库可用(http://www.couchbase.com/develop/python/current)。Mark Nunberg还写了个Perl客户端Couchbase::Client,它基于C的libcouchbase库。你可以在CPAN上获取到这个库。

发表在 Common | 标签为 | Couchbase权威指南(十一)已关闭评论

Couchbase权威指南(十)

Failover

数据的副本在整个集群里分布。对于couchbase类型的bucket你可以配置副本的数量,就是说在一个couchbase集群里对每份数据保存多少数量的副本。

在服务器发生故障时(不管是临时故障还是管理维护),可以使用称为failover的技术把故障节点标记为不可用,从而激活该服务器对应的副本vBuckets。

failover进程联系每个保存了副本的服务器,更新内部映射表,将客户端的请求映射到新的可用节点上。

可以手工执行failover,也可以使用内置的自动failover机制,在集群里的节点不可用超过一定时间后,failover自动打开。

TAP

TAP是couchbase集群的内部协议,在多个方面用来进行内部数据交换。TAP提供了系统内执行了变更的数据的数据流。

TAP被用于数据复制,在不同的vBuckets之间拷贝数据副本。它也用于rebalance过程,在vBuckets之间转移数据从而使数据在整个系统里重新分布。

发表在 Common | 标签为 | Couchbase权威指南(十)已关闭评论

Couchbase权威指南(九)

副本和复制

除了集群里的分布式数据外,couchbase还可以在集群里创建数据副本。这些副本也与vBucket结构协调工作,各个vBucket的数据副本在整个集群里分布。分布式副本跟核心数据的处理方式一样,而副本的存在可以防止集群里的单点故障。

集群里的副本复制是完全点对点的,数据在节点间直接交换,没有拓扑、层次或主从关系。客户端将数据写往一个节点时,数据被存在vBucket里,同时使用TAB系统分发到一个或多个副本vBucket.

在集群里的一个节点发生故障时,副本vBucket被激活,用来代替故障节点的vBuckets进行工作。这个过程秒完成,因为副本是在原始数据创建的同时就创建了,不会临时执行拷贝;副本vBucket已经持有数据在那里,坐等被激活。副本vBucket激活后,会更新系统的映射表,以便客户端直接与新的vBucket结构通信。

副本的配置是基于每个bucket的。根据数据安全层次的不同,你可以对不同的bucket配置不同数量的副本。请注意,只有在集群里的机器数量足够时,副本才可能被激活。例如,你配置了一个bucket保持3个副本,只有在集群里有4个节点时,副本才会激活。

一个bucket的副本数量,在bucket创建后不允许再修改。

发表在 Common | 标签为 | Couchbase权威指南(九)已关闭评论

Couchbase权威指南(八)

热启动

当couchbase重启,或者执行备份恢复的启动时,它进入热启动的状态。热启动从磁盘加载数据到内存,从而让数据对客户端可用。

在服务请求之前,热启动必须完成。根据数据库容量和配置的不同,以及存储数据数量的不同,热启动可能要花费一定的时间来完成。

Rebalancing

数据在couchbase里的存储方式是通过vBucket结构提供的分布式机制来实现的。假如你想扩展或收缩couchbase集群,这时存储在vBuckets里的信息需要在集群节点间重新分布,并且对应的vBucket映射表也需要更新来适应新的结构。这个过程叫做rebalancing.

在集群的存储结构改变时,rebalancing必须手工执行。rebalance进程重新对存储信息的vBuckets进行分配,在集群节点间物理的转移数据,以匹配新的结构。

Rebalancing过程可以在集群运行并正常服务请求时执行。数据在后台进行转移,客户端的读和写仍然针对当前存在的结构,直到转移完成,系统会更新vBucket映射表,并将结果通知smart clients和Moxi proxy(它们是couchbase的客户端)。

其结果是整个集群的分布式数据重新分配,数据在整个数据库里均衡分布,并兼顾了支持系统运转的数据和数据副本的数量。

发表在 Common | 标签为 | Couchbase权威指南(八)已关闭评论

Couchbase权威指南(七)

磁盘存储

为了提高性能,Couchbase倾向于在内存里存储数据和提供服务。然而,很难保证有足够的资源可以做到这点。比较常见的做法是把经常使用的工作数据存放在内存,并且快速响应给客户端。

除了尽可能多的存放数据在内存外,couchbase也保存数据到磁盘。磁盘持久性允许更容易的备份/恢复操作,也允许数据量增大到超过内置cache层的容量。

Couchbase自动在内存和磁盘间转移数据(在后台异步执行),保持经常使用的数据在内存,不经常使用的数据在磁盘。couchbase经常监控客户端访问的信息,让活跃的数据保留在cache层内。

将数据从cache里删除,腾出空间给更活跃信息使用的过程叫做ejection(前面的章节已描述)。通过couchbase集群里每个bucket的预先设定的阈值来决定何时执行ejection.

使用磁盘存储引发的问题是,客户端在请求文档ID时,必须知道信息是否存在。couchbase使用元数据结构来解决这个问题。元数据里存储了数据库里每个文档的信息,并且元数据位于内存里。这意味着假如文档ID无效,服务器可以立刻返回”document ID not found”消息。当然,如果文档有效,那么要么从内存里立刻返回,要么先从磁盘读取到内存再返回(从磁盘读会产生延时,或者导致超时)。

转移数据到磁盘的过程是异步的。在couchbase提供服务的同时,数据在后台异步转移到磁盘。如果并发写往数据库的量很大,客户端可能收到服务器内存临时不够的通知,直到更多数据转移到磁盘,内存有剩余为止。

类似的,假如couchbase需要从磁盘加载数据回内存,这个过程也是在后台发生的,后台进程从队列里读取请求,然后从磁盘读取数据装载回内存。客户端一直等待,直到数据加载到内存,然后返回给客户端。

这种异步机制以及使用队列的方式,使得读写处理非常快,从而消除了典型的负载和性能尖峰,这通常是造成RDBMS性能不稳定的原因。

发表在 Common | 标签为 | Couchbase权威指南(七)已关闭评论

Couchbase权威指南(六)

Expiration

每个存在Couchbase里的文档有一个可选的过期时间(expiration)。默认是没有过期时间(例如,数据永久存储)。过期时间可用来设置数据的生命周期,系统自动从数据库里删除过期的数据。

在数据存储时,由用户指定文档的过期时间。在数据更新时,过期时间可以同步被更新,还可以通过couchbase协议手工更新。过期时间可以是相对时间(例如60秒),也可以是绝对时间(例如2012年12月31日中午12点)。

使用过期时间的典型场景是Web session。假如用户停止了活动,你希望session里的数据自动删除。通过设置expiration,session数据会过期并且自动删除,从而释放内存和磁盘给其他数据使用。

Eviction

Eviction是针对memcached buckets从内存里完全删除数据的过程。memcached使用一种LRU(最少近期使用)算法来从系统里完全删除不再使用的数据。

在memcached bucket里,LRU数据会完全删除以释放空间,因为memcached buckets没有持久化存储。

发表在 Common | 标签为 | Couchbase权威指南(六)已关闭评论

Couchbase权威指南(五)

内存数据

Couchbase架构包含了一个内置的cache层。这种机制允许非常快速的响应时间,因为数据是直接写往内存的,并且读的时候,也是从内存返回数据给客户端。

这种设计的效果,提供了一个内置的cache层作为系统操作的中央部分延伸。客户端接口与内存数据打交道,它将信息写往Couchbase的内存;返回的数据也是从内存里获取,或者先从磁盘加载到内存,再返回给客户端。

这种处理方式保证了最佳性能。为了提高性能,你应该给每个节点分配最大数量的可用内存。内存跨集群汇总起来以供使用。

这点与其他数据库系统的设计不同,其他数据库的处理方式是,信息写往数据库,然后要么有一个独立的cache层,要么依赖于操作系统的cache机制,把经常使用的信息放在内存以供访问。

Ejection

Ejection是和Couchbase buckets一起使用的机制,它的作用是从内存里删除数据,给活跃的、更频繁使用的数据让出空间,它是cache系统的核心部分。Ejection自动执行,它联合磁盘持久存储系统,保证内存里的数据已经持久写往磁盘,从而安全的删除。

该系统确保内存存储的数据在删除前,已经写往磁盘,在下次客户端需要时,它又可以从磁盘加载到内存。Ejection的核心作用是让系统能够保持经常使用的数据驻留在内存,并且在客户端需要从磁盘加载数据时,它能重新在内存里分配空间。

对于Couchbase buckets,数据永不删除,除非客户端明确的删除文档,或者文档已到达过期时间。而ejection机制在从内存里删除数据时,会保存数据的副本到磁盘上。

发表在 Common | 标签为 | Couchbase权威指南(五)已关闭评论

Couchbase权威指南(四)

vBuckets

一个vBucket定义为couchbase集群里key空间的一个子集的拥有者。通过使用vBuckets,信息在集群里分发更有效。vBucket系统被用于分布式数据,以及支持多节点间的数据复制。

客户端在访问bucket里的数据时,是与存储了该数据的vBucket所在的集群节点进行通信。这种直接访问方式允许客户端与数据节点直接通信,而无需使用代理或重定向架构。其结果是从逻辑分区数据里抽象了物理拓扑,保证了couchbase的弹性服务。

这种架构也不同于memcached所用的方法,memcached使用客户端key哈希,从预定义的列表里选取服务器。这要求维护一份服务器的活跃列表,并指定哈希算法例如Ketama,以在拓扑里维护数据一致性。vBucket架构也比传统的RDBMS系统使用的数据分区更灵活。

vBuckets并非面向用户的组件,但它们是couchbase服务器里非常重要的组件,是至关重要的可用性和弹性服务的支承。

每个文档ID属于一个vBucket。有一个映射函数用来计算给定的文档属于哪个vBucket。在couchbase服务器里,该映射函数是个哈希函数,它取文档ID作为输入,输出vBucket标识符。一旦定位了vBucket标识符,会继续从一个表里查找该vBucket位于哪个服务器上。这个表包含每行一个vBucket,vBucket与它的宿主主机成对出现。位于该表里的服务器通常服务了多个vBuckets。

发表在 Common | 标签为 | Couchbase权威指南(四)已关闭评论

Couchbase权威指南(三)

Couchbase bucket的特有功能

  • 持久性:数据单元异步从内存写往磁盘,防范服务重启或较小的故障发生时数据丢失。持久性属性是在bucket级设置的。
  • 复制:对couchbase类型的bucket,可以配置数据复制的份数。集群里的每个节点既保存活跃的数据,又保存数据副本。假如某个节点挂了,数据副本可以提升为活跃的容器,从而继续提供高可用服务。
  • 重新组织:集群里的数据可以重新组织和分布,从而动态增加或删除bucket和服务器。
  • bucket容积改变:couchbase类型的bucket可以动态调整容积,在应用需要时它们的大小可以被改变。

buckets可以用来隔离单个应用程序提供多租户,或隔离数据类型,以提高性能和可视性。couchbase服务器允许你配置不同的端口来访问不同的buckets,每个bucket都可以设置密码验证。

Smart client客户端通过使用couchbase的管理REST API,自动发现集群结构的改变。这点保证了客户端应用可以无间断的从正确节点上访问所需数据。

couchbase服务器允许你在生产环境里混合使用不同类型的buckets。内存和磁盘配额是基于bucket配置的,所以资源使用可以跨集群管理。配额可以在运行时修改,使得管理员能随时重新分配资源。

发表在 Common | 标签为 | Couchbase权威指南(三)已关闭评论

Couchbase权威指南(二)

Buckets

Couchbase使用命名buckets提供数据管理服务,buckets是独立的虚拟数据容器。一个bucket就是Couchbase服务器集群里的一逻辑组物理资源,它可以被集群里的多个客户端应用使用。buckets提供安全的机制来组织、管理、分析数据存储资源。

Couchbase提供两种核心类型的buckets,如下描述。Couchbase根据bucket类型来提供运行时的统计报告。

  • Couchbase类型:提供高可用和动态重配置的分布式数据存储,提供持久化存储和复制服务。这种bucket也100%兼容Memcached协议。
  • Memcached类型:提供直接寻址的、分布式的、内存型的文本缓存。这种bucket被设计来作为关系型数据库的补充 — 缓存经常查询的数据,从而减少对数据库的查询量,提高性能。

不同的bucket类型提供不同的核心功能。Couchbase类型的bucket提供一种高可用、动态重配置、分布式的数据存储,在集群的节点发生故障时,它允许集群自我修复,并继续提供服务。

发表在 Common | 标签为 | Couchbase权威指南(二)已关闭评论