当前位置: 首页 > 编程日记 > 正文

腾讯开源分布式NoSQL存储系统DCache | 技术头条

640?wx_fmt=jpeg


作者 | 山宝银,腾讯后台高级工程师,专注于分布式 NoSQL 存储领域的技术研发工作,参与腾讯多个自研存储系统的开发,在分布式系统、高可用与高性能服务等领域有较丰富的经验。

来源 | 腾讯技术博客


当你在电商平台秒杀商品或者在社交网络刷热门话题的时候,可以很明显感受到当前网络数据流量的恐怖,几十万商品刚开抢,一秒都不到就售罄;哪个大明星出轨的消息一出现,瞬间阅读与转发次数可以达到上亿。作为终端用户的我们可能会思考,服务系统是怎么在这样严峻的流量环境中存活下来的。


其实,服务系统的架构中有许多巧妙的设计来应对这样的问题,而在这其中,通常系统都会架设缓存系统,用以缓解海量访问请求与数据带来的冲击,实现高性能访问需求。


同时,随着微服务与云等技术的发展,分布式架构的需求变得越来越普遍,再加上今天 Web 上的数据类型已经不再单一,而且数据量也呈爆发式增长,传统的结构化存储方案已经跟不上脚步,对数据库的 SQL 操作不再满足要求,于是 NoSQL 出现。


将这几种技术方案整合起来,我们可以设计出分布式 NoSQL 缓存系统,当前这一类系统有一些比较强大的开源方案,比如 Memcached 和 Redis,它们对整个服务系统的可用性、可扩展性与性能起到至关重要的作用。


腾讯最近开源了一个分布式 NoSQL 存储系统 DCache,它的典型应用场景就在分布式缓存。根据官方介绍,DCache 基于 TARS 微服务治理方案,它支持 k-v、k-k-row、list、set 与 zset 多种数据结构,数据基于内存存储,同时支持后接 DB 实现数据持久化。DCache 具备快速水平扩展能力,同时配套有 Web 运维平台实现高效的运维操作。


我们第一时间采访了 DCache 研发团队成员山宝银,希望对项目的研发背景与相关技术细节有进一步了解。


当前开源的分布式缓存系统中,Memcached 与 Redis 是很普遍的选择,腾讯此次为什么要自己造一个系统呢?


山宝银介绍,虽然 Memcached 与 Redis 本身都拥有极其强大的能力,但是存在运维困难、缺乏集群化方案与无法应对微服务趋势带来的挑战等问题。


举个例子,当前微服务是一大趋势,大家都在说要做微服务,它可以让计算与存储之间解耦,实现轻量级通信。微服务不需要管理生命同期,而作为系统组件的 Redis 则不然,“我们做服务架构设计时希望把逻辑层和数据层分离开来,但是如果使用 Redis 做缓存,缓存与 DB 之间的数据一致性问题,以及缓存不命中如何解决等问题都需要使用者在业务逻辑中做相关处理,这增加了一定的复杂度和难度,也增加了逻辑层和数据层的耦合度。


另一方面,山宝银介绍,起初面对海量数据和高性能访问需求,腾讯内部各个团队其实都开发了各自的缓存系统,然而这些系统之间协议不统一、服务模型多样化、不具有通用性容错、扩展能力也参差不齐,所以团队就着手研发了 DCache 这一套通用 Cache 系统,希望整体去解决业务、开发、运维和监控面临的各种挑战。


所以也可以看到,目前 DCache 已经应用于腾讯内部多个业务上,包括 QQ 浏览器、应用宝、腾讯地图、腾讯电脑管家、手机管家与腾讯游戏等。


SQL、分布式与 NoSQL 的取舍


SQL 是指数据库的结构化查询语言,它是数据库的操作命令集,传统的关系型数据库都使用标准的 SQL 语句操作处理数据。分布式是软件系统的一种架构模式,在分布式系统中,多个硬件或软件组件分布在不同计算机上,彼此之间通过消息传递进行通信,对外表现为一个整体,提供统一化的服务。


有一种普遍的观点是,数据库 SQL 与分布式之间存在天然对立性,山宝银的理解是:“分布式系统因为数据分散在不同的节点,所以像 SQL 的联表、事务等操作需要全局的锁保护,这样处理起来比较复杂,并且影响性能。


SQL 还有与 NoSQL 的取舍问题,NoSQL 是指一类数据库,主要用于高性能处理超海量数据,它的一大特点是数据结构简单,以 key-value 为主,数据之间非关联,容易做水平扩展。


