在移动互联网时代,咱们面对的是更多的客户端,更低的请求延迟,这固然须要对数据作大量的 Cache 以提升读写速度。web
节点:指集群里的一台服务器。redis
目前业界使用得最多的 Cache 系统主要是 memcached 和 redis。 这两个 Cache 系统都有都有很大的用户群,能够说是比较成熟的解决方案,也是不少系统固然的选择。 不过,在使用 memcached 和 redis 过程当中,仍是碰到了很多的问题和局限:算法
Cluster 支持不够。在扩容、负载均衡、高可用等方面存在明显不足。数据库
持久化支持很差,出现问题后恢复的代价大。memcached 彻底不支持持久化,redis 的持久化会形成系统间歇性的负载很高。后端
良好的 cluster 支持服务器
Key 能够动态分散(Auto Sharding)在不一样的服务器上,能够经过动态添加服务器节点增长系统容量。负载均衡
没有单点失效,任何一个单点都不会形成数据不可访问。运维
读写负载能够均匀分布在系统的不一样节点上。异步
支持异步持久化支持memcached
方便快速恢复,甚至能够直接用做 key/value 数据库。 常常在跟业界朋友交流时,会提到用 key 分段的方法来作容量扩展以及负载均衡。可是用静态的 key 分段会有很多问题:
Cache 系统自己及使用 cache
的客户端都须要预设一个分段逻辑,这个逻辑后期若是须要调整将会很是困难。不能解决单点失效的问题,还须要额外的手段。运维须要更多的人为参与,避免 key 超出现有分区,一旦出现 key 找不到对应服务器,访问直接失败。
基于这些想法,我花了几天时间在 google, stack overflow, quora 上看了不少你们关于 cache cluster 的讨论,找到一个比较新系统 Couchbase。
mem vs cb memcached VS couchbase
Couchbase 群集全部点都是对等的,只是在建立群或者加入集群时须要指定一个主节点,一旦结点成功加入集群,全部的结点对等。
对等网的优势是,集群中的任何节点失效,集群对外提供服务彻底不会中断,只是集群的容量受影响。 Smart Client
因为 couchbase 是对等网集群,全部的节点均可以同时对客户端提供服务,这就须要有方法把集群的节点信息暴露给客户端,couchbase 提供了一套机制,客户端能够获取全部节点的状态以及节点的变更,由客户端根据集群的当前状态计算 key 所在的位置。 vBucket
vBucket 概念的引入,是 couchbase 实现 auto sharding,在线动态增减节点的重要基础。
简单的解释 vBucket 能够从静态分片开始提及,静态分片的作法通常是用 key 算出一个 hash,获得对应的服务器,这个算法很简单,也容易理解。如如下代码所示:
servers = ['server1:11211', 'server2:11211', 'server3:11211'] server_for_key(key) = servers[hash(key) % servers.length]
但也有几个问题:
若是一台服务器失效,会形成该分片的全部 key 失效。
若是服务器容量不一样,管理很是麻烦。
前面提到过,运维、配置很是不方便。
为了把 key 跟服务器解耦合,couchbase 引入了 vBucket。能够说 vBucket 表明一个 cache 子集,主要特色:
key hash 对应一个 vBucket,再也不直接对应服务器。
集群维护一个全局的 vBucket 与服务器对应表。
前面提到的 smart client 重要的功能就是同步 vBucket 表。
如如下代码所示:
servers = ['server1:11211', 'server2:11211', 'server3:11211'] vbuckets = [0, 0, 1, 1, 2, 2] server_for_key(key) = servers[vbuckets[hash(key) % vbuckets.length]]
因为 vBucket 把 key 跟服务器的静态对应关系解耦合,基于 vBucket 能够实现一些很是强大有趣的功能,例如:
Replica,以 vBucket 为单位的主从备份。若是某个节点失效,只须要更新 vBucket 映射表,立刻启用备份数据。
动态扩容。新增长一个节点后,能够把部分 vBucket 转移到新节点上,并更新 vBucket 映射表。
vBucket 很是重要,之后能够单独写一篇文章分享。
Couchbase 的对等网设计,smart client
直接获取整的集群的信息,在客户端实现负载均衡,整个集群没有单点失效,而且彻底支持平行扩展。
vBucket 的引入,彻底实现了 auto sharding,能够方便灵活的把数据的子集在不一样节点上移动,以实现集群动态管理。
Couchbase 有一个很是专业的 web 管理界面,而且支持经过 RESTful API 管理,这也是 memcached,
redis 不能企及的。
若是只是作 key/value 的 cache,Couchbase 能够彻底取代 memcached。
Couchbase 已经被咱们在生产环境中大量采用。
张虎
weibo: @Tiger_张虎, 云巴 (yunba.io) 创始人,yunba.io 云后端服务。 JPush 创始人,原CTO。 Oracle VM 创始团队成员。