精华内容
下载资源
问答
  • 京东中间件
    2019-10-05 23:12:53

    如何应对大促?看京东核心中间件团队的高可用实践指南

    RingBuffer
    posted on 2017-01-03 14:18  lexus 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/lexus/p/6244752.html

    更多相关内容
  • 京东jsf中间件简介!
  • 京东中间件应用实战

    2017-12-06 09:08:00
    在互联网应用研发过程中,中间件扮演着极其重要角色,因为数据存取、服务划分、消息传递、 负载均衡、DNS、CDN等等。 中间件在互联网应用开发中有着重要作用,其中以微服务、数据存取、消息队列三大中间件最 为...

           在互联网应用研发过程中,中间件扮演着极其重要角色,因为数据存取、服务划分、消息传递、

    负载均衡、DNS、CDN等等。

           中间件在互联网应用开发中有着重要作用,其中以微服务、数据存取、消息队列三大中间件最

    为重要。

           微服务,最早程序研发是一个大的整体,存在问题研发困难,困难主要表现在修改后程序容易

    导致其他模块不可用,单体程序还存在一个流量预估难题,平时还好电商大促流量突增,单体程序

    流量预估难度极大,而微服务一下子将问题简化多个量级,只要预估好每个人维护微服务程序就可

    以了。

           JD微服务是自己研发框架,与dubbo相比整个架构设计紧凑简洁,dubbo相比设计扩展性强,

    各有优劣。核心差异不大,线上有个大流量服务大促时6000万/分钟,100万qps 150台4核16G容

    器。dubbo是阿里开源好东西,对业界微服务化极大推动,感谢开源,dubbo能够支持千万级、亿

    级每分钟掉用量处理,是极其优秀框架,最近又重启更新,需要用到微服务的可以放心用起来。

           微服务本身客户端实现软负载均衡,节省大量硬件作为负载均衡使用,缺点也是有的,微服务

    横向扩展容易,纵向也能够方便分层,但尽量不能分太多层,因为每层均存在网络耗时。

           记得app首页入口图初版服务,单个容器规格4核8G内存50G硬盘,但个容器能处理请求10万/

    分钟,而且还可以加量继续压,轻轻松松完成c100k处理。

           数据存取,存储读取是应用程序永恒主题,分布式缓存redis这篇文章介绍过大型电商互联网架构中redis运用

    redis内存缓存是快,天下武功唯快不破,但是内存目前还是极其昂贵资源,分布式文件系统,Google

    大数据三架马车之一bigtable,能支撑Google搜索引擎对于网页存储与检索,感兴趣也可进行研究使用,

    遗憾是google未开源,但百度开源了分布式文件系统BFS对应HDFS、以及分布式数据库TERA对应

    bigtable,据官方公开文档查询性能在10ms以下,进行参数设置性能能到1ms。

           消息队列,消息队列在为复杂程序节藕,大公司不同部门系统、模块之间数据通讯,移动端数据上

    报等多个重要流程,均离不开他,在数据通讯传输占有核心地位。

           清晰记得新浪微博,在初期有一段时间点赞时响应极其慢,最尴尬的事还经常失败,用户体验极差,

    简直让用户抓狂,后来看到网上分享了解到是因为点赞包含多个流程,在原微博上点赞加一,在自己用

    户上增加和这条微博点赞关系,权重计算处权重加一用于微博feed分发这条用等等逻辑,再一次需要全

    走完非常慢,用消息队列节藕,点赞发消息就可以给客户端反馈成功,性能呈指数级提升,各个模块取

    消息进行消费处理进行相应操作就可以了,用户体验极大提升。

           对于数据交互通信场景,了解到大数据那块数据分两块一个是离线hive表交乎一个是读取mysql或提

    供微服务拉取数据交互,有前边这些还不够,因为又个需要及时增删改场景就需要消息队列进行处理,比

    如评论或问答用户回答质量差这时就需要,删除消息将质量差评论、问答删除掉。对了目前各大互联网

    公司用的比较多消息队列是Kafka以及ActiveMQ。

           数据上报场景,移动时代数据点击、浏览、GMV、转化率等各个指标都离不开数据埋点上报,个性

    化推荐系统特征工程中数据汇总上报也离不开消息队列,上报流程一般是Storm实施消费消息数据落到大

    数据HDFS、HBase等。这个过程中消息队列都是必不可少的。

           互联网公司中间件占有重要地位,对于应用快速开发,数据稳定访问,数据上报等,服务高性能、高

    可用发挥着重要作用。中间件之中又以服务划分、服务治理,数据存取,消息队列中间件最为重要。

            其他中间件,例如JD本身有自己研发UMP能方便监控应用性能、可用率、容器cpu、内存、线程等多

    个指标,开源比如性能监控有大众点评CAT。再有智能DNS、CDN、负载均衡lvs、haproxy等等中间件也

    在互联网架构中发挥这重要作用。

            容器本身在JD也发挥着重要作用,线上服务100%在容器中,大数据spark那些据了解也在容器化进行

    中。以docker代表容器化技术,cpu、内存隔离性好,网络吞吐也极高,是一种极其优秀技术。

           docker目前存在问题,大促时有些个别机器,它的服务cpu、内存占用过高影响其他容器里面服务,这

    种情况备战期间要仔细观察,尽量和负载高应用避开,这种问题个人看到占比极其小,容器技术在互联网公

    司目前发挥着重要作用。

            写出来记录一下,一是为后续查找方便,另外如果对读者如果遇到相应问题正在一筹莫展,文章如果能

    带来一些启发那就更好了。

          扫码关注公众号

    转载于:https://www.cnblogs.com/freedommovie/p/7990987.html

    展开全文
  • 每次大促都是考验各电商架构的最好时机,然而一般电商大促时,我们可能更关注系统架构如何降级如何限流等经典手段。这次换个视角,中间件在《京东技术解密》一书中被京东喻为大促通天...

    每次大促都是考验各电商架构的最好时机,然而一般电商大促时,我们可能更关注系统架构如何降级如何限流等经典手段。这次换个视角,中间件在《京东技术解密》一书中被京东喻为大促通天塔,而京东作为中国互联网电商主角之一,我们看看中间件技术如何撑起京东每一场大促的。

    2016年12月2日-3日,ArchSummit全球架构师峰会将在北京国际会议中心举行。本次大会设置了《电商专题:系统架构如何应对业务爆发式增长》和《阿里双11技术架构突破》专题来深入解读双11等大促背后的技术故事,其中邀请了京东商城中间件负责人何小锋老师前来分享《京东核心中间件是如何支撑业务快速发展》,我们借此机会采访了何小锋老师,他为我们带来有关中间件的演进思路,希望可以为大家带来启发,如果读者想了解更多京东中间件的技术细节,欢迎报名参加ArchSummit北京站并与何小锋老师进一步交流。

    受访嘉宾

    何小锋

    京东商城中间件负责人,拥有18年的研发经验,喜欢技术,追求卓越。2011年加入京东,目前在京东商城负责中间件技术部门。入职京东后,担任了京东两届架构委员会常委,先后带领团队自主研发高性能的消息平台,落地基于Docker的国内最大的弹性云。在京东期间支持过多次的618和双11大促,见证了京东的技术演进过程,在弹性计算、中间件、大并发分布式系统等方面积累了丰富的实战经验。

    InfoQ:您拥有18年的研发经验,能否介绍这段时间自己的程序员经历?是否面临过几次关键选择?

    何小锋:18年,一直没有脱离Coding,积累了很多的系统架构经验,在2011年加入京东,被京东面临的技术挑战所吸引。整个coding生涯中有过2次关键选择:

    1. 从传统的电子政务行业转到互联网行业;

    2. 选择了京东,给自己一个挑战发挥的平台。

    由于自己很喜欢技术,而且喜欢中间件、高并发分布式和弹性计算这三大领域本身带来的技术挑战,目前这些技术已经是公司的核心支撑系统,是京东抗大流量的关键。

    另外这几大领域需要掌握软件、操作系统、硬件和网络等多方面的知识才能更上一层楼,并且有很多需要专研的地方,需要长时间的专注才能做好。

    InfoQ:中间件技术部门承担了怎样的任务和职责?落地基于Docker的弹性云给部门带来怎样的影响?

    何小锋:中间件技术部门承担中间件研发和运维支持工作,确保现有系统稳定,持续优化满足业务需求,跟进业界技术发展,孵化新的中间件产品解决业务问题。

    目前京东中间件最核心的3大产品如下:

    1. JSF,自主研发高性能分布式的RPC微服务框架,是京东服务化、开放化的技术标准;

    2. JIMDB,自主研发高性能分布式的缓存,基于Docker架构,具有弹性伸缩、快速故障迁移等能力;

    3. JMQ,自主研发的高性能分布式的消息队列

    弹性云落地对中间件研发架构有很大的促进,JIMDB基于Docker实现弹性伸缩能力。另外中间件还要适应容器的环境,如准确获取CPU数量便于控制线程数,避免频繁的线程切换。流量均匀也是后续要改善的方向,容器的规格小,前后申请不一致,物理机硬件配置不一样,造成每个实例的承载能力不一样,需要中间件能自动负载均匀。

    InfoQ:目前京东微服务框架JSF调用规模在日常和大促时分别处于什么量级,JSF的主要核心部件如何实现高可用?

    何小锋:JSF日常调用在千亿规模,大促期间会翻2-5倍。 

    0?wx_fmt=png

    实现高可用方面,以注册中心为例,注册中心以异步持久化到数据库中,通过本地全量缓存来提升性能,节点直接通过事件总线同步,可以做到横向扩容。如果数据库宕机,可以通过缓存继续提供读取服务。

    另外每个机房都会部署若干节点,客户端通过目录服务优先拿到本机房的注册中心节点列表,后续通过定时更新注册中心列表。

    当服务有变化的时候,注册中心回调客户端,推送变化给客户端,客户端会在内存中缓存一份服务地址,在本地会存储一些备份文件。如果注册中心连接不上,客户端可以依赖本地缓存继续调用。

    监控中心提供的是JSF服务,数据直接通过ES存储。

    实现高可用过程中为了深挖单实例性能,我们做了优化序列化协议,传输数据进行压缩,并且通过RingBuffer进行组提交,采用NIO/EPOLL,优化线程模型,提升并发能力。

    InfoQ:JSF目前是否还存在瓶颈?

    何小锋:JSF到目前已经很成熟,性能、稳定性和易用性都很高。

    JSF提供了强大的服务治理功能,包括常见的分组、上下线、黑白名单、路由等,也做到了例如动态分组、同机房优先、配置下发、调用限流、授权调用等等功能,并且开放了部分服务治理API,供开发者自行调用。

    JSF未来会持续在治理和监控上进行改进,完善分布式跟踪,便于快速定位问题。另外HTTP网关会通过支持HTTP/2协议来优化性能。

    InfoQ:目前京东消息中间件从开源软件的JQ、ActiveMQ发展到自研的JMQ,能否简述这段演进过程?基于怎样的判断和背景会开始对下一代的筹备?

    何小锋:JQ严格意义上来说还算不上一个消息中间件,它基于数据库实现,当时的用户也比较少。

    随着公司SOA化工作开展,迫切需要成熟的高可用消息中间件来支持,我们采用开源的ActiveMQ来作为第一代分布式消息平台。在其基础上做了一系列的平台化改造,包括应用治理、监控报警、分布式客户端、归档、重试、存储复制,我们对这些功能也进行了优化和更新。

    随着业务量的快速增长,它的性能成了很大的瓶颈,存储逻辑复杂,消息积压后对性能影响很大,已经很难进行优化。通过积累的研发和运营经验,我们决定自助研发JMQ。JMQ在存储、网络通信、消息处理、数据复制等方面进行了很大的优化改进。另外在升级的过程中,考虑了兼容性,例如JMQ兼容AMQ客户端协议,做到了平滑过渡。

    为什么没有一步到位?每一代消息中间件都是基于业务的发展需要的,京东这些年发展之快,业务又有其不确定性,所以我们在这过程中也是不断的探索,不断的重构。

    至于何时开始下一代消息中间件的筹备,我们会主要基于高可用、性能和自动化运维瓶颈等方面考量。JMQ我们目前正在做兼容Kafka协议,大幅提升自动化运维能力,减少备战工作。

    InfoQ:以您的判断来看,互联网企业是否会逐渐摆脱开源软件的依赖,走向自主研发以获得彻底的掌控力?

    何小锋:这个是根据业务发展的需要的,成熟稳定的开源系统还会持续支撑,满足不了需求的开源软件会逐步被自研替换。我的建议是控制好收益,加强内外交流,最后要回馈开源社区。

    InfoQ:JMQ在大促时能处理多少的写入、投递高峰?后端消费不稳定的情况下如何保证消息投放稳定?

    何小锋:JMQ在大促时单个分片同步复制和刷到磁盘,能达到写入1K消息,TPS可以超过4万每秒。针对日志等场景,通过配置异步复制和刷盘还可以大幅度提升性能。我们预计整个平台,双11当天消息投递量会达到千亿规模。

    消费者采用拉模型,处理速度完全由消费者控制,如果处理速度慢,消息会保留在服务端,保留时间为2天。由于大促的需要,每个系统都会进行大流量压测军演,不会存在2天都消费不了的消息。

    JMQ的存储模型,消息积压在服务端,对写入和消费性能没有影响。积压了会给用户进行报警,如果存储空间不够了,会停用当前实例的写入,进行扩容。

    InfoQ:能否谈谈在大促期间中间件团队所做的工作?在接下来的大促会做哪些准备和调整?以前的大促遇到过哪些问题以及应对方案?

    何小锋:中间件会成立专门的项目来推荐大促的备战工作,主要包括如下几块工作

    1. 系统梳理工作:整理现有部署架构,核心客户,每日巡检;

    2. 部署扩容:资源评估、核心客户扩容、容灾部署;

    3. 应急预案:整理和评估应急预案;

    4. 压测演练:模拟故障演练,性能压测;

    5. 对发现的问题就改进优化;

    6. 24小时值班监控

    每次大促发现的问题都会作为后续研发改进的需求,例如AMQ性能不好,后续自研JMQ。

    面对以后的大促,我们会大幅提升自动化运维来满足大促的需求,包括弹性扩容,更丰富的监控报警,更迅速可控的故障切换、自动化容灾、核心客户物理隔离等等。

    另外随着业务的发展,如何更好地支持业务海量数据缓存需求,我们也在规划新版的JIMDB。

    InfoQ:能否简单概述自动扩容缩容中数据迁移的技术原理?中间件实现快速故障切换和弹性伸缩能力的难点在哪里,最后如何解决的?

    何小锋:JIMDB提供基于Docker的弹性伸缩能力。目前JIMDB一个分片有2G内存数据,当需要迁移时,节点会先把已有的数据按照一定的规则全量复制一份到新的shard上,在全量复制过程中会有增量的数据产生,这部分数据另外保存一份到指定的缓冲区中,当全量复制完成后马上同步缓冲区中的数据,当缓存区中需要同步的数据比较少时,会阻塞待分裂节点的写入直到增量数据也同步完成。

    快速故障切换和弹性伸缩能力的难点主要如下:

    1.准确及时的故障定位,包括软件宕机、网络、硬件等方面的故障。我们通过Agent秒级采集监控数据,对新出现的故障通过录入关键词来自动学习,宕机/网络不通则采用多个决策者投票决定。

    2.资源的合理调度,包括容灾,确保资源调度均匀、并发控制,核心业务做到隔离,相关的具体实践有:

    • 应用接入的时候要完善信息,能识别是否是核心业务,是否需要隔离,业务的吞吐量需求等等;

    • 通过资源标签来匹配满足业务的资源;

    • 通过识别机房、机架信息来满足容灾的需求;

    • 通过资源乐观锁来实现对相同资源的并发控制;

    InfoQ:感谢何小锋老师接受我们的采访,期待您在ArchSummit全球架构师峰会分享的《京东核心中间件是如何支撑业务快速发展》。

    在本次ArchSummit全球架构师峰会北京站,设置了《电商专题:系统架构如何应对业务爆发式增长》和《阿里双11技术架构突破》专题,来深入解读双11等大促背后的技术故事,大会将于2016年12月2日-3日在北京国际会议中心召开,欢迎关注。详情请戳阅读原文

    0?wx_fmt=jpeg

    细说云计算

    ID:CloudNote

    640?wx_fmt=jpeg▲长按二维码识别关注

    探讨云计算的一切,

    有干货,也有闲聊。

    展开全文
  • 京东弹性数据库中间件-JED.pdf 综合介绍京东数据库中间件
  • 京东弹性数据库中间件JED.rar,京东弹性数据库中间件JED.pdf
  • 京东弹性数据库中间件JED介绍.pptx
  • 京东弹性数据库中间件JED介绍.pdf
  • JDTX 是由京东数科的数据研发团队倾力打造的分布式事务中间件。本次分享是 JDTX 首次公开出现在大众视野面前,分享内容涵盖 JDTX 的核心设计理念及相关的技术实现难点,希望能为打造分布式事务解决方案的团队提供...

    在分布式数据库、云原生数据库、NewSQL 等名词在数据库领域层出不穷的当今,变革——在这个相对稳定的领域已愈加不可避免。相比于完全革新,渐进式增强的方案在拥有厚重沉淀的行业则更受青睐。

    同所有分布式领域的解决方案相同,分而治之的透明化数据分片方案,是新一代数据库解决海量数据的核心理念。水平拆分使得分布式事务的重要性,较之垂直拆分的业务系统进一步提升。另外,弹性扩(缩)容、HTAP 等概念也是新一代数据库的关注重点。京东数科开源的 Apache ShardingSphere 在数据分片方面已逐渐成熟,在此场景之上开发的分布式事务中间件 JDTX 与之共同组成了分布式数据库的内核拼图。

    JDTX 是由京东数科的数据研发团队倾力打造的分布式事务中间件。本次分享是 JDTX 首次公开出现在大众视野面前,分享内容涵盖 JDTX 的核心设计理念及相关的技术实现难点,希望能为打造分布式事务解决方案的团队提供一些思路。

    背景

    数据库事务需要满足 ACID(原子性、一致性、隔离性、持久性)4 个特性。

    在单一数据节点中,事务仅限于对单一数据库资源的访问控制,称之为本地事务。几乎所有的成熟的关系型数据库都提供了对本地事务的原生支持。但是在基于微服务的分布式应用环境下,越来越多的应用场景要求对多个服务的访问及其相对应的多个数据库资源能纳入到同一个事务当中,分布式事务应运而生。

    关系型数据库虽然对本地事务提供了完美的 ACID 原生支持。但在分布式的场景下,它却成为系统性能的桎梏。如何让数据库在分布式场景下满足 ACID 的特性或找寻相应的替代方案,是分布式事务的重点工作。

    本地事务

    在不开启任何分布式事务管理器的前提下,让每个数据节点各自管理自己的事务。它们之间没有协调以及通信的能力,也并不互相知晓其他数据节点事务的成功与否。本地事务在性能方面无任何损耗,但在强一致性以及最终一致性方面则力不从心。

    两阶段提交

    XA 协议最早的分布式事务模型是由 X/Open 国际联盟提出的 X/Open Distributed Transaction Processing(DTP)模型,简称 XA 协议。

    基于 XA 协议实现的分布式事务对业务侵入很小。它最大的优势就是对使用方透明,用户可以像使用本地事务一样使用基于 XA 协议的分布式事务。XA 协议能够严格保障事务 ACID 特性。

    严格保障事务 ACID 特性是一把双刃剑。事务执行在过程中需要将所需资源全部锁定,它更加适用于执行时间确定的短事务。对于长事务来说,整个事务进行期间对数据的独占,将导致对热点数据依赖的业务系统并发性能衰退明显。因此,在高并发的性能至上场景中,基于 XA 协议两阶段提交类型的分布式事务并不是最佳选择。

    柔性事务

    如果将实现了 ACID 的事务要素的事务称为刚性事务的话,那么基于 BASE 事务要素的事务则称为柔性事务。BASE 是基本可用、柔性状态和最终一致性这 3 个要素的缩写。

    在 ACID 事务中对一致性和隔离性的要求很高,在事务执行过程中,必须将所有的资源占用。柔性事务的理念则是通过业务逻辑将互斥锁操作从资源层面上移至业务层面。通过放宽对强一致性和隔离性的要求,只要求当整个事务最终结束的时候,数据是一致的。而在事务执行期间,任何读取操作得到的数据都有可能被改变。这种弱一致性的设计可以用来换取系统吞吐量的提升。Saga 和 TCC 都是典型的柔性事务实现方案。

    结论

    基于 ACID 的两阶段事务和基于 BASE 的最终一致性事务都不是银弹,可通过下表详细对比它们之间的区别。


    两阶段提交柔性事务
    业务改造实现相关接口
    一致性支持最终一致
    隔离性支持业务方保证
    并发性能严重衰退略微衰退
    适合场景短事务 & 低并发长事务 & 高并发

    缺乏并发度保障的两阶段事务不能称之为完善的分布式事务解决方案;而缺乏对 ACID 原义支持的柔性事务都甚至不能称之为数据库事务,它更适合服务层的事务处理。

    放眼当前,实难找到无需权衡即可放之四海而皆准的分布式事务解决方案。

    JDTX 的分布式事务解决方案

    JDTX 的设计目标是强一致(支持 ACID 的事务原义)、高性能(甚至强于本地事务)、1PC(完全摒弃两阶段提交和两阶段锁)的完全分布式事务中间件,目前可用于关系型数据库。它采用完全开放 SPI 的设计方式,提供与 NoSQL 对接的可能,能够将多元异构数据维持在同一事务中。

    设计理念

    首先通过一张架构图来直观的了解一下 JDTX 的构成。

    640?wx_fmt=png

    JDTX 由事务管理器(TM)和资源管理器(RM)组成。

    事务管理器用于生成全局单调递增的事务日志序列号(LSN),事务的提交和回滚等核心流程处理,以及未提交事务的本地元祖(Tuple)持有。

    资源管理器用于管理活跃事务数据。JDTX 的设计特点是将在事务中的数据(称之为活跃数据)和不在事务中的数据(称之为落盘数据)分离。活跃数据在落盘至预写日志系统(WAL)之后,并将数据保存至自研的多版本快照(MVCC)内存引擎中。落盘数据则是通过异步刷盘的方式,将 MVCC 引擎中的数据以流量可控的方式同步至最终的存储介质中(如:关系型数据库)。

    事务内查询会将落盘数据和活跃数据合并,并根据当前事务的隔离级别获取出符合当前事务可见性的数据版本。

    方案亮点

    无损事务方案

    JDTX 采用 WAL + MVCC 引擎的方式实现了事务的 ACID 原义。

    原子性 & 一致性支持

    JDTX 的 MVCC 引擎可以看做是一个集中式缓存,可以将两阶段提交简化至一阶段提交。维持单一节点中数据的原子性和一致性,即将分布式事务的范畴缩减到本地事务的范畴。

    MVCC 引擎可以通过分片 + 主从同步的方式维持水平扩展和高可用的能力。JDTX 保证所有对事务数据的访问都通过 MVCC 引擎的活跃数据 + 最终数据端的落盘数据的合并的方式,以保证数据的原子性和一致性。

    隔离性支持

    JDTX 以多版本快照的方式实现事务隔离性。目前完整的支持 4 种标准隔离级别中的读已提交和可重复读,已经可以满足绝大部分需求。

    持久性支持

    JDTX 将事务的活跃数据在存入 MVCC 引擎之前先落盘至 WAL 引擎,以保证服务器崩溃,内存数据丢失时,活跃数据依然能够从 WAL 引擎中完全恢复。

    高性能

    JDTX 采用将活跃数据异步刷盘至数据库的方式极大的提高了数据写入的性能上限。它的性能瓶颈从数据库写入耗时转移到了落盘至 WAL 引擎和存储至 MVCC 引擎的耗时。

    与数据库的 WAL 系统类似,JDTX 的 WAL 也采用日志顺序追加的方式,因此可以简单的理解为 JDTX 的 WAL 耗时 = 数据库系统的 WAL 耗时。而 MVCC 缓存则采用哈希数据结构,其写入耗时小于需要维护 BTree 索引的数据库写入耗时。因此,采用 JDTX 的事务方案,其数据更新性能甚至强于不开启事务。

    另外,JDTX 采取了无 UNDO 日志的事务回滚策略。未提交的数据并不会进入 MVCC 引擎,而是被事务管理器本地持有。因此,只要清理掉未提交数据即可完成事务回滚。无 UNDO 日志的设计进一步的提升了事务处理的性能。

    高可用

    WAL 引擎和 MVCC 引擎均采用分片 + 主备的方式,以保证 JDTX 不会产生单点故障。在 MVCC 引擎完全不可用的情况下,可通过恢复模式将 WAL 中的数据同步至数据库,以保证数据的完整性。

    跨多元数据库事务

    JDTX 将事务活跃数据和落盘数据分离的设计方案,使其落盘数据存储端无任何限制。所有的事务活跃数据都会通过异步的落盘执行器存储至后端数据库,因此后端是否为同构数据库,其实并无影响。

    使用 JDTX 能够保证跨多元存储端(如:MySQL、PostgreSQL 甚至是 MongoDB、Redis 等 NoSQL)的分布式事务维持在同一事务语义之中。

    实现难点

    MVCC 内核

    事务隔离级别有两种常见的实现方案,即锁实现和 MVCC 实现。除了 Infomix 等少数数据库,大部分关系型数据库均采用 MVCC 实现。

    读未提交、读已提交、可重复读和可序列化这 4 种事务隔离级别的标准,是 ANSI 所定义的基于锁实现的方式。事务的并行度随着隔离级别的增加而衰减,除了并发度最低的可序列化,其他隔离级别都伴随着对一致性的权衡和牺牲。

    下表是基于锁实现的隔离级别对照表。

    隔离级别脏读不可重复读幻读
    读未提交可能可能可能
    读已提交不可能可能可能
    可重复读不可能不可能可能
    可序列化不可能不可能不可能

    通过 MVCC 实现的隔离级别实际上只有 SI(快照隔离)和 SSI(可序列化快照隔离)这 2 种。SI 和 SSI 与 ANSI 的 4 种隔离级别并不能完全对照。其中的读未提交,与读已提交在 MVCC 的实现中性能并无差别,可以忽略不计。因此 SI 可以对应为读已提交和可重复读这 2 种隔离级别。实际上,即使是幻读,在 SI 隔离级别中也是不会出现的。

    由于快照并发控制并不能真正意义上保证事务是“可串行化”的,所以事务间的并发操作依旧有可能引发数据异常现象。但这里的异常不同于之前提到的脏读、丢失更新的异常,而是一种业务数据间逻辑语义层面的异常,也可以说是由于未能满足数据间的语义约束而产生的异常。这被称之为写偏序(Write skew),它的检测可依据并发事务间读写依赖的多版本可串行化图(The multiversion serialization graph)来实现,即 SSI 隔离级别。

    下表是基于 MVCC 实现的隔离级别对照表。

    隔离级别脏读不可重复读幻读写偏序
    读未提交无需实现无需实现无需实现无需实现
    读已提交不可能可能可能可能
    可重复读不可能不可能不可能可能
    可序列化不可能不可能不可能不可能

    自研 MVCC 引擎是 JDTX 的主要难点之一。JDTX 采用与 PostgreSQL 类似的 MVCC 实现方案,通过 xmin 和 xmax 标记事务快照范围,并在 MVCC 引擎中保存每个数据元祖(Tuple)的 xmin 和 xmax 的事务信息。同一数据的多版本以链表的数据结构存储,通过其 xmin 和 xmax 来获取数据的版本在当前事务快照中的可见性。

    由于 MySQL 也并未实现 SSI 隔离级别,因此目前的 JDTX 只是实现了 SI 隔离级别,还并未实现 SSI 隔离级别。

    MVCC 数据的清理(vacuum)是另一技术难点。过长的事务会导致 MVCC 版本过多,导致占用大量存储空间。尤其是 JDTX 是通过内存来存储 MVCC 的活跃数据,因此对内存空间的释放则更加敏感。由于 JDTX 的异步落盘机制,因此除了 MVCC 标准的垃圾回收逻辑之外,判断数据是否落盘成为清理逻辑的额外规则。

    SQL 查询引擎

    通过 SQL 查询事务的活跃数据,是 JDTX 的另一个技术实现难点。MVCC 引擎并非关系型数据库,并不能通过识别 SQL 来查询相关数据。JDTX 则通过之前 Apache ShardingSphere 所积累的 SQL 解析模块及其抽象语法树(AST)来实现对 SQL 的理解,以及查询基于内存的 MVCC 引擎中的数据。

    对于 SPJ(select-project-join)的 OLTP 类型 SQL,可以从 SQL 的查询结果中获取数据主键。JDTX 将落盘数据从后端数据库中取出作为最终展现数据的基础,并在此之上从 MVCC 引擎中查询出当前事务可见的活跃数据,并对其结果进行归并。换句话说,每次事务内查询都是由落盘数据 + 活跃数据归并而成。归并引擎部分参照了 LSM Tree 的设计思想。

    对于非 SPJ 的 OLAP 类型 SQL,JDTX 则采用另外的查询方式。基于聚合函数和分组的 SQL 无法通过主键直接将后端数据库中的落盘数据和 MVCC 引擎中的键值数据直接匹配,因此采用以 MVCC 引擎中数据为主,并将 SQL 改写为剔除活跃数据主键的新 SQL,再从后端数据库中查询无重复的聚合数据进行归并。

    使用限制

    分布式无银弹,这是架构师们对现有的分布式系统比较公认的看法。虽然 JDTX 具备了很多优点,但仍然有一些使用限制。它的使用限制主要有以下 3 点。

    1. 需要通过 JDTX 访问数据库。JDTX 通过其 MVCC 引擎控制事务的原子性、一致性和隔离性,并通过 WAL 控制事务的持久性。因此在使用 JDTX 的系统中,跨过事务中间件直接查询数据库,是得不到正确的事务数据的,修改数据库则会导致数据紊乱。

    2. SQL 支持需要持续完善。查询 MVCC 引擎的 SQL 方言兼容则需要持续提升。相对于无损的 ACID 事务原义支持所带来的优势,SQL 兼容度的下降,是 JDTX 带来的权衡。

    3. 不支持无主键数据。JDTX 需要通过主键来合并 MVCC 引擎和数据库中的数据。因此无法处理没有主键的记录。

    JDTX 与 Apache ShardingSphere

    通过 Apache ShardingSphere 提供的 JDBC 接入端,可以使 JDTX 无缝的对接至 Java 应用。除了 JDBC 接入端,Apache ShardingSphere 也提供了基于 MySQL 和 PostgreSQL 的 Proxy 接入端,使 JDTX 像一个单独的数据库一样提供分布式事务的服务。Apache ShardingSphere 将在未来将接入端剥离,使 JDTX 独立使用成为可能。

    Apache ShardingSphere 提供了分布式事务的统一 SPI。JDTX 通过实现 ShardingSphere 提供的 SPI,可以很轻松的融入 Apache ShardingSphere 生态。结合 Apache ShardingSphere 与 JDTX,可以将数据分片与分布式事务无缝结合。

    独立使用 Apache ShardingSphere 或 JDTX,可以灵活解耦,高度定制,可以看做是基础组件的乐高积木。而将其联合使用,则能够产生化学变化,甚至使它们具备组成分布式数据库基础设施的能力。架设在产品最前端的 Apache ShardingSphere 用于 SQL 解析、数据库协议和数据分片;位于中层的 JDTX 用于通过键值对和 MVCC 的方式处理事务活跃数据;最底层的数据库则仅作为最终的数据存储端。下图是 ShardingSphere + JDTX 的架构图。

    640?wx_fmt=png

    最后附上 MySQL 架构图,请读者自行体会其相似之处。

    640?wx_fmt=png

    JDTX 的后续规划

    JDTX 的自身目标是力争将其打造成为一个分布式事务的标准解决方案。在事务核心流程、MVCC 引擎、WAL 引擎、高可用等核心功能打磨成熟后,JDTX 会将主要精力投放在以下几个方面:

    1. 提升 SQL 语句兼容性以及多元数据库支持;

    2. 实现 SSI 隔离级别,提供完整的 MVCC 隔离级别解决方案;

    3. 完善管理端和监控端。

    除了 JDTX 中间件自身,它也将与 ShardingSphere 等其他数据库中间件更加一体化的提供分布式数据库级别的服务;并将与 Kubernetes 等云原生平台更加深度整合,为云原生数据库提供服务。

    作者介绍

    张亮,京东数科数据研发负责人, Apache ShardingSphere 发起人 & PPMC,JDTX 负责人。

    热爱开源,主导开源项目 ShardingSphere(原名 Sharding-JDBC) 和 Elastic-Job。擅长以 Java 为主分布式架构,推崇优雅代码,对如何写出具有展现力的代码有较多研究。

    目前主要精力投入在将 ShardingSphere 和 JDTX 打造为业界一流的金融级数据解决方案之上。ShardingSphere 已经进入 Apache 孵化器,是京东集团首个进入 Apache 基金会的开源项目,也是 Apache 基金会首个分布式数据库中间件。

    GitHub: https://github.com/terrymanu , 随时欢迎技术交流和指正。

    展开全文
  • 基础架构部 目录 1 发展历程 2 功能特性 3 整体架构 4 实现细节 5 使用情况 发展历程 诸侯混战->MySQL->Jproxy->JED Part 1 MySQL JED 2011 2015 2014 2017 MySQL JProxy PostGre Oracle SqlServer 功能特性 解决了...
  • 京东消息中间件的演进

    千次阅读 2017-01-13 19:34:27
     本文将简单介绍下京东消息中间件的演进历程。以及作为消息中间件在每一代产品中我们是如何解决MQ面临的一些通用问题,比如:如何处理IO,消息如何存储,消息如何路由等等。 我们在开始之前要明确一些基本概念:...
  • 京东消息中间件JMQ

    千次阅读 2017-01-13 19:37:03
    JMQ是京东自主研发的一款消息中间件系统,具有高可用、数据高可靠等特性。广泛应用于公司内部系统,包括订单、支付、库房等场景。整体结构 系统包括服务端、客户端、管理端与其他支撑模块。 ...
  • 逻辑库(schema) 通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以 数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库 逻辑表(table) 逻辑表,可以是数据切分后...
  • 1.如何解决IO问题?JMQ没有采用AMQ通过自己开发重复造轮子的方式解决IO问题,而是使用了Netty4.0,此框架开源,支持epoll,编程模型相对简单。这在一定程度上减少了服务端的开发工作,也降低了服务端的复杂度。...
  • 消息中间件jmq,分布式消息队列 主要目的:系统解耦,异步化操作。接入量很大,包括订单,下单,支付,订单生产和配送。等2500+个应用。双11的吞吐量达750亿,队列数量有9000. 架构: 最基本的是Docker...
  • 比较两个非常流行的开源分布式数据库中间件:Mycat 和 ShardingSphere(包括 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar 3 款产品)。另外还有一个增强版的Mycat:DBLE(专注于 MySQL) 。
  • 丁俊,有10年工作经验,目前就职于京东商城云平台,为消息中间件研发小组leader,主要负责公司内部高性能、高可用消息中间件的架构。 转载于:https://my.oschina.net/javahongxi/blog/1523869
  • 京东金融分布式数据中间件CDS

    千次阅读 2016-11-23 11:24:17
    作者:王义林,任职于京东金融,负责数据库中间件研发工作。在职期间带领CDS研发团队推出了多项数据库相关的产品,包括CDS分库分表中间件、作业平台、离线数据中心等产品。 本文为《程序员》原创文章,未经允许...
  • Apache ShardingSphere核心功能&接入端 Apache ShardingSphere京东落地实战 Apache ShardingSphere迭代&规划 一、Apache ShardingSphere 生态圈简介 Apache ShardingSphere是一款开源的分布式数据库中间件组成的生态...
  • 2011年加入京东,目前在京东商城负责中间件技术部门。入职京东后,担任了京东两届架构委员会常委,先后带领团队自主研发高性能的消息平台,落地基于Docker的国内最大的弹性云。在京东期间支持过多次的618和双11大促...
  • [COPY] 京东消息中间件JMQ

    千次阅读 2016-10-14 10:20:15
    JMQ是京东自主研发的一款消息中间件系统,具有高可用、数据高可靠等特性。广泛应用于公司内部系统,包括订单、支付、库房等场景。 整体结构  系统包括服务端、客户端、管理端与其他支撑模块。    ...
  • 京东hotkey框架(JD-hotkey)是京东app后台研发的一款高性能热数据探测中间件,用来实时探测出系统的热数据,并将热数据毫秒内推送至系统的业务集群服务器的JVM内存。以下统称为"热key"。 该框架主要用于对任意突发...
  • 云妹导读:不知不觉【云原生在京东】已经进行了两期,在先前《云原生在京东丨揭秘五大云原生项目在京东的落地实践》和《云原生在京东丨最适合云原生的分布式存储平台——ChubaoFS》中,我们分...
  • 京东数科开源的 Apache ShardingSphere 在数据分片方面已逐渐成熟,在此场景之上开发的分布式事务中间件 JDTX 与之共同组成了分布式数据库的内核拼图。 JDTX 是由京东数科的数据研发团队倾力打造的分布式事务中间件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,560
精华内容 4,224
关键字:

京东中间件