写点什么

JIMDB:一个大规模分布式内存存储的演进之路

  • 2015-12-11
  • 本文字数:3588 字

    阅读完需:约 12 分钟

写在前面 Redis 是一个 C 语言编写的开源、支持网络、基于内存、键值对存储、可持久化的高性能 NoSQL 数据库,同时提供多种语言的 API,目前最新版本为 3.0.5 。由于性能优异,已被国内外众多公司采用构建缓存集群。其中,京东对Redis 的应用实践可圈可点。

在2014 年的 QCon 上海大会上,京东云平台首席架构师刘海锋介绍了京东分布式内存存储平台(RAM store platform)。经过两年多的演进,这套系统已经支撑起京东几乎所有的在线业务。近日,InfoQ 采访了刘海锋,再探这个分布式内存存储平台的全貌。以下是采访实录:

InfoQ:你能简单介绍一下 JIMDB 这两年来的研发过程吗?

刘海峰:JIMDB 是一个以内存为中心的键值数据库,目前在我们京东多个数据中心部署了几千台机器,支撑了京东几乎所有的在线业务。JIMDB 的研发是一个逐步演进的过程,最初是从 Redis 改进而来,现在的数据模型是兼容但不仅限于 Redis,可以理解为 Redis 的一个超集。JIMDB 在京东的应用也不限于缓存,我们很多业务线已经把它当成唯一的存储。

具体来说,研发过程经历了三个阶段:

  • 第一个阶段是从 2013 年底开始。当时我们在使用 Redis 时遇到了一些问题,为了解决这些问题,我们把 Redis 这个优秀的单机软件变成一个健壮的分布式系统。比如我们要做故障的手动、自动切换;要实现横向扩展,动态分片并且不能影响网络流量;要实现灵活的异步复制、同步复制。虽然每个实例仍然是单个的 Redis,但整个的集群能够实现故障的切换、横向的扩展和比较灵活的复制。
  • 第二个阶段从 2014 年下半年开始。用一句话来概括这个阶段就是把 JIMDB 变成了一个完全托管、自管理、自运维的存储服务。因为 Redis 的引擎比较简单,为了实现这个目标,我们重写了整个内存存储的引擎,使之可以支持更细粒度的分片;复制协议部分也作了改动,不但支持全量复制、增量复制,还支持了任意局部复制。例如,我们经常遇到某个分片上的热数据过载的问题,这时候的解决方案是把这部分数据复制到其他的实例上,从而分散流量,这样我们就实现了动态的分裂、合并。在运维管理上我们引入了 Docker,部署环节实现了整体的调度。
  • 第三个阶段在 2015 年上半年启动规划,目前这个阶段还在进行中。我们已经把很多实现陆续推到了线上。即,不仅仅支持原来的哈希分片和原有的数据类型,我们还实现了在内存中支持 B+ 树、支持按范围的划分、支持排序的遍历、复制协议也更健壮、更可靠,等等。第三阶段实现的特性将比 Redis 更加强大。当一个分布式存储支持按范围分片和复制的时候,这个系统无疑是更健壮和更可靠的。当然,这个阶段也存在很多的挑战,例如,哈希的分片相对来说比较简单,但我们要实现按范围、跨数据中心的异步和同步复制时,这个挑战就大的多了。

纵观这两年的发展,JIMDB 从最初的几台服务器到现在的几千台、从单机 Redis 系统到自管理的分布式存储系统、用户只需要一个认证授权即可使用、支持京东线上一千多个业务(集群),是一个不断挑战的过程。

InfoQ:市面上已经有了大量的键值对存储数据库,并且已经在大公司的生产环境投入使用。为什么京东还要开发 JIMDB?

刘海峰:这更多的是业务的需求。公司原来的存储应用百花齐放,有人用 Redis、有人用 MongoDB、有人用 memcached 等等。但现在的情况是,数据库用 MySQL 比较多;NoSQL 几乎 99% 的都在用 JIMDB。原因在于 JIMDB 有人维护、自管理、性能稳定,俨然已成为京东内部垄断性的应用。但在项目开始的时候我们也没想到会变成今天的规模,随着业务的发展,JIMDB 一步一步演进成了今天的样子。

InfoQ:JIMDB 在京东的主要应用场景是哪些业务领域?在这些应用场景里,跟其他内存存储相比 JIMDB 有哪些优势?

