在移动互联网时代,我们面对的是更多的客户端,更低的请求延迟,这当然需要对数据做大量的 Cache 以提高读写速度。

术语

节点:指集群里的一台服务器。

现有 Cache 系统的特点

目前业界使用得最多的 Cache 系统主要是 memcached 和 redis。 这两个 Cache 系统都有都有很大的用户群,可以说是比较成熟的解决方案,也是很多系统当然的选择。 不过,在使用 memcached 和 redis 过程中,还是碰到了不少的问题和局限:

  • Cluster 支持不够。在扩容、负载均衡、高可用等方面存在明显不足。
  • 持久化支持不好,出现问题后恢复的代价大。memcached 完全不支持持久化,redis 的持久化会造成系统间歇性的负载很高。

我期待的理想 Cache 系统

良好的 cluster 支持

  • Key 可以动态分散(Auto Sharding)在不同的服务器上,可以通过动态添加服务器节点增加系统容量。
  • 没有单点失效,任何一个单点都不会造成数据不可访问。
  • 读写负载可以均匀分布在系统的不同节点上。

支持异步持久化支持

  • 方便快速恢复,甚至可以直接用作 key/value 数据库。 经常在跟业界朋友交流时,会提到用 key 分段的方法来做容量扩展以及负载均衡。但是用静态的 key 分段会有不少问题:
  • Cache 系统本身及使用 cache
    的客户端都需要预设一个分段逻辑,这个逻辑后期如果需要调整将会非常困难。不能解决单点失效的问题,还需要额外的手段。运维需要更多的人为参与,避免 key 超出现有分区,一旦出现 key 找不到对应服务器,访问直接失败。

最接近需求的系统:Couchbase

基于这些想法,我花了几天时间在 google, stack overflow, quora 上看了很多大家关于 cache cluster 的讨论,找到一个比较新系统 Couchbase。


mem vs cb memcached VS couchbase

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 创始团队成员。

Couchbase 介绍 - 更好的 Cache 系统相关推荐

  1. Velodyne收购高清地图公司 将研发更安全的ADAS系统

    据Future Car报道,Velodyne公司周一宣布收购位于旧金山的高清地图创业公司Mapper.ai的知识产权资产,双方将合作开发更安全的ADAS系统. Velodyne公司以其在激光雷达方面的 ...

  2. rails笔记 cache系统

    cache系统 1 cache系统默认只在production下面生效, 要手动生效 修改环境(config/environments) ActionController::Base.perform_ ...

  3. 面试的时候怎样自我介绍更有效果?

    面试是毕业生进入职场前要面临的第一关,只要进入到面试环节,每一轮的开场一定都是自我介绍,一个好的面试自我介绍不仅能完美展示自己的优势,而且也是对后续面试环节的先手布局.因此,好的面试自我介绍会对需要面 ...

  4. win10系统如何搜索计算机,让您电脑搜索查找更方便!Win10系统建立索引教程

    原标题:让您电脑搜索查找更方便!Win10系统建立索引教程 在我们使用电脑时,由于电脑存储的文件多且杂,所以经常需要使用到搜索功能.在开始菜单或是我的电脑上面搜索时,这一功能都是默认全盘扫描的,所以也 ...

  5. 更听话的温室大棚系统-阿里云ioT Studio实现动态业务逻辑

    需求: 用阿里云物联网平台开发的温室大棚物联网系统,正在建设过程中,目前的系统是后台设置好了温度.湿度,光照度的阀值,达到设置值就动作设备,考虑到交付后,这些值可能要变动,每次叫我去设置,也很麻烦,于 ...

  6. 大家介绍一篇学生选课系统的设计与实现

    项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等.这里根据疫情当下,你 ...

  7. 【原创】黑夜路人:如何构建更健壮的在线系统

    [原创]如何构建更健壮的在线系统 作者: 黑夜路人(heiyeluren) 时间:2020年11月 说明:本文主要面对PHP为主要开发语言的业务系统,Golang.Java等语言可以学习参考. 0.  ...

  8. 公司宣传软文怎么写?3个技巧,让你的公司介绍更有逼格

    很多时候企业其实是需要主动出击进行宣传的,而一篇成功的文章就能让企业快速打开知名度,小编对成功的软文进行整理和处理,分享了以下三个技巧,让你的公司介绍更有逼格. 1.学会借鉴 所有的文章都是从借鉴开始 ...

  9. android 缓存文件目录在哪个文件夹里,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...

    先简要介绍一下Android系统的文件系统吧,本文基于原生Android M系统: 我们都知道Android系统内核就是个Linux.所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 &q ...

最新文章

  1. 基于dsp_builder的算法在FPGA上的实现(转自https://www.cnblogs.com/sunev/archive/2012/11/17/2774836.html)...
  2. python手机版怎么用-手机怎么运行python
  3. assert()函数用法
  4. good way for university professors accumulating the citation
  5. 【C++深度剖析教程5】C++中类的静态成员函数
  6. php自动加载什么时候用到,php的自动加载的使用
  7. php post请求后端拿不到值_PHP解决Vue发起POST请求,接收不到数据
  8. 20145203盖泽双《网络对抗技术》后门原理与实践
  9. java 数据结构与算法_数据结构与算法—常用数据结构及其Java实现
  10. Python升级包不成功,试试豆瓣资源吧
  11. 【平头哥蓝牙Mesh网关开发套件试用体验】蓝牙mesh网关接入网络
  12. opendir和readdir
  13. 树莓派raspberry pi 4 SSH默认密码无法登录解决办法
  14. 百度网盘直链原理解析
  15. 关闭windows server 2016弹出交互式服务检测窗口
  16. 幼儿园早期阅读活动的现状及问题研究
  17. caffe生成lmdb数据集的脚本
  18. 在OpenCV里使用SVM识别手写数字
  19. Day036 《电影院售票系统》项目全码
  20. 鼠标选中后会自动删除文件的现状及解决方案

热门文章

  1. div自动滚动_实现图片自动和手动切换的编程技巧
  2. c++根据二叉树的层次遍历建立二叉树_LeetCode | 102.二叉树的层次遍历
  3. kettle 表输入 显示重复_表输入插件详解
  4. dct变换的主要优点有哪些_网络拓扑结构有哪些类型 不同类型网络拓扑结构优缺点介绍【图文】...
  5. 中国水果加工行业产销格局与开发价值分析报告2022版
  6. 全球及中国商用卫生间纸巾分配器行业需求前景及发展趋势研究报告2021-2027年版
  7. 全球与中国硬膜外托盘市场调研分析与“十四五”前景预测展望报告2021-2027年版
  8. 基站基带fgpa 服务器芯片,基于FPGA的AIS基带数据处理芯片设计
  9. 国际农产品交易模式 东亚模式对话国际农民丰收节贸易会
  10. 出席国际海水稻论坛-林裕豪:从玉农业谋定陆丰稻作改良