简介
官网地址:https://www.couchbase.com/
Couchbase是一个较新的、发展迅速的nosql数据库技术。2014年,viber宣布使用Couchbase替换Mongodb,以适应10亿级的用户量,目前,Couchbase已大量运用于生产环境,国内使用的公司主要有新浪,腾讯等。
Couchbase是CouchDB和MemBase的合并。而memBase是基于Memcached的。因此Couchbase联合了Couchbase的简单可靠和memcached的高性能,以及membase的可扩展性。
灵活的数据模型:Couchbase中使用json格式存储对象和对象之间的关系。
Nosql数据库的一个特性是不需要定义数据结构,在Couchbase中,数据可以存储为key-value对或者json文档,不需要预先定义严格的格式,由于这种特性,couchbase支持以 scale out(水平扩展)方式扩展数据量,提升io性能,只需要在集群中添加更多的服务器就行了。相反,关系数据库管理系统scale up(纵向扩展),通过加更多的CPU,内存和硬盘以扩展容量。
Couchbase可用于单机环境,也可以和其他服务器一起提供分布式的数据存储。
特点
CouchBase是在memcached和redis之类缓存组件的基础上发展而来的,被称作为可能是好的缓存系统。所其必然能满足之前的前辈所满足不了的地方。
传统的缓存组件包括memcached和redis有着这种或者那种的缺点:
- Cluster支持完善度不够或者直接没有Cluster
- 没有良好的高可用性机制,持久化支持的亦不是很完善
- 扩容和故障恢复能操作维护复杂
- 其他
而CouchBase则对上面的一些缺点都有着良好的支持。或者说
CouchBase所提供的任何单一功能,在市面上基本上都能找到一款数据库能够满足。但是这些数据库实际使用的话总是会有各种各样的妥协,性能很好的话,扩展性可能很差之类的。而CouchBase的目标就是建立一个大一统,各种功能都包含可用,所谓接近完美的数据库。
技术特征
数据存储
Couchbase通过使用buckets提供数据管理服务,buckets相当于关系数据库中的库,Couchbase中没有表的概念,保存数据时,先建bucket,然后就直接插入数据了。buckets可以供集群中的多个客户端程序访问。Couchbase通过Buckets组织,管理和分析数据资源。
Couchbase中有两种类型的数据bucket,当启动Couchbase服务的时候,可以选择需要的类型。
1)memcached buckets。只将数据存储在内存中。提供了一个分布式的(横向扩展),纯内存的,key-value缓存。Memcached buckets 设计用于关系数据库的缓存,可以缓存经常访问的数据,由此减少web程序中数据库的查询次数。
2)couchbase buckets。存数据在内存和硬盘。提供高可用性和可动态重新配置的分布式数据存储,提供数据持久化和复制服务。couchbase buckets 兼容开源的分布式缓存memcached
内存分配
Server Quota:
Couchbase服务初始化时会给服务器分配内存限额,表示这个服务器中可用的大内存,是node级的。初始配置在集群中的台服务器(node)上,所有服务器的内存配额都是一样的。例如集群中有10台服务器,服务器内存配额是16G,整个集群中*共160G可用内存。如果需要加2个新的服务器,每个新的服务器需要16G的可用内存,集群中可用的内存数将是192G。
Bucket Quota:
Bucket 内存配额是分配给一个bucket的可用内存。配置在每个节点上,是从server quota中分配出去的。例如,如果你创建了一个新的bucket,限额是1GB,在10个节点的集群中,汇总后会有10G。如果添加两个节点,集群中汇总后会有12G的bucket 限额。
从图上可以看出,增加新的节点就可以扩展总的可用内存,从而增加存储的数据量。通过bucket限额系统可以判断数据是否应该调出内存。
vBucket
vBucket相当于一个key的子集,保存的是客户端存储对象的key值,vBuckets 用于在集群的节点间分配数据和备份数据。是 couchbase 实现 auto sharding,在线动态增减节点的重要基础。不是用户可访问的组件,但是至关重要。
通过vbucket,客户端直接访问保存信息的服务器,不需要通过中间代理或者其他架构,因此可以从数据中抽象出物理拓扑结构。这种方式使couchbase易扩展。
这种架构不同于memcached使用的架构,memcached的做法是用 key 算出一个 hash,得到服务器列表中的对应服务器。这个列表需要动态维护,还需要一个hash算法用于处理集群拓扑结构的变化。
如以下代码所示:
-