从字面上看,NoSQL 似乎是与 SQL 对立的,做 NoSQL 似乎就意味着放弃 SQL,然而实际上 NoSQL 本意是 Not Only SQL,它不仅仅是 SQL,那么也就可以包含 SQL 的能力。“NoSQL 也不是一定就得放弃 SQL,其实在代理层可以增加 SQL 的解析、计算逻辑来实现 SQL 操作,但这样会影响性能,所以还是看应用场景和业务需求。


山宝银为我们简单分析了 DCache “分布式 NoSQL” 的意义。在 SQL 处理方面,分布式似乎存在劣势,然而分布式意味着可以联结更多的廉价计算机,充分运用算力,以低成本的方式应对高强度的并发访问请求,此外分布式架构还有不少优势,比如避免系统单点问题导致的整体故障,实现高可用。而另一方面,山宝银也说到:“DCache 因为主要的目标就是高性能,SQL 操作并不是主要想解决的问题,所以 DCache 没有实现 SQL 的功能。


DCache 分布式策略与能力


DCache 对外提供服务的粒度是 group,一个 group 负责一部分的数据分片,至于每个 group 服务哪些数据,是根据数据的 key 做 hash 映射后所处的范围来确定的。


DCache 会把数据的 key 通过 hash 算法映射到 0~4294967295 (unsigned int) 范围内,然后把 0~4294967295 范围均匀划分到不同的 group 上。例如有两个 group,key 做 hash 后的值在 0~2147483647 范围就分发到 group1,在 2147483648~4294967295 范围就分发到 group2。


在一个 group 内,采用主备架构,只有主节点接收读写请求,所以数据一致性是可以保证的,而当主机不可用时,会触发主备自动切换,保证服务持续可用。


640?wx_fmt=png

DCache 架构


我们疑惑 DCache 似乎强依赖于 etcd 与 TARS 等中间件,那它本身的核心特性与能力体现在哪里?


山宝银解释,DCache 并不强依赖 etcd,“etcd 只涉及了路由服务 RouterServer 的选主,如果 RouterServer 部署单点也是可用的,而且 RouterServer 的宕机不会影响到数据的读写访问,因为所有的 Proxy 与 Cache 服务都有本地的路由缓存”,关于 TARS 的采用,他说:“因为 TARS 是一个非常优秀的服务开发框架,它屏蔽了底层的网络通信细节,且自带了名字服务等很多服务化需要的功能,对于 DCache 来说,使用已有的 TARS 框架可以更好地做到服务化,我们没有必要去重复的造轮子。


至于 DCache 本身的能力,山宝银介绍:“DCache 自身的存储引擎具有很高的性能,而且支持后接 DB,对使用者来说,不需要再关心 DB 和缓存之间的数据一致性,以及缓存不命中带来的一系列问题。


具体来说,DCache 持久化与 Redis 不一样,后者只是把内存中的数据在本地磁盘做一个备份,保证 Redis 重启之后做数据恢复。


“Redis 持久化主要是为了数据备份。DCache 后端有了 DB 以后,业务的逻辑与后台的数据可以完全隔开,DCache 自身会处理缓存与 DB 之间的数据一致性问题。DCache 会不断的将 Cache 中的数据落地后端 DB,如果 Cache 中存储空间不够,会将已经落地 DB 的冷数据淘汰掉。在数据查询的过程中,如果查询 Cache 不命中,会从 DB 读取并重新存到 Cache,以此来保证 Cache 中数据的热点性和命中率,同时 DB 与 Cache 的穿透问题也得到解决。另外,数据持久化到后端 DB 的能力对于一些需要做离线数据分析的业务场景也比较方便。总之你完全不用关心数据的东西,只需要把数据写到 Cache,后端的落地由 DCache 处理。


640?wx_fmt=png

DCache 特性


此外,DCache 的分布式集群化、异地镜像部署、容灾容错能力在实际线上应用中都会提供非常高的价值。


用武之地


作为一个分布式存储系统,DCache 的应用场景没有限制在缓存上,山宝银介绍,对于有高性能 NoSQL 存储需求的场景,都可以使用 DCache,而且因为 DCache 具备容量淘汰与过期自动清理数据的功能,对于需要存储热点数据(如热门文章)与临时数据(如有时效性的聊天记录)的场景也可以提供很好的支持。


山宝银也提供了 DCache 的性能数据:


640?wx_fmt=png

 

