采访嘉宾 | 山宝银 算法
编辑 | h4cd数据库
当你在电商平台秒杀商品或者在社交网络刷热门话题的时候,能够很明显感觉到当前网络数据流量的恐怖,几十万商品刚开抢,一秒都不到就售罄;哪一个大明星出轨的消息一出现,瞬间阅读与转发次数能够达到上亿。做为终端用户的咱们可能会思考,服务系统是怎么在这样严峻的流量环境中存活下来的。后端
其实,服务系统的架构中有许多巧妙的设计来应对这样的问题,而在这其中,一般系统都会架设缓存系统,用以缓解海量访问请求与数据带来的冲击,实现高性能访问需求。浏览器
同时,随着微服务与云等技术的发展,分布式架构的需求变得愈来愈广泛,再加上今天 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 之间的数据一致性问题,以及缓存不命中如何解决等问题都须要使用者在业务逻辑中作相关处理,这增长了必定的复杂度和难度,也增长了逻辑层和数据层的耦合度。”
另外一方面,山宝银介绍,起初面对海量数据和高性能访问需求,腾讯内部各个团队其实都开发了各自的缓存系统,然而这些系统之间协议不统1、服务模型多样化、不具备通用性容错、扩展能力也良莠不齐,因此团队就着手研发了 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 内,采用主备架构,只有主节点接收读写请求,因此数据一致性是能够保证的,而当主机不可用时,会触发主备自动切换,保证服务持续可用。
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 处理。”
DCache 特性
此外,DCache 的分布式集群化、异地镜像部署、容灾容错能力在实际线上应用中都会提供很是高的价值。
用武之地
做为一个分布式存储系统,DCache 的应用场景没有限制在缓存上,山宝银介绍,对于有高性能 NoSQL 存储需求的场景,均可以使用 DCache,并且由于 DCache 具有容量淘汰与过时自动清理数据的功能,对于须要存储热点数据(如热门文章)与临时数据(若有时效性的聊天记录)的场景也能够提供很好的支持。
山宝银也提供了 DCache 的性能数据:
目前腾讯内部包括 QQ 浏览器、应用宝、腾讯地图、腾讯电脑管家、手机管家与腾讯游戏在内的近百个业务都接入了 DCache,这些业务的体量之大能够想象,山宝银补充:“除了提供的这一组简单的数据,DCache 在高效可靠地支撑着近百个业务的运转,日均调用量过万亿次,这也从侧面说明了 DCache 在生产环境的性能与稳定性。”
而除了系统自己高性能、高扩展、高可用与数据安全的设计外,Web 可视化的高效运维平台也成了 DCache 不可或缺的重要能力。基于内存的 NoSQL 存储系统在运维上会产生巨大的额外开销,它须要对相关技术进行深刻理解,而且在紧要关头果断作出正确决策。
DCache 基于 TARS 开发,因此运维平台将 DCache 与 TARS 的服务管理统一作在了一个模块上,山宝银介绍该运维平台将大大提升效率,同时下降了运维门槛,关于服务的部署、上线、迁移、扩容、监控与配置这些操做均可以轻松实现。
山宝银,腾讯后台高级工程师,专一于分布式 NoSQL 存储领域的技术研发工做,参与腾讯多个自研存储系统的开发,在分布式系统、高可用与高性能服务等领域有较丰富的经验。
(点击文末“阅读原文”,查看DCache源代码)
本文分享自微信公众号 - TARS星球(TarsCloud)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。