刘海峰:目前 JIMDB 的应用场景十分广泛。比如,现在依然有很多同事把 JIMDB 当 Redis 来用,很多人拿来当缓存用,也有很多人把 JIMDB 当唯一存储在用,用法不一而足。甚至,很多离线计算 MapReduce 的结果也直接存在 JIMDB 里;对京东的访问用户来说,大家看到的商品详情整个页面的所有元素、第三方 show 的广告、搜索推荐的结果等等,都是存在 JIMDB 里面。我们支撑了无线端、PC 端很多业务。但总的来说,目前用量最大的业务是搜索和推荐的集群,另外单品页的用量也很大。因此这个系统的压力也很大。

跟其他内存存储相比,首先这个系统是从 Redis 演进过来的,Redis 有的功能我都有,但是 JIMDB 在很多方面都比 Redis 更健壮、更稳定。其次,从 Redis 的视角来说,这是一个经过大规模生产环境验证的、更好的 Redis。目前我们有六、七个人在维护这个系统。

InfoQ:对冷热数据的处理以及数据持久化 JIMDB 是怎么做的?在算法和数据结构方面 JIMDB 做了哪些优化设计?

刘海峰:持久化还是采用经典的方式——记日志、定期做快照。虽然这是一个很简单的方式,但是十分的有效。对于可预测的热数据我们会预先做分片,尤其是秒杀活动的内容;而对瞬时的热数据做动态调整是 JIMDB 最优先的特性实现,这跟我们电商的特性相关。目前京东的老机房大量部署了 JIMDB,新机房也部署了很多。

算法和数据结构方面,刚才已经举过一个例子就是 B+ 树。我们实现了 KV 的有序排列和按任意范围的分割、复制。这是我们新加的数据类型,其他的支持已经十分强有力了。

InfoQ:据我所知 Redis 所在机器物理内存使用率并不高(貌似没有超过实际内存总量的 60%)。针对京东这么大规模的在线存储,内存管理方面 JIMDB 是怎么做的?

刘海峰:这一方面主要做的工作是内存分配器的优化。Redis 的内存分配器是 jemalloc ,我们依然沿用了 jemalloc,但是我们作了很多优化。此外,我们对比较大的 Value 做了特殊处理,比如我们不让大 Value 的存储占据内存,而把它写到磁盘中去。但是很多人会问 SSD 的问题,为什么不采用混合存储的架构?

其实在 2014 年的时候我们专门在线上测试过这个方案,当时大概对 10% 的集群采用了混合存储的方案。经过一段时间的测试发现:

  • 首先,虽然 SSD 的成本有一定的优势,但实施工程是有成本的。基于磁盘去写一个有丰富类型的键值数据库其实是比较复杂的,即使是简单的键值都比较复杂,在遇到 Map、List、B+ 树等等,用磁盘的方式实现起来其实更为复杂、成本更高。也就是说,其实现和维护的成本太高,并且性能也不占优,整体工程成本远远超过内存存储。
  • 第二个原因在于,内存的价格在逐渐降低,我们是能承受这个成本的。目前我们使用的内存也越来越大,预计明年我们将在单机上使用 1T 的内存。
  • 第三个原因是系统架构方面的考虑。我们的数据中心有很多的机器,很多应用服务器和私有云服务器多数时候的内存利用率并不高,我们可以利用这些机器的资源做 JIMDB 的动态资源池,只需要在相应的机器上部署一个 JIMDB 的程序就好。这也极大地提高了整个数据中心的资源利用率。

基于以上三点考虑,我们选择用内存做存储。随着京东业务的发展,未来 1~2 年我们 JIMDB 的规模将达到 1 万台机器,当然,这 1 万台机器并不是专用的,而是 JIMDB 在整个数据中心的部署量。

InfoQ:你能谈谈 JIMDB 在“双 11”大考中的表现吗?

刘海峰:JIMDB 在“双 11”的表现很好,系统稳定,性能平稳。我们的新机房启用了大量万兆网卡,以前千兆网卡被打满的情况终于得到缓解。但任何系统都不可能没有任何瑕疵,现在看来 JIMDB 的问题更多的不是技术性的,而是系统到了一定量级怎么去运维,尤其是系统预警和运维操作流程方面的工作需要加强。随着公司业务的发展,运维正变得越来越重要。

