背景
Redis 和Couchbase都是基于内存的数据存储系统。在它们各自的官方描述中,Couchbase是高性能,高伸缩性和高可用的分布式缓存系统;Redis是一个开源的内存数据结构存储系统。
Couchbase
介绍
2012年2月,CouchOne与Membase合并,Couchbase基于Membase与CouchDB开发了一款新产品。 CouchBase是一款开源的、分布式的、面向文档的NoSQL数据库,主要用于分布式缓存和数据存储领域,Membase 是 NoSQL 家族的一个新的重量级的成员,它是个键/值、持久化、可伸缩的解决方案,使用了memcached wire协议。CouchOne支持CouchDB。CouchDB是个文档数据库,提供了端到端的复制方法,这对于移动与分布在不同位置的数据中心来说是很有用的。CouchBase能够通过manage cache提供快速的亚毫米级别的k-v存储操作,并且提供快速的查询和其功能强大的能够指定SQL-like查询的查询引擎。Couchbase是一个较新的、发展迅速的nosql数据库技术。
特点
couchbase是一个非关系型数据库,它实际上是由couchdb+membase组成,所以它既能像couchdb那样存储json文档,也能像membase那样高速存储键值对。主要有以下几个特点:
- 速度快:由于是内存优先的高性能设计,所有的读写操作都是直接操作内存,因此速度非常快。
- 高可用:主要从两个方面,一个是它自带集群方案,支持多副本模式,另一个是它自带持久化方案,可以设置定时把数据异步写到文件系统上。
- 配置使用方便:安装后自带web管理台,可以在管理台上对集群、桶、索引、搜索等进行管理和操作,大量减轻运维的工作,使用简单。
- 快速构建:Couchbase 使开发人员能够构建响应迅速且灵活的云、移动和边缘计算应用程序,这些应用程序可以轻松扩展。
数据模型
Couchbase 数据模型基于 JSON,它支持基本的数据类型,例如数字和字符串;和复杂类型,例如嵌入式文档和数组,单个Document通常代表应用程序代码中对象的单个实例。一个Document可能被认为等同于关系型数据库中的一行;每个Document的属性都相当于一列。然而,Couchbase 提供了比关系数据库更大的灵活性,因为它可以存储具有不同模式的 JSON 文档。Document可以包含嵌套结构,这允许开发人员表达多对多关系,而不需要引用或join表。
buckets
buckets是couchbase中组织数据的一种方式,类似于关系型数据库中的databse,一个集群最多可以创建30个buckets。每个存储buckets必须指定为以下三种类型之一。
- Couchbase buckets:这些类型数据持久存储在内存和硬盘中。它们允许使用DCP(Database Change Protocol) 自动复制数据以实现高可用性;并通过XDCR (Cross Data Center Replication)跨多个集群动态扩展。
- Ephemeral buckets:这是 Couchbase buckets的替代方案,可在不需要持久性时使用。数据仅在内存中。
- Memcached buckets:只存储在内存中,遵循Memcached协议,现在已经弃用。
同步协议
DCP (Database Change Protocol),DCP 协议是一个高效的二进制协议,它主要用于集群内的数据复制、索引复制、备份数据等等。主要概念有以下几点:
- 有序复制,基于每个vbucket存在一个顺序序列号,同步时根据序列号进行更新。
- 重启恢复,当同步连接中断后,重新连接后,会对冲突数据进行恢复。
- 一致性,使用快照数据同步数据统一性。
- 内存间复制。
XDCR (Cross Data Center Replication),XDCR提供了多个有效vbucket的数据的复制,主要用于跨数据中心的多集群间的复制,可以跨版本复制。主要概念有以下几点:
- 基于bucket复制,两个集群的同一个bucket可以实现单向或者双向复制。
- 通过DCP协议保持持续性复制,一个XDCR连接中包括多个DCP数据流。这些流可以根据不同的分区对目的集群进行同步复制。
- 支持多种集群拓扑复制。集群间可以通过单向,双向复制。多个集群可以实现1对1,1对多,多对1等的集群复制拓扑图。
- 安全复制。数据中心见传输数据可以使用SSL进行加密。
- 最终一致性和解决数据冲突的能力。当出现冲突数据,会使用元数据的序列值,CAS值,文档标签和过期时间限制对数据进行冲突解决。
服务
Couchbase 服务器提供以下服务:
- Data service(数据服务):数据服务提供完全集成的内存缓存层,提供高速数据访问,支持键指定的数据项的存储、设置和检索。
- Query service(查询服务):类sql查询语言获取结果,还可以针对数据定义(定义索引)和数据操作(添加或删除数据)发出查询。
- Index service(索引服务):创建索引,为Analytics和Query使用,索引服务支持为存储在 Couchbase 集群中的项目,创建主索引和二级索引。
- Analytics service(分析服务):分析服务提供并行数据管理功能,允许运行复杂的分析查询,适用于大数量,运行时间长,资源消耗比较大。
- Search Service (搜索服务):搜索服务为集群数据 提供全文索引和搜索引擎功能。
- Event Service(事件服务):支持对数据更改的近乎实时的处理:代码既可以响应文档突变而执行,也可以按照计时器的调度执行。
- Backup Service(备份服务):支持计划完整和增量数据备份,既可以针对特定的单个存储桶,也可以针对集群上的所有存储桶。
Redis
介绍
Remote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统,它 是一个开源(BSD许可)的内存型数据存储系统,支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的AP以及丰富的数据结构,它可以用作数据库、缓存和消息中间件。并支持事务、发布订阅、lua脚本、lru驱动事件、过期机制、自动故障转移等多种功能,由于Redis 是用ANSI C编写的,可在大多数 POSIX 系统(如 Linux、*BSD 和 OS X)中运行,无需外部依赖。
特点
- 内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
- Redis的所有数据存储在内存中,对数据的更新将异步地保存到磁盘上。
- 功能丰富。除了支持五种数据结构之外,还支持事务、流水线、发布/订阅、消息队列等功能。
- (服务架构)支持高可用和分布式。
持久化
redis 提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
- RDB,简而言之,就是在不同的时间点,将 redis 存储的数据生成快照并存储到磁盘等介质上。
- AOF,则是换了一个角度来实现持久化,那就是将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实 RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。如果你没有数据持久化的需求,也完全可以关闭 RDB 和 AOF 方式,这样的话,redis 将变成一个纯内存数据库,就像 memcache 一样。
集群管理
Redis在3.0版本以后开始支持集群,经过中间几个版本的不断更新优化,最新的版本集群功能已经非常完善,Redis 集群是一个提供在多个Redis间节点间共享数据的程序集,集群节点共同构建了一个去中心化的网络,集群中的每个节点拥有平等的身份,节点各自保存各自的数据和集群状态。节点之间采用Gossip协议进行通信,保证了节点状态的信息同步。Redis 集群数据通过分区来进行管理,每个节点保存集群数据的一个子集。数据的分配采用一种叫做哈希槽(hash slot)的方式来分配,和传统的一致性哈希不太相同。Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,集群使用了主从复制模型。读取数据时,根据一致性哈希算法到对应的 master 节点获取数据,如果master 挂掉之后,会启动一个对应的 salve 节点来充当 master 。在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。
总结
其实不论是在大块数据还是大数据量的处理上,Couchbase都要优于Redis,很多平台都是采用Couchbase来管理数千万热数据。所以,如果缓存大多数情况下仅仅需要提供数据新增和查询操作,那Couchbase基于文档类型的存储结构能够始终如一地为提供亚毫秒的查询体验,对于预定义的数据类型你还可以通过创建索引进一步优化性能,这种情况下,Couchbase无疑是你更好的选择。
- Redis支持服务器端的数据操作:Redis相比Couchbase来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Couchbase里,你需要将数据拿到客户端来进行类似的修改再set回去(你需要先先通过get方法从服务器读取数据文档,并将文档反序列化为json对象,之后修改json对象对应属性,再通过set方法将数据写入服务器,序列化后进行存储)。这大大增加了网络IO的次数和传输中的数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。
- 内存使用效率对比:使用简单的key-value存储的话,Couchbase的内存利用率更高,而Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Couchbase。所以,如果需要缓存能够支持更复杂的数据结构和更频繁数据的部分更新操作,那么Redis会是不错的选择。(下文会在关于数据存储模型来证明这一点)。
- 性能对比:由于Redis只使用单核,而Couchbase可以使用多核,所以平均每一个核上Redis在存储小数据时比Couchbase性能更高。而在100k以上的数据中,Couchbase性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Couchbase,还是稍有逊色。