去年的双十一过后,InfoQ 曾经采访过京东云平台首席架构师刘海锋。刘海锋,2013 年加入京东,担任云平台首席架构师、系统技术部负责人,主持建设存储、中间件、弹性计算等私有云技术体系。
3 月 31 日,在华为 ICT 巡展北京站的活动中,刘海锋分享了《京东基础云服务技术演进》。
基础云服务支撑着京东很多业务的发展。它可以分为三个层次,包括底层的存储服务,核心的中间件以及上层的弹性计算云,通过 API 以服务的形式支撑其他业务单元。下面我们分别来看一下。
存储是互联网公司最基础的东西。这也是开发团队花精力最多,持续迭代的一个技术方向。
挑战 1:非结构化存储
京东每天有千万级的商家上传图片,用户浏览完图片后会产生交易订单,需要很多文本来描述这些订单。另外京东有自己的库房,任何一份订单经过拆分,经过库房的流转,每一分订单又会产生几十份非结构化的数据,涉及商品的入库、出库、调拨等。商品送到客户手中之后,还有签单信息、银行小票,未来这些信息的电子化、和银行对账,又是很多非结构化的数据。
非结构化的数据越来越多,如何存储这些数据?商家的图片、交易的订单、库房的记录、电子签收的信息,这些数据都是非常关键的,而且这些数据有一个特点,量比较大,但每份数据一般都比较小。
JFS:Jingdong Filesystem
京东针对非结构化数据开发了大规模分布式存储系统 JFS(Jingdong Filesystem),支持 BLOBs/files/blocks。现在这个系统已经到了 3.0 版本,可以统一管理小的对象、大的文件以及私有云中可持久化的块设备。
技术方面,因为数据不能丢失,所以从一开始就讲究强一致的复制,使用了 Paxos 复制;在存储引擎以及各种数据模型上采用了统一的存储管理;随着规模的增大,到了几 PB 数据的时候,采用了 Reed-solomon 码来降低存储成本;元数据的管理和 Hadoop 的集成方面,目前也有不错的进展和落地的应用。
目前该系统已经在支撑京东商城的如下服务:
- 图片服务
- 订单履约
- 物流数据交换
- 电子签收
- 内部云存储服务
- 虚拟机与容器卷存储
挑战 2:越来越多的缓存
为保证快速响应,很多数据都会放到内存里,比如商品的价格,搜索推荐的结果等。越来越多的缓存,越来越多的大内存机器,不同的业务,如何管理它们也是很大的挑战。最早,很多小规模的公司可能会采用 Memcached、Redis 等,但当到了很大规模的时候,技术也会发生质变。
Jimdb:分布式缓存与高速 NoSQL
Jimdb 是京东研发的企业级 NoSQL 服务,能够统一做分布式的缓存,也能做高速的键值存储,完全兼容 Redis 的协议。与 Redis 相比,它有如下特性:
- 精确故障检测与自动切换
- RAM/SSD 混合存储
- 在线横向扩容
- 异步、同步、局部复制
- 全自动化接入与管理
其中“全自动化接入与管理”这一点是最近半年的主要工作,目的是降低维护成本。
Jimdb 在京东部署了 3000 多台机器,都是大内存 + 固态硬盘的,支撑了京东的商品详情页、搜索、推荐、广告点击等很核心数据的快速访问。
下一代新存储平台
刘海锋的团队最近在做的事情是,更多考虑多数据中心的复制,让数据更加可靠,并且希望做统一的存储服务,实现 One Jingdong One Stroage,用一个系统抽象出文件、对象、表甚至缓存,能够在分布式的多个数据中心实现统一的复制存储底层的数据,在主 IDC 做缓存,甚至全量内存加速;向上支持在线服务、Hadoop,支持私有云内部的容器卷的管理等。
底层存储的上面就是各种中间件。
挑战:越来越多的消息传递
京东跟很多互联网公司不一样的地方是,除了北京和江苏的核心机房,在全国各地还有很多商品的库房,每个库房会有几十台服务器,相当于一个小型的数据中心,消息队列不仅要串联核心机房里的业务,还要驱动库房里的订单生产环节,跟业务存在很强的依赖关系。从订单管道,到核心机房,再到仓储库房,普遍是用消息队列驱动业务流程的。日均消息数超过百亿。
JMQ:Jingdong Message Queues
面对业务挑战,京东的消息队列系统经过了三代演进,于去年双十一之前上线了 JMQ 并完成切换。
JMQ 有如下特点:
- 机房断电不丢消息
因为库房的网络环境是不稳定的,所以必须保证不丢消息。
- 组提交技术
引入了数据库中经典的 group commit 技术,提高同步刷磁盘的写的性能。
- 透明压缩
- 灵活复制
挑战:越来越多的在线服务
电商系统内有很多服务。这些服务内部会互相调用,对外也要开放一些接口,供商家或者合作伙伴使用。
JSF:Jingdong Service Framework
京东在这方面的解决方案是 JSF 。可以做到运行时服务质量分析,提供了完善的服务治理功能。目前在京东已经接入了几万台服务器,更好地支持了内部的 SOA 化以及对外的服务开放。
弹性计算云是目前的主要工作。
挑战:越来越多的机器
任何一个高速发展的互联网公司,机器数量都是在成倍增加的。随着业务规模的增长,机器的数量也在不断增加。现在就要面对这样的场景:有很多数据中心,而每个数据中心内的机器又会被划分给不同的业务,比如有的机器处理交易,有的处理订单履约,有的处理搜索,有的处理图片等等,面对这么多机器,应该怎样管理,让研发团队的效率更高呢?
弹性计算云
该项目的愿景是在 IDC 的资源和业务系统之间建立一个桥梁,让业务与机器完全解耦,做到真正自动化维护,缩短产品开发到上线的流程,让工程师的精力更多放在产品的设计和研发上,而不必关注如何申请资源、如何上线;提高资源利用率和服务质量,让研发团队的生活更美好。
从公司整体来看,希望能够提高资源的利用率。因为很多机器是分散的,由各个业务团队使用,必然有很多机器是空闲的,统一管理必然能提高资源的利用率。
弹性计算云的整体架构如下图所示,分拆两层服务。底层是基础服务,实现软件定义数据中心。通过 OpenStack 和 Docker 的结合,实现容器化。JFS 实现可靠的存储。上层是平台服务,希望通过集成部署,实现资源的统一分配,业务不用关注自己到底部署到哪台机器上,并由平台根据业务量实现自动伸缩。
现在这个系统已经在部分业务中落地,大规模落地会在今年年完成。具体而言,像商品详情页、图片系统,就是弹性计算云支撑的,用户的每一次浏览,都有这个系统在做贡献,能够按访问流量自动调度资源。在流量高峰的时候,这两个服务会自动扩容。
做为总结,刘海锋总结了两点:
1. 业务发展推动基础架构的演进;
2. 技术的关键是团队。
在演讲之后,InfoQ 采访了刘海锋。
InfoQ:最近两年,容器技术,特别是 Docker 在业界非常火,可以介绍一下京东在这方面的实践经验吗?
刘海锋:刚才我在演讲中提到,我们希望在 IDC 的资源和业务系统之间建立一个桥梁,让业务与机器完全解耦,这是一个很复杂的工程,不是一个容器或者 Docker 就能解决的。弹性计算云分为两个层面,底层的基础服务更多是把机器做一个统一的虚拟化、容器化,上层的平台服务更多地要考虑怎么样去配合京东的业务,跟应用能够更顺畅地融合在一起。
举个例子,从最简单的部署角度来说。以前部署是这样的,一打好包了,在部署界面上选,选了三个机器,三个机器的 IP 分别是多少,然后部署。部署完成检查一遍就成功了。而接下来整个系统会做成这样,一个程序要上线了,要部署,点部署,系统给部署完成之后告诉开发者成功了,然后再说部署在哪里。不需要关心之前的那些环节,不需要层层的领导审批和运营部门审批。而是直接部署,部署位置由平台来统一控制。一开始分配很少的机器,随着流量的增大自动扩容。需要的量小的话,再自动缩容,节省出的机器再统一调度。这样可以提高公司的资源利用率,数据中心中都是公司的机器,而不再分你的我的。
我们用 Docker,更多的是考虑它比较适合公司内部的私有云环境,而且比较轻量。我们底层的平台,简单的理解是 Docker 和 OpenStack 的嫁接。我们用 OpenStack 去管理 Docker,比如给它分配一个独立的 IP 等。但是除了两个第三方平台,我们的底层平台要做到简单、可控、稳定,所以上面还有一个很强大的完全自研的一套平台和服务,能够统一的调度和控制,实现管理、监控和部署。
Docker 在这里面发挥了很重要的作用。另外我们也稍微做了一些改造,去掉了很多用不到的特性,让它稳定简单。
网络方面,用 Open vSwitch 给每个 Docker 容器分配一个 IP,这样每个容器看上去跟虚拟机或者物理机没什么区别,迁移业务的时候大家更容易接受,过渡更为平滑。
InfoQ:刚才您提到了 OpenStack 和 Docker 的嫁接,可以具体介绍一下其结构吗?
刘海锋:基础服务层面,核心有三点:OpenStack、Docker 和自研的 JFS 存储。OpenStack 和 Docker 在这里都是非常重要的组件。
先说 OpenStack。因为 OpenStack 变化比较快,我们没有那么多精力一直跟随。我们从 OpenStack 拆出了一个分支,经过定制,做了一个内部的分支,叫做 Jingdong Data Center OS。这方面的工作有两点。一方面是让它能跟 Docker 更好地配合;另一方面,我们加入了很多故障处理功能,应对物理机故障和容器故障。物理机故障的时候快速检测出来,快速报警,快速迁移上面的容器。
再说 Docker。网络和存储上都有些改造,比如可以支持 JFS mount 过来的目录。我们会把故障当成常态,物理机的硬件故障,像磁盘、内存和硬件方面的问题,所以对 OpenStack 做的改造主要是更好地应对故障,快速响应。
InfoQ:Docker 或者 OpenStack 方面的工作,会向开源社区反馈吗?
刘海锋:其实我们也有考虑。我们计划在今年年底或者明年年初的时候有些动作,目前还是希望把当前的工作做好。
InfoQ:社区的版本更新比较快,这方面如何 merge 自己的特性和新版本的特性呢?
刘海锋:外面比较好的我们也会吸收。实际上 OpenStack 更多是面向公有云设计的,从我们的需求来看,它比较臃肿,不是很好控制。所以我们做了裁剪,砍掉了很多公有云的功能。
InfoQ:这个会不会像你们的文件系统那样,在定制的过程中走向自研了?
刘海锋:这是有可能的。像 Docker 这样的项目,设计的时候考虑的是更为通用的目标,功能非常多,这会引入过多的复杂性,也引入一些问题,所以要做减法。而且就互联网公司的开发团队而言,基础架构是在业务的推动下不断演进的,而不是满足某种通用的需求。
InfoQ:现在弹性计算云的落地情况如何呢?
刘海锋:现在弹性计算云已经在支撑很多业务,像图片服务。很多边缘系统也在用。根据研发战略,我们希望今年大规模落地。
InfoQ:可以介绍一下公司其他业务在向私有云迁移的过程中都有哪些挑战吗?
刘海锋:挑战很多,我们很多精力也放在这上面。我们做了一个基础设施,会面对两类用户,像新的用户和新的产品,直接选择它就可以了;但像老的服务,可能占用的是物理机,资源利用率很低。迁移其实不仅是技术层面的问题。所以我们会有专门的项目经理团队去推动。另外我们有一些工具,方便旧业务的迁移。
此外,我们还需要在保证业务稳定的前提下追求规模,因为规模大了才有资源管理方面的优势,所以我们希望做到万台规模。我们每天都很谨慎,很小心,但是还是希望量上来。
在 4 月 23 日~25 日的 QCon 北京 2015 大会上,刘海锋将担任微服务架构专题的出品人。在该专题中,京东云平台高级架构师、JSF(Jingdong Service Framework)项目的负责人李鑫将分享京东的服务化框架实战。
评论