我们花了很多精力来做监控与运维。JIMDB 核心的部分是一个个兼容 Redis 协议的 Server,除了网络部分,我们几乎重写了整个存储引擎。还是拿一个具体的应用场景来说吧,假设我一台机器上跑了 15 个实例,但是发现其中一个实例的流量极大,把其他实例的带宽都给占了。这个时候我需要对这个有问题的实例进行分裂和迁移。但是迁移的时候存在一个问题,由于进出流量都很大,迁移有可能是迁不动的。这个时候我们有一个限流措施,保证在不影响其他实例带宽的情况下把有问题的实例迁走。

InfoQ:你怎么看待 JIMDB 未来的发展趋势?或者,你能否谈一下内存云存储(RAMCloud)的未来?

刘海峰:我非常坚信的一点是,内存是存储的未来,特别是对一些有结构化的数据来说。随着内存成本的降低,以及在内存上实现存储的简洁和高效,这个趋势势不可挡。而且我认为 JIMDB 这两年做的工作是一种更务实的 RAMCloud 实现,它是业务驱动的、经过大规模生产环境验证的。

未来随着系统的发展,在功能上我们会以内存为中心,做有序的、KeyValue 的、丰富数据类型的大表支持。JIMDB 未来有可能会加入一些 SQL 的支持。目前要先把规模、稳定和运维做好。


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-12-11 17:1814159
用户头像

发布了 64 篇内容, 共 23.8 次阅读, 收获喜欢 11 次。

关注

评论

发布
暂无评论
发现更多内容

秒云获得阿里云首批产品生态集成认证,携手阿里云共建云原生智能运维生态服务

阿里巴巴中间件

阿里云 云原生 云原生加速器

陈大好:持续创造小而美的产品丨独立开发者 x 开放麦

声网

人工智能

【算法实践】| 一步步手把手带你实现寻找最小公倍数

迷彩

算法 算法实践 8月月更 最小公倍数

Kubernetes MetalLB 作为 Load Balancer上

CTO技术共享

中国掀起数字化浪潮的4个显著变化

优秀

数字化转型 数字化

华为云数字化

科技云未来

C++文件读写操作分析文本文件与二进制文件

CtrlX

c c++ 面向对象 8月月更 opp

天翼云通过2022可信云安全首批云工作负载保护平台评估

Geek_2d6073

网站建设流程

源字节1号

网站开发

每日一R「13」数据结构(四)闭包

Samson

学习笔记 8月月更 ​Rust

[教你做小游戏] 用86行代码写一个联机五子棋WebSocket后端

HullQin

CSS JavaScript html 前端 8月月更

leetcode 697. Degree of an Array 数组的度(简单)

okokabcd

LeetCode 数据结构与算法

Tomcat 的安装与环境配置

楠羽

开源 #开源

Kubernetes MetalLB 作为 Load Balancer下

CTO技术共享

迁移 Nacos 和 ZooKeeper,有了新工具

阿里巴巴中间件

zookeeper 阿里云 云原生 nacos 迁移

企业应用现代化实用教程 | ​IT架构师必读的DevOps落地行动指南

York

DevOps 云原生 数字化转型 一体化架构 应用现代化

灵魂拷问:你精神内耗了吗?由TA来治愈吧

脑极体

云原生2.0构建数字化

科技云未来

IPv6过渡技术的推进策略

穿过生命散发芬芳

ipv6 8月月更

头脑风暴:回文子串

HelloWorld杰少

算法 LeetCode 数据结构, 8月月更

融云,把企业文化放在“场景”里

融云 RongCloud

企业文化

华为云助力论坛服务

科技云未来

redis持久化持久化的方案与各自存在的问题

想要飞的猪

程序员过中秋

楠羽

中秋节

监控告警怎么搭建比较合理?B站SRE实践总结了4大关键步骤

TakinTalks稳定性社区

高可用 稳定性 SRE 监控告警 大厂实践

汽车电子控制系统的构成

不脱发的程序猿

汽车电子 嵌入式软件 汽车电子控制系统

详解CAN总线:高速CAN总线和低速CAN总线的特性

不脱发的程序猿

汽车电子 ISO 11898 高速CAN总线 低速CAN总线 CAN总线

详解AUTOSAR:什么是AUTOSAR?(理论篇—1)

不脱发的程序猿

汽车电子 嵌入式开发 AUTOSAR

加密世界的福音,Galaxy Project上领取专属Zebec OAT

鳄鱼视界

DDD实战(12-终篇):DDD下微服务的“分分合合”及一个倡议

深清秋

DDD 软件架构 8月月更

架构实战营模块五作业

zhihai.tu

JIMDB:一个大规模分布式内存存储的演进之路_服务革新_魏星_InfoQ精选文章