目前腾讯内部包括 QQ 浏览器、应用宝、腾讯地图、腾讯电脑管家、手机管家与腾讯游戏在内的近百个业务都接入了 DCache,这些业务的体量之大可以想象,山宝银补充:“除了提供的这一组简单的数据,DCache 在高效可靠地支撑着近百个业务的运转,日均调用量过万亿次,这也从侧面说明了 DCache 在生产环境的性能与稳定性。


而除了系统本身高性能、高扩展、高可用与数据安全的设计外,Web 可视化的高效运维平台也成了 DCache 不可或缺的重要能力。基于内存的 NoSQL 存储系统在运维上会产生巨大的额外开销,它需要对相关技术进行深入理解,并且在紧要关头果断做出正确决策。


DCache 基于 TARS 开发,所以运维平台将 DCache 与 TARS 的服务管理统一做在了一个模块上,山宝银介绍该运维平台将大大提高效率,同时降低了运维门槛,关于服务的部署、上线、迁移、扩容、监控与配置这些操作都可以轻松实现。


(本文为投稿文章,转载请联系原作者


精彩推荐


640?wx_fmt=jpeg


推荐阅读:

  • 售价910元!周志华等人英文新书《演化学习》出炉!

  • 极客头条

  • 史上第一张黑洞照片是用Python合成的?

  • 从头构建恶性肿瘤检测网络 | 100行Python代码理解深度学习关键概念

  • 技术头条

  • 程序员的黑砖窑,东南亚博彩骗局详解

  • 助力 Android 抗衡 iOS,华为发布方舟编译器!

  • 要成为年薪百万的技术大牛必经历这5个阶段, 收好这份超实用的技术进阶指南 | 技术头条

  • 程序员为什么都爱穿冲锋衣?(最全总结)

640?wx_fmt=png


点击“阅读原文”,查看更多精彩文章。

相关文章:

老司机带你学爬虫——Python爬虫技术分享

什么是“爬虫”? 简单来说,写一个从web上获取需要数据并按规定格式存储的程序就叫爬虫; 爬虫理论上步骤很简单,第一步获取html源码,第二步分析html并拿到数据。但实际操作,老麻烦了~ 用Python写“爬虫”有哪…

[转载]分享WCF聊天程序--WCFChat

http://www.cnblogs.com/gaoweipeng/archive/2009/09/04/1560260.html 无意中在一个国外的站点下到了一个利用WCF实现聊天的程序,作者是:Nikola Paljetak。研究了一下,自己做了测试和部分修改,感觉还不错,分享给大家。…

【C++】C++11 STL算法(五):设置操作(Set operations)、堆操作(Heap operations)

目录设置操作(Set operations)一、includes1、原型:2、说明:3、官方demo二、set_difference1、原型:2、说明:3、官方demo三、set_intersection1、原型:2、说明:3、官方demo四、set_symmetric_difference1、…

63万张!旷视发布最大物体检测数据集Objects365 | 技术头条

编辑 | 琥珀来源 | AI科技大本营(id:rgznai100)昨日,在旷视科技联合北京智源人工智能研究院举办的发布会上,旷视研究院发布了物体检测数据集 Objects365,包含 63 万张图像数量,365 个类别数量&a…

(一)Android Studio 安装部署 华丽躲坑

叨叨两句先 小宇之前一直做前后端开发,只是略懂JS,未接触过Java和Android 近期工作任务也是兴趣使然,开始琢磨DJI二次开发 DJI是我最服气的无人机厂商,无人机稳定性极强,性价比狂高,还给了极度丰富的二次开…

linux 环境配置 安装jdk

一. 下载jdk5.0 for linux 到sun的主页 http://java.sun.com/j2se/1.5.0/download.jsp 下载jdk安装文件jdk-1_5_0_05-linux-i586.bin 二. 解压安装jdk 在shell终端下进入jdk-1_5_0_05-linux-i586.bin文件所在目录,执行命令 ./jdk-1_5_0_05-linux-i586.bin 这时会出现…

【C++】C++11 STL算法(六):最小/最大操作(Minimum/maximum operations)、比较运算(Comparison operations)

目录最小/最大操作(Minimum/maximum operations)一、max1、原型:2、说明:3、官方demo二、max_element1、原型:2、说明:3、官方demo三、min1、原型:2、说明:3、官方demo四、min_element1、原型:2…

springboot之定时任务

定时线程 说到定时任务,通常会想到JDK自带的定时线程来执行,定时任务。 回顾一下定时线程池。 public static ScheduledExecutorService newScheduledThreadPool(int var0) {return new ScheduledThreadPoolExecutor(var0);}public static ScheduledExec…

10只机器狗拉卡车!井然有序,毫不费力 | 极客头条

整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)看来,这家娱乐网友多年的机器人公司终于要开始实现商用化了!最先备受期待的是它的网红机器狗 SpotMini。今日凌晨,据多家外媒报道,波士顿动力 (Boston Dynami…

linux下查看nginx,apache,mysql,php的编译参数

有时候nginx,apache,mysql,php编译完了想看看编译参数可以用以下方法 nginx编译参数: #/usr/local/nginx/sbin/nginx -V nginx version: nginx/0.6.32 built by gcc 4.1.2 20071124 (Red Hat 4.1.2-42) configure arguments: --us…

【C++】C++11 STL算法(七):排列操作(Permutation operations)、数值操作(Numeric operations)

排列操作&#xff08;Permutation operations&#xff09; 一、is_permutation 1、原型&#xff1a; template< class ForwardIt1, class ForwardIt2 > bool is_permutation( ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2 );template< class ForwardIt…

码书:入门中文NLP必备干货:5分钟看懂“结巴”分词(Jieba)

导读&#xff1a;近年来&#xff0c;随着NLP技术的日益成熟&#xff0c;开源实现的分词工具越来越多&#xff0c;如Ansj、盘古分词等。在本文中&#xff0c;我们选取了Jieba进行介绍和案例展示&#xff0c;主要基于以下考虑&#xff1a;社区活跃。截止本文发布前&#xff0c;Ji…

《你必须掌握的Entity Framework 6.x与Core 2.0》正式出版感想

前言 借书正式出版之际&#xff0c;完整回顾下从写博客到写书整个历程&#xff0c;也算是对自己近三年在技术上的一个总结&#xff0c;整个历程可通过三个万万没想到来概括&#xff0c;请耐心阅读。 写博、写书完整历程回顾 从2013年12月注册博客园账号&#xff0c;注册博客园账…

JSF实现“Hello World!”

我们编写一个在页面上显示是“Hello World! ”&#xff0c;我们至少需要编写一个Page对象和一个对应模板文件&#xff08;tml&#xff09;。 第一步&#xff0c;Page对象编写 在Tapestry5中Page是与一个页面对应的POJO对象&#xff0c;它不需要继承Tapestry框架的任何基类或实现…

《权力的游戏》最终季上线!谁是你最喜爱的演员?这里有一份Python教程 | 附源码...

译者 | 刘畅编辑 | 琥珀出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;《权力的游戏》最终季已于近日开播&#xff0c;对于全世界翘首以待的粉丝们来说&#xff0c;其最大的魅力就在于“无法预知的人物命运”。那些在魔幻时代的洪流中不断沉浮的人们&…

【C++】C++11 STL算法(八):对未初始化内存的操作(Operations on uninitialized memory)、C库(C library)

对未初始化内存的操作&#xff08;Operations on uninitialized memory&#xff09; 一、uninitialized_copy 1、原型&#xff1a; template< class InputIt, class ForwardIt > ForwardIt uninitialized_copy( InputIt first, InputIt last, ForwardIt d_first );2、…

OSPF高级设置实现全网互通

OSPF(开放式最短路径优先)是对链路状态路由协议的一种实现&#xff0c;隶属内部网关协议&#xff08;IGP&#xff09;&#xff0c;故运作于自治系统内部(AS)。采用戴克斯特拉算法&#xff08;Dijkstras algorithm&#xff09;被用来计算最短路径树。“Cost”作为路由度量值。链…

学习PHP ?

学PHP的决定真的是好的吗&#xff1f; 不怕又再错一次了吗&#xff1f; 已经是最后的一年半上学时间了.... 真的不愿再走之前那条失败的路&#xff0c;不愿&#xff0c;真的不愿&#xff1b; 这年半无论如何都要把一样技术搞精了 一年半的时间&#xff0c;对我来讲够了....只看…

【数据库】sqlite中的限制:数据库大小、表数、列数、行数、参数个数、连接数等

目录一、参考网址二、详解1、查看、设置sqlite限制命令.limit2、SQLite中的限制汇总1&#xff09;字符串或BLOB的最大长度2&#xff09;最大列数3&#xff09;SQL语句的最大长度4&#xff09;联接中的最大表数5&#xff09;表达式树的最大深度6&#xff09;函数的最大参数个数7…

flutter中的生命周期

前言 和其他的视图框架比如android的Activity一样&#xff0c;flutter中的视图Widget也存在生命周期&#xff0c;生命周期的回调函数提现在了State上面。理解flutter的生命周期&#xff0c;对我们写出一个合理的控件至关重要。组件State的生命周期整理如下图所示&#xff1a; 大…

小鱼易连获腾讯数亿C轮投资,云视频布局产业互联网

4 月 18 日&#xff0c;小鱼易连在北京举行 “鱼腾视界 产业互联” 战略合作暨融资发布会上&#xff0c;正式宣布获得 C 轮融资&#xff0c;由腾讯领投。融得的资金将全面用于小鱼易连云视频系统在产业互联网领域的落地&#xff0c;打通企业、政府、个人三者之间的柔性生态全产…

异步IO一定更好吗?

http://cnodejs.org/blog/?p1015续&#xff1a;异步IO一定更好吗&#xff1f;我之前的一篇文章《异步IO一定更好吗&#xff1f;》中举了一个很变态的例子&#xff0c;用以说明在单碟机械式硬盘上异步IO反而可能降低性能的问题&#xff0c;大家的讨论很热烈。前天的NodeParty杭…

谈谈Python那些不为人知的冷知识(二)

本文转载自Python的编程时光&#xff08;ID:Python-Time&#xff09;小明在日常Code中遇到一些好玩&#xff0c;冷门的事情&#xff0c;通常都会记录下来。从上一篇的分享来看&#xff0c;仍然有不少 Pythoner 对这些冷知识存在盲区&#xff0c;所以今天迎来第二篇。如果上篇你…

前端每日实战:45# 视频演示如何用纯 CSS 创作一个菱形 loader 动画

效果预览 按下右侧的“点击预览”按钮可以在当前页面预览&#xff0c;点击链接可以全屏预览。 https://codepen.io/comehope/pen/eKzjqK 可交互视频教程 此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。 请用 chrome, safari, edge 打开观看。…

【数据库】SQLite和MySQL之间的对比和选择

目录1、各自特定2、使用场景3、选择哪个1、各自特定 SQLite &#xff1a;独立、简单&#xff08;零配置&#xff09;&#xff1b;适用于为单个应用程序和设备提供本地数据存储。 MySQL&#xff1a;可伸缩、高并发性&#xff1b;适用于客户端/服务器模式企业数据的共享数据存储…

MySql中管理百万级要注意些什么东西(转载)

一、我们可以且应该优化什么&#xff1f; 硬件 操作系统/软件库 SQL服务器(设置和查询) 应 用编程接口(API) 应用程序 二、优化硬件 如果你需要庞大的数据库表 (>2G)&#xff0c;你应该考虑使用64位的硬件结构&#xff0c;像Alpha、Sparc或即将推出的IA64。因为MySQL内部使用…

【数据库】sqlite3数据库备份、导出方法汇总

【数据库】sqlite3常用命令及SQL语句 目录1、直接拷贝数据库2、使用.backup .clone1&#xff09;交互式2&#xff09;脚本3、导出到csv文件中&#xff08;其它格式类似&#xff09;1&#xff09;交互式2&#xff09;脚本3&#xff09;导出成其它格式汇总a> .mode asciib>…

高通与苹果宣布“复合”,英特尔黯然退场 | 极客头条

作者 | 郭芮转载自公众号CSDN&#xff08;ID:CSDNnews&#xff09;为期两年的苹果高通“诉讼之争”经历了各种推波助澜愈演愈烈&#xff0c;俨然到了最为关键的白热化阶段&#xff0c;没成想&#xff0c;在刚刚正式进入美国司法庭审环节的两天后却被强势叫停了&#xff01;4 月…

MQTT 协议 Client ID 长度不能超过23个字符

今天遇到一个MQTT的问题&#xff0c;MqttException: MQIsdp ClientId > 23 bytes ClientId的长度大于23时&#xff0c;无法链接MQTT服务器。 经过查看协议发现&#xff1a;客户端标识符(Client ID)是介于1和23个字符长度,客户端到服务器的唯一标识。它必须在搜有客户端连接到…

【数据库】适用于SQLite的SQL语句(一)

目录一、统计函数二、表TABLE1、创建表CREATE TABLE2、更改表ALTER TABLE3、删除表DROP TABLE三、分析表ANALYZE四、附加数据库 ATTACH DATABASE五、事务六、核心函数七、索引INDEX1、创建索引&#xff1a;CREATE INDEX2、查看索引&#xff1a;3、使用索引 INDEXED BY4、删除索…