博威---云架构决胜云计算

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3484|回复: 3

12306是如何实现高流量高并发的关键技术

[复制链接]
发表于 2015-6-8 15:17:31 | 显示全部楼层 |阅读模式
12306是如何实现高流量高并发的关键技术

\

  12306网站曾被认为是“全球最忙碌的网站”,在应对高并发访问处理方面,曾备受网民诟病。因此记者在第一时间联系到一位对12306改造非常关注的技术架构师,他从技术的角度,用科学论证的方式,指出原因所在,并根据他的经验进一步说明12306是如何实现高流量高并发的关键技术,与大家共享。以下为正文:

  前言:

  12306互联网售票系统在2011年下半年开始上线使用,但在2012年春运期间引发无数的争议。在2012年春运后,12306项目承接单位与多家IT公司联系,经过多次论证和POC 测试, 最终引入分布式内存运算数据管理云平台 - Pivotal Gemfire做试点,用以提高12306系统性能,解决“高流量和高并发“的难题。

  高流量高并发是指某特定时间段的海量请求,根据过去的经验法则,高并发是指访问流量是平常流量的 3-5倍;但由于互联网和移动设备apps的普遍化,电商网站的促销模式“11.11“,或是厂商的“饥饿营销“,都会衍生“秒杀“现象。所以过去的经验法则用到12306春运售票系统,往往是远远低于实际的的流量。例如,12306平常一天的PV(page views)值大约是在 2500万到 3000万左右, 在2015年春运高峰日的PV值是297亿,流量增加1000倍,这样海量的请求,假如不能在短时间内动态调整网络带宽或增加服务器数量,就会造成网络阻塞或是服务器性能无法满足要求,甚至使整个系统不稳定。

  12306成长之路

  短短的3年,从2012年春运到2015年春运,12306网站从10亿的PV(page views)值增加到297亿PV值,PV值成长 30倍;网络带宽从 1.5G调整到12G,带宽成长8倍;而12306的售票量从110万增加到564万 ,成长5倍。出票处理能力从 每秒200张提升到 每秒1032张,也是5倍的成长。

  PV值的增加是与放票的次数和可出售的票量有关系,例如,2015年PV值是2014年的2.3倍, 原因是放票次数多了5次“秒杀”,另外增加12% 的售票量。由此可见,互联网流量PV值的增加速度远远高于售票量增加的速度。

\

  高流量除了代表网络容易造成阻塞以外,系统服务器也会面临更高的CPU负载,在此情况下又该如何应对呢?是选择基于原来系统框架上购买更昂贵的硬件做“scale up“升级呢 ?还是选择购买低成本的x86服务器,进行”可扩展云平台架构“ scale out的改造设计呢?12306互联网购票系统的改造给我们一个很好的案例参考,也让政府单位和企业进一步了解了具体是如何实现的。

  12306改造的关键技术– 建立可伸缩扩展的云应用平台

  2015年12306网站顺利过关,没有“瘫痪”,是值得庆祝的。根据互联网上的新闻,中国铁道科学研究院电子计算技术研究所副所长,12306网站技术负责人朱建生说,为了应对2015年春运售票高峰,该网站采取5项措施:一是利用外部云计算资源分担系统查询业务,可根据高峰期业务量的增长按需及时扩充。二是通过双中心运行的架构,系统内部处理容量扩充一倍,可靠性得到有效保证。三是对系统的互联网接入带宽进行扩容,并可根据流量情况快速调整,保证高峰时段旅客顺畅访问网站。四是防范恶意抢票,通过技术手段屏蔽抢票软件产生的恶意流量,保证网站健康运行,维护互联网售票秩序。五是制定了多套应急预案,以应对突发情况。

  “利用云计算资源“,“按需及时扩充“和”快速调整“,这几个字眼是12306改造的精神,其核心就是要建立一个从下到上全面“可伸缩扩展的云平台”。底层的硬件架构要支持可伸缩扩展,上层的应用系统架构也需要支持可伸缩扩展。

  1. 在过去数年,云计算的基础架构虚拟化已经非常成熟,也日益普遍部署;当网络阻塞时,可以动态增加带宽,当服务器 CPU到达高位时,可以快速从资源池获取虚拟机资源来分摊负荷。 “软件定义的数据中心“ 可以轻易完成这些伸缩性扩展的配置。

  2. 当客户将底层的架构都虚拟化后,网络设备,Web服务器,应用服务器都可以做“伸缩性”的扩展;但遇到一个难点就是“12306的应用系统框架”无法支持可伸缩扩展。原因是关系型数据库Sybase无法支持“应用系统”的伸缩扩展。

  3. 客户在过去数年已经投入大笔经费在IT方面的建设,但“系统框架设计”还是沿用10几年前的三层设计,而且每年都在原来的基础上做不断的升级。当业务不断成长时,数据量也跟着成长,功能越来越多, 但系统性能越来越差。客户该如何选择呢 ?是 scale up? 还是 scale out ?

  为什么选择Pivotal Gemfire构建12306的云应用平台?

  要解决12306春运时高流量高并发的问题,如果单靠硬件升级解决的话,可能需要扩充数十倍的硬件服务器。但在春运以后,又该如何解决服务器过剩的问题呢?

  要真正解决“高流量,高并发“的难题是需要从软件和应用系统层面出发,唯有实现“可扩展的应用云平台架构”,灵活和快速热部署的机制,才是真正解决高并发访问的根本。

  在经过多次论证和POC测试后, 12306 最后选择Pivotal Gemfire作为系统改造的平台,其主要原因如下:

  1. 关联数据节点设计:可以根据客户的业务逻辑特性和数据关联性,将关联性强的数据放置于同一个服务器节点,提高系统性能,避免分布式系统服务器的频繁数据交换。

  2. 将数据移到内存:由于数据是放在内存里面,屏蔽传统数据库频繁访问, CPU与数据库的交互作用,影响服务器性能。内存的数据交换速度远高于磁盘速度上千倍, 极大提高系统性能。

  3. 扩展和伸缩性:以Gemfire构建的应用云平台,是以 x86 PC服务器为主的硬件基础。在保证系统的性能下,此平台可以随着客户业务的成长来任意调配x86服务器的数量,避免以后昂贵的硬件升级带来的困扰。经POC测试结果显示,整个系统性能可随着服务器的数量的增加实现几乎线性的成长。

  4. 数据可靠性:在同个集群里面可以有多个数据节点备份,数据可以自动同步,或是将内存数据持久化到硬盘或是数据库

  5. 跨地域的数据分布或同步 :可以透过“广域网”将指定的 Gemfire集群的内存数据“实时同步”到异地的数据中心。这是属于“应用层”的数据同步异于传统的“数据库”同步。

  6. Pivotal Gemfire使用 x86 PC服务器,其性价比远远高于 Unix 小型机。

  (1)网络阻塞是个门槛

  网络是进入12306征程的起点,网络带宽快慢往往决定“秒杀“的结果,这在很多电商网站促销时时常发生, 因此12306也无法避免。下面数字是由互联网收集得到的,可能有偏差。但我们尽可能根据这些数目字来解析数年来网络原因发生的问题。

  2012 年:12306 第一次在春运使用, 网络带宽1.5G,可以支持最大的PV值是11,250;根据报导,此系统有10,000人的登陆限制, 假如每人每秒点击一次的话,理论上是可以勉强支持正常的点击量。

  但在购票尖峰日,有上千万的网民第一次上网购票,在无法登陆的情况下, 用户不断刷取首页,或是已登陆者无法得到系统的及时反应,不断点击页面,产生大量的请求,造成网络和系统的高负载,导致崩溃。

  2013年 :宽带增加一倍到达3G频宽,有20万用户登陆的限制,采取10次放票,分散流量,防止买票过度集中;但不幸的是“刷票软件”横行,每秒可以刷票数十次到数百次,高峰期有25万的PV值, 远远超过带宽的最大理论值 22,500 PV。

  2014年 : 宽带增加到达5G,16次放票,有屏蔽刷票软件抢票的设计,有效阻挡90%的点击,但实名制有漏洞,每秒还是有15万次的浏览需求,远超过37,500 PV的的理论带宽承载量。

  2015年 : 12306有21次放票,增加带宽到12G,手机订票(流量小)分担25%的12306售票,解决实名制的问题,可以阻挡95% 刷票软件的点击量,每秒最大有117,800次的浏览请求,此数目字已经很接近理论带宽承载量117,400 PV值。

  根据上述解析, 2012年 – 2014年春运的网络带宽给12306带来很多问题。根据网民的反应,在2015年12306带宽在 12G的情况下,虽然稍微有点卡, 但是大致的反应还是不错的。此轮点与我们的推论是大致符合。

\

  1. PV值和放票次数是根据互联网的报导。

  2. 2013年与2014年的PV值有10倍的差异, 2014年多了6次放票时段,票的出售量增加90%。但在 2013年,极有可能是大部分的票量集中在少数时段就放完,减少多次的“秒杀“发生。

  3. 2012和2013年, 12306 没有屏蔽抢票软件的设置。在2014年以后,实现了基本的屏蔽功能。 假设此在2014年可以阻挡90%抢票软件的点击, 在2015年可以阻挡 95%的点击。

  4. 在2015年, 假设互联网的平均PV值的数据量是15K byte, 手机上网的PV值是 1K byte,占有25%的流量。

  5. 带宽最大理论PV值/秒 : 1G的带宽是1,000,000,000 bit/second,1 byte = 8 bits.

  2015年平均PV值 =11.5K byte (含手机上网), 2012-2014年的PV值= 15K bytes。

  另外,假设考虑网络IP协议交换有10%的损耗。

  6. 浏览请求最大PV值/秒:假设在每个放票时段,抢票的高峰期是5分钟(含查询, 下单,付款等操作),在高峰期5分钟的下载流量是整个时段下载总量50%;

  再假设有效的浏览下载量是5%上传的请求点击量,换句话说,有95%的点击量被屏蔽,可能是阻挡刷票软件,或是网络阻塞丢包,或是系统忙碌没有反应等等。

  (2)服务器集群性能无法伸缩性扩展

  参考互联网上的资料,12306服务器集群是传统的三层架构设计,如果不考虑最前端的F5负载均衡服务器,它是由 数百部 Web服务器集群和应用服务器集群构成前端,64部数据库小型机集群(用于专门实现并行计算每班车次的余票量),和订单处理服务器集群构成后端。从专业的角度来看,此种框架设计是中规中矩的,国内99%的框架设计师都是如此设计。

  如前述所提,由于Sybase数据库的原因,此种设计无法做伸缩性的扩展。因此,12306要进一步提高性能就面临很大的抉择。在此,先了解服务器集群性能与实际需求之间有多少差距。

  回顾2012年到2015年,12306系统在这3年内有很大的变化。

  1. 2012年春运 :根据互联网上的信息,2012年 12306设计的售票指标是在100万张票的销售,这完全低估了互联网网民的实际需求,在尖峰日,有上千万人登陆。网络带宽,Web服务器集群,应用服务器集群,余票查询/计算集群,到订单处理集群, 这些设备性能完全无法应付高流量高并发的请求。由于极大的低估互联网的需求,造成12306整个系统不稳定。

  在12306系统,余票查询/计算子系统是最复杂的, 最耗损服务器CPU资源。在整个客票系统里,有数十条行车路线,有3000多个车次(G,D,K,Z,C,..),5000多个火车站,不同的席次(硬座,硬卧, 软座, 软卧, etc),座位等级(商务, 一等, 二等),和车票等级(一般,军人, 学生,残障,小孩)等因素,将这些参数换算成数学模型,那可是有数千亿条的排列组合。

  2012年的余票计算系统实际处理能力据估计不会超过 300-400 TPS,而有效的余票查询请求远远高于3000 QPS (query per second)。另外,系统每隔10分钟更新车次的余票,这些余票信息是没有参考价值,因为在10分钟里已经售出数十万张票。如果要满足余票计算的需求达到至少 3000 TPS, 那么12306 需要再增加6倍的服务器,即将近 400部小型机(原有系统有64部服务器)。

  2. 2013年春运:在2012年6月进行第一步余票查询/计算改造,使用Pivotal Gemfire改造后的结果是每秒至少支持 10,000 TPS 以上,此数目字已经足够应付高并发的需求,因此在2013年春运余票查询顺利过关。 由于集群计算能力大增,余票更新缩短到每隔2分钟提供最及时的信息。

  在余票查询瓶颈移除后,订单处理服务器的瓶颈就出现在订单排队,网民必须等待数十秒到数十分钟才会得到订单的确认。订单的请求累积高达数千甚至数万个以上,估计当时订单处理服务器的处理能力不超过 200-300 TPS。

  3. 2014年:在2013年后,进行“订单分库二级查询”处理,将订单生成与订单查询分开处理。因为订单查询的数量远远超过订单生成的数量。因此, 12306将查询订单的热点数据放在Gemfire集群, 将历史订单数据放在Hadoop集群。如此设计,不但提高订单查询的功能数十倍,而且订单生成的性能至少也提高5倍以上(使用原有服务器)。

  4. 2015年:进一步使用Gemfire优化整个 12306系统,总共建立5个Gemfire集群。另外建立三个数据中心(高铁公司, 铁科院,和阿里云),在阿里云上部署数百个虚拟机(有 Web服务器,应用服务器,和余票查询服务器集群)分流余票查询75%的流量,因为余票查询流量占据12306整体流量的90%。

  平均每次放票量尖峰有效余票

  计算请求(QPS)余票计算能力(TPS)尖峰期订单

  处理请求(TPS)订单处理能力(TPS)

  2012415,000> 3000300-400》 1600200

  2013265,000> 3000》 10,000》 1030500

  2014313,000> 3000》 10,000 12001000

  2015268,500> 3000》 10,00010501000

  在12306系统,余票计算的结果是放在“数据缓存应用服务器”,在2012年每隔10分钟更新每班车次的余票结果。如果新请求与上次更新的时间间隔低于10分钟,数据缓存系统就直接返回上次计算的结果。而在10分钟左右再重新计算新的请求。在10分钟的间隔,服务器集群需要计算3000多个车次的余票结果。自2013年以后,12306系统每隔2分钟更新车次余票结果。

  使用Gemfire改造后12306的现状和启示

  2015年的春运购票期间12306系统的表现是很令人瞩目的,它的效果和影响总结如下:

  1. 提供“高并发,低延迟”的解决方案,一劳永逸,不用烦恼后续硬件升级的问题

  2. 通过GemFire多集群技术,实现多重的高可用性,确保高峰压力下和系统异常的情况下保证业务的持续性。

  3. 构建一个可扩展的云应用平台架构,灵活和快速热部署的机制,为未来混合云的部署打基础。

  4. 余票查询集群性能提升 :

  使用数十部 x86服务器 (或是上百部虚拟机)可以达到 10,000 TPS以上,提升原来系统性能达30倍以上。原来的系统是使用64部Unix 小型机。

  余票信息更新从原来10分钟缩短到2分钟,使信息更有参考价值。

  5. 12306“订单分库二级查询”子系统:

  将订单生成与订单查询分库处理,订单查询性能提高50倍, 订单生成性能提高4-5倍。

  将热点订单放在Gemfire集群,将历史订单数据放在Hadoop集群。这是快数据和大数据结合的完美案例。

  6. 混合云的应用:

  使用Gemfire改造后的分布式系统,极易分散部署到不同的数据中心

  例如,余票查询子系统可以独立于原来的大系统部署到公有云上,同时也可以再将此子系统一分为二,将另一部分服务器部署在私有云的数据中心。即按业务需求随时部署所需要的资源,来解决高并发的难题
 楼主| 发表于 2015-6-8 15:17:45 | 显示全部楼层

12306是如何实现高流量高并发的关键技术

  12306网站曾被认为是“全球最忙碌的网站”,在应对高并发访问处理方面,曾备受网民诟病。因此记者在第一时间联系到一位对12306改造非常关注的技术架构师,他从技术的角度,用科学论证的方式,指出原因所在,并根据他的经验进一步说明12306是如何实现高流量高并发的关键技术,与大家共享。以下为正文:

  前言:

  12306互联网售票系统在2011年下半年开始上线使用,但在2012年春运期间引发无数的争议。在2012年春运后,12306项目承接单位与多家IT公司联系,经过多次论证和POC 测试, 最终引入分布式内存运算数据管理云平台 - Pivotal Gemfire做试点,用以提高12306系统性能,解决“高流量和高并发“的难题。

  高流量高并发是指某特定时间段的海量请求,根据过去的经验法则,高并发是指访问流量是平常流量的 3-5倍;但由于互联网和移动设备apps的普遍化,电商网站的促销模式“11.11“,或是厂商的“饥饿营销“,都会衍生“秒杀“现象。所以过去的经验法则用到12306春运售票系统,往往是远远低于实际的的流量。例如,12306平常一天的PV(page views)值大约是在 2500万到 3000万左右, 在2015年春运高峰日的PV值是297亿,流量增加1000倍,这样海量的请求,假如不能在短时间内动态调整网络带宽或增加服务器数量,就会造成网络阻塞或是服务器性能无法满足要求,甚至使整个系统不稳定。

  12306成长之路

  短短的3年,从2012年春运到2015年春运,12306网站从10亿的PV(page views)值增加到297亿PV值,PV值成长 30倍;网络带宽从 1.5G调整到12G,带宽成长8倍;而12306的售票量从110万增加到564万 ,成长5倍。出票处理能力从 每秒200张提升到 每秒1032张,也是5倍的成长。

  PV值的增加是与放票的次数和可出售的票量有关系,例如,2015年PV值是2014年的2.3倍, 原因是放票次数多了5次“秒杀”,另外增加12% 的售票量。由此可见,互联网流量PV值的增加速度远远高于售票量增加的速度。

  高流量除了代表网络容易造成阻塞以外,系统服务器也会面临更高的CPU负载,在此情况下又该如何应对呢?是选择基于原来系统框架上购买更昂贵的硬件做“scale up“升级呢 ?还是选择购买低成本的x86服务器,进行”可扩展云平台架构“ scale out的改造设计呢?12306互联网购票系统的改造给我们一个很好的案例参考,也让政府单位和企业进一步了解了具体是如何实现的。

  12306改造的关键技术– 建立可伸缩扩展的云应用平台

  2015年12306网站顺利过关,没有“瘫痪”,是值得庆祝的。根据互联网上的新闻,中国铁道科学研究院电子计算技术研究所副所长,12306网站技术负责人朱建生说,为了应对2015年春运售票高峰,该网站采取5项措施:一是利用外部云计算资源分担系统查询业务,可根据高峰期业务量的增长按需及时扩充。二是通过双中心运行的架构,系统内部处理容量扩充一倍,可靠性得到有效保证。三是对系统的互联网接入带宽进行扩容,并可根据流量情况快速调整,保证高峰时段旅客顺畅访问网站。四是防范恶意抢票,通过技术手段屏蔽抢票软件产生的恶意流量,保证网站健康运行,维护互联网售票秩序。五是制定了多套应急预案,以应对突发情况。

  “利用云计算资源“,“按需及时扩充“和”快速调整“,这几个字眼是12306改造的精神,其核心就是要建立一个从下到上全面“可伸缩扩展的云平台”。底层的硬件架构要支持可伸缩扩展,上层的应用系统架构也需要支持可伸缩扩展。

  1. 在过去数年,云计算的基础架构虚拟化已经非常成熟,也日益普遍部署;当网络阻塞时,可以动态增加带宽,当服务器 CPU到达高位时,可以快速从资源池获取虚拟机资源来分摊负荷。 “软件定义的数据中心“ 可以轻易完成这些伸缩性扩展的配置。

  2. 当客户将底层的架构都虚拟化后,网络设备,Web服务器应用服务都可以做“伸缩性”的扩展;但遇到一个难点就是“12306的应用系统框架”无法支持可伸缩扩展。原因是关系型数据库Sybase无法支持“应用系统”的伸缩扩展。

  3. 客户在过去数年已经投入大笔经费在IT方面的建设,但“系统框架设计”还是沿用10几年前的三层设计,而且每年都在原来的基础上做不断的升级。当业务不断成长时,数据量也跟着成长,功能越来越多, 但系统性能越来越差。客户该如何选择呢 ?是 scale up? 还是 scale out ?

  为什么选择Pivotal Gemfire构建12306的云应用平台?

  要解决12306春运时高流量高并发的问题,如果单靠硬件升级解决的话,可能需要扩充数十倍的硬件服务器。但在春运以后,又该如何解决服务器过剩的问题呢?

  要真正解决“高流量,高并发“的难题是需要从软件和应用系统层面出发,唯有实现“可扩展的应用云平台架构”,灵活和快速热部署的机制,才是真正解决高并发访问的根本。

  在经过多次论证和POC测试后, 12306 最后选择Pivotal Gemfire作为系统改造的平台,其主要原因如下:

  1. 关联数据节点设计:可以根据客户的业务逻辑特性和数据关联性,将关联性强的数据放置于同一个服务器节点,提高系统性能,避免分布式系统服务器的频繁数据交换。

  2. 将数据移到内存:由于数据是放在内存里面,屏蔽传统数据库频繁访问, CPU与数据库的交互作用,影响服务器性能。内存的数据交换速度远高于磁盘速度上千倍, 极大提高系统性能。

  3. 扩展和伸缩性:以Gemfire构建的应用云平台,是以 x86 PC服务器为主的硬件基础。在保证系统的性能下,此平台可以随着客户业务的成长来任意调配x86服务器的数量,避免以后昂贵的硬件升级带来的困扰。经POC测试结果显示,整个系统性能可随着服务器的数量的增加实现几乎线性的成长。

  4. 数据可靠性:在同个集群里面可以有多个数据节点备份,数据可以自动同步,或是将内存数据持久化到硬盘或是数据库

  5. 跨地域的数据分布或同步 :可以透过“广域网”将指定的 Gemfire集群的内存数据“实时同步”到异地的数据中心。这是属于“应用层”的数据同步异于传统的“数据库”同步。

  6. Pivotal Gemfire使用 x86 PC服务器,其性价比远远高于
Unix

小型机

  (1)网络阻塞是个门槛

  网络是进入12306征程的起点,网络带宽快慢往往决定“秒杀“的结果,这在很多电商网站促销时时常发生, 因此12306也无法避免。下面数字是由互联网收集得到的,可能有偏差。但我们尽可能根据这些数目字来解析数年来网络原因发生的问题。

  2012 年:12306 第一次在春运使用, 网络带宽1.5G,可以支持最大的PV值是11,250;根据报导,此系统有10,000人的登陆限制, 假如每人每秒点击一次的话,理论上是可以勉强支持正常的点击量。

  但在购票尖峰日,有上千万的网民第一次上网购票,在无法登陆的情况下, 用户不断刷取首页,或是已登陆者无法得到系统的及时反应,不断点击页面,产生大量的请求,造成网络和系统的高负载,导致崩溃。

  2013年 :宽带增加一倍到达3G频宽,有20万用户登陆的限制,采取10次放票,分散流量,防止买票过度集中;但不幸的是“刷票软件”横行,每秒可以刷票数十次到数百次,高峰期有25万的PV值, 远远超过带宽的最大理论值 22,500 PV。

  2014年 : 宽带增加到达5G,16次放票,有屏蔽刷票软件抢票的设计,有效阻挡90%的点击,但实名制有漏洞,每秒还是有15万次的浏览需求,远超过37,500 PV的的理论带宽承载量。

  2015年 : 12306有21次放票,增加带宽到12G,手机订票(流量小)分担25%的12306售票,解决实名制的问题,可以阻挡95% 刷票软件的点击量,每秒最大有117,800次的浏览请求,此数目字已经很接近理论带宽承载量117,400 PV值。

  根据上述解析, 2012年 – 2014年春运的网络带宽给12306带来很多问题。根据网民的反应,在2015年12306带宽在 12G的情况下,虽然稍微有点卡, 但是大致的反应还是不错的。此轮点与我们的推论是大致符合。

  1. PV值和放票次数是根据互联网的报导。

  2. 2013年与2014年的PV值有10倍的差异, 2014年多了6次放票时段,票的出售量增加90%。但在 2013年,极有可能是大部分的票量集中在少数时段就放完,减少多次的“秒杀“发生。

  3. 2012和2013年, 12306 没有屏蔽抢票软件的设置。在2014年以后,实现了基本的屏蔽功能。 假设此在2014年可以阻挡90%抢票软件的点击, 在2015年可以阻挡 95%的点击。

  4. 在2015年, 假设互联网的平均PV值的数据量是15K byte, 手机上网的PV值是 1K byte,占有25%的流量。

  5. 带宽最大理论PV值/秒 : 1G的带宽是1,000,000,000 bit/second,1 byte = 8 bits.

  2015年平均PV值 =11.5K byte (含手机上网), 2012-2014年的PV值= 15K bytes。

  另外,假设考虑网络IP协议交换有10%的损耗。

  6. 浏览请求最大PV值/秒:假设在每个放票时段,抢票的高峰期是5分钟(含查询, 下单,付款等操作),在高峰期5分钟的下载流量是整个时段下载总量50%;

  再假设有效的浏览下载量是5%上传的请求点击量,换句话说,有95%的点击量被屏蔽,可能是阻挡刷票软件,或是网络阻塞丢包,或是系统忙碌没有反应等等。

  (2)服务器集群性能无法伸缩性扩展

  参考互联网上的资料,12306服务器集群是传统的三层架构设计,如果不考虑最前端的F5负载均衡服务器,它是由 数百部 Web服务器集群和应用服务器集群构成前端,64部数据库小型机集群(用于专门实现并行计算每班车次的余票量),和订单处理服务器集群构成后端。从专业的角度来看,此种框架设计是中规中矩的,国内99%的框架设计师都是如此设计。

  如前述所提,由于Sybase数据库的原因,此种设计无法做伸缩性的扩展。因此,12306要进一步提高性能就面临很大的抉择。在此,先了解服务器集群性能与实际需求之间有多少差距。

  回顾2012年到2015年,12306系统在这3年内有很大的变化。

  1. 2012年春运 :根据互联网上的信息,2012年 12306设计的售票指标是在100万张票的销售,这完全低估了互联网网民的实际需求,在尖峰日,有上千万人登陆。网络带宽,Web服务器集群,应用服务器集群,余票查询/计算集群,到订单处理集群, 这些设备性能完全无法应付高流量高并发的请求。由于极大的低估互联网的需求,造成12306整个系统不稳定。

  在12306系统,余票查询/计算子系统是最复杂的, 最耗损服务器CPU资源。在整个客票系统里,有数十条行车路线,有3000多个车次(G,D,K,Z,C,..),5000多个火车站,不同的席次(硬座,硬卧, 软座, 软卧, etc),座位等级(商务, 一等, 二等),和车票等级(一般,军人, 学生,残障,小孩)等因素,将这些参数换算成数学模型,那可是有数千亿条的排列组合。

  2012年的余票计算系统实际处理能力据估计不会超过 300-400 TPS,而有效的余票查询请求远远高于3000 QPS (query per second)。另外,系统每隔10分钟更新车次的余票,这些余票信息是没有参考价值,因为在10分钟里已经售出数十万张票。如果要满足余票计算的需求达到至少 3000 TPS, 那么12306 需要再增加6倍的服务器,即将近 400部小型机(原有系统有64部服务器)。

  2. 2013年春运:在2012年6月进行第一步余票查询/计算改造,使用Pivotal Gemfire改造后的结果是每秒至少支持 10,000 TPS 以上,此数目字已经足够应付高并发的需求,因此在2013年春运余票查询顺利过关。 由于集群计算能力大增,余票更新缩短到每隔2分钟提供最及时的信息。

  在余票查询瓶颈移除后,订单处理服务器的瓶颈就出现在订单排队,网民必须等待数十秒到数十分钟才会得到订单的确认。订单的请求累积高达数千甚至数万个以上,估计当时订单处理服务器的处理能力不超过 200-300 TPS。

  3. 2014年:在2013年后,进行“订单分库二级查询”处理,将订单生成与订单查询分开处理。因为订单查询的数量远远超过订单生成的数量。因此, 12306将查询订单的热点数据放在Gemfire集群, 将历史订单数据放在Hadoop集群。如此设计,不但提高订单查询的功能数十倍,而且订单生成的性能至少也提高5倍以上(使用原有服务器)。

  4. 2015年:进一步使用Gemfire优化整个 12306系统,总共建立5个Gemfire集群。另外建立三个数据中心(高铁公司, 铁科院,和阿里云),在阿里云上部署数百个虚拟机(有 Web服务器,应用服务器,和余票查询服务器集群)分流余票查询75%的流量,因为余票查询流量占据12306整体流量的90%。

  平均每次放票量尖峰有效余票

  计算请求(QPS)余票计算能力(TPS)尖峰期订单

  处理请求(TPS)订单处理能力(TPS)

  2012415,000> 3000300-400》 1600200

  2013265,000> 3000》 10,000》 1030500

  2014313,000> 3000》 10,000 12001000

  2015268,500> 3000》 10,00010501000

  在12306系统,余票计算的结果是放在“数据缓存应用服务器”,在2012年每隔10分钟更新每班车次的余票结果。如果新请求与上次更新的时间间隔低于10分钟,数据缓存系统就直接返回上次计算的结果。而在10分钟左右再重新计算新的请求。在10分钟的间隔,服务器集群需要计算3000多个车次的余票结果。自2013年以后,12306系统每隔2分钟更新车次余票结果。

  使用Gemfire改造后12306的现状和启示

  2015年的春运购票期间12306系统的表现是很令人瞩目的,它的效果和影响总结如下:

  1. 提供“高并发,低延迟”的解决方案,一劳永逸,不用烦恼后续硬件升级的问题

  2. 通过GemFire多集群技术,实现多重的高可用性,确保高峰压力下和系统异常的情况下保证业务的持续性。

  3. 构建一个可扩展的云应用平台架构,灵活和快速热部署的机制,为未来混合云的部署打基础。

  4. 余票查询集群性能提升 :

  使用数十部 x86服务器 (或是上百部虚拟机)可以达到 10,000 TPS以上,提升原来系统性能达30倍以上。原来的系统是使用64部Unix 小型机。

  余票信息更新从原来10分钟缩短到2分钟,使信息更有参考价值。

  5. 12306“订单分库二级查询”子系统:

  将订单生成与订单查询分库处理,订单查询性能提高50倍, 订单生成性能提高4-5倍。

  将热点订单放在Gemfire集群,将历史订单数据放在Hadoop集群。这是快数据和大数据结合的完美案例。

  6. 混合云的应用:

  使用Gemfire改造后的分布式系统,极易分散部署到不同的数据中心

  例如,余票查询子系统可以独立于原来的大系统部署到公有云上,同时也可以再将此子系统一分为二,将另一部分服务器部署在私有云的数据中心。即按业务需求随时部署所需要的资源,来解决高并发的难题

 楼主| 发表于 2015-6-8 15:19:24 | 显示全部楼层

12306.cn无疑是全球最繁忙的网站,每到特殊节日,这个世界上规模最大的实时交易系统都要面临巨大考验。2012年初的春运高峰期间,每天有2000万人访问该网站,日点击量最高达到14亿,大量同时涌入的网络访问造成12306几近瘫痪。

  为了改变“逢节必瘫”的现状,铁路总公司从2012年6月开始选择Pivotal GemFire分布式内存计算平台对12306进行改造。如今3年过去,2015年铁路客票的春运早已结束,不难发现,与往年相比今年大家对12306吐槽的花边新闻少了很多。

  在第六届中国数据库技术大会(DTCC 2015)的“内存数据库专场”中,中国科学院自动化研究所大数据应用部高级研究员杨旭钧为我们详尽解读了GemFire是如何帮助12306摆脱“饱受诟病”的命运。

  

  ▲中国科学院自动化研究所大数据应用部高级研究员杨旭钧

  回顾GemFire的前世今生

  1982年

  GemStone Systems成立于美国俄勒冈州西北部城市比弗顿市。GemStone是领先的分布式数据管理技术软件公司,在此方面有着厚重的历史。最初使用Smalltalk语言开发出了第一代面向对象的数据库。并成为Smalltalk执行委员会成员。

  1986年

  第一代产品Gemstone/S 正式面世,受到金融市场的广泛欢迎。

  90年代中后期

  随着Java语言的广泛应用,GemStone与Sun公司合作,参与到JEE的规范制定(JCache -JSR107),并陆续更新与JEE平台相结合的产品。GemStone开发出了GemFire,成为业界第一个满足J2EE标准的中间件。GemFire拥有全新的应用框架,兼容Java, C++, C#。而GemFire在CEP(complex event processing),Event Stream Processing,Data Virtualization, Distributed Caching几个方面有着举足轻重的地位。

  2008年初

  金融危机后,金融监管法规Dodd-Frank、Basel3等陆续出台,各大投资银行为了减少系统风险和增加透明度,加强了金融衍生品交易平台的投资规模,Gemfire击败Oracle等老牌厂商,跻身为华尔街第一大分布式数据处理平台软件。

  2010年5月

  VMware收购了老牌厂商Gemstone,并入SpringSource部门。

  12306的“双高挑战”

  据杨旭钧介绍,在2015年春运高峰日,12306的PV值是297亿,流量较平时增加1000倍。

  12306作为一个面向公众的系统,互联网售票系统具备所有大型互联网系统的特性:“高并发”, “高流量”。尤其是在我国的各个节假日,系统的访问量会激增,导致整个系统后台压力过大,响应变慢。

  

  ▲传统关系型数据库所面临的挑战

  有网友调侃说,12306其实也是一个电商平台,而且是全球最复杂、规模最大的电商平台。但实际上,12306背后所隐藏的业务逻辑非常复杂,远远超过一般的电商平台。

  对于电子商务网站的交易系统,例如淘宝网,当店家出售一件商品,库存减一,客户退货,库存加一,当库存为零,商品下架,有问题线下讨论。此类交易系统提供简单快速的计算。因为不同品牌商品的销售彼此之间没有关联性,不会因为某件品牌商品的出售关联到其他品牌商品的库存量,它们的商品库存是属于“静态库存”

  再来看看12306:12306互联网售票系统是业务逻辑很复杂的系统,如果将每张可出售的火车票当成一件商品来看,每张票的销售都会关联到整条路线每个站点可销售的余票量,有些站点的余票量会产生变化, 有些站点余票量不会有变化。

  由另外一个角度来看,当销售一张票, 改签,或退票时,整条路线每个站点的余票量都需要重新计算,也就是说每个站点的余票库存是个“动态变化库存”的概念。站点与站点之间的余票库存有巨大的关联性,此“动态库存”概念的业务逻辑是12306与电商网站最大的差异。12306的设计重点不但要具有大型电商网站所具备的特性外 (要提供快速响应时间,高可用性(容灾和备份)和系统的扩展性),还需要有强大的CPU计算资源来支撑。

  鉴于12306没有图片、视频等影响带宽的内容,主要矛盾是数据库的高并发量,采用内存数据库是正确的解决思路。参考目前国内外成熟电商网站经验,例如国内的淘宝,百度,国外的谷歌等这类有着海量用户访问的网站,都不约而同的采用分布式的数据处理平台,而Gemfire正是一个基于内存的分布式数据库,并且拥有大量的成功案例,非常适合来解决12306的问题。我们能看到,这两年关于12306网火车余票量不准的抱怨确实减少了。


12306成长历程:12306网站3年时间访问量从10亿PV暴涨到100亿PV,售票量从100万增加到500万,出票处理能力200张/秒增加到1000张/秒。

  杨旭钧表示,针对由海量用户访问带来的高并发挑战,Gemfire本身就是基于内存的技术架构,对于并发访问有天然的IO优势。同时Gemfire是一个分布式数据库,可以将数据访问的请求分散到集群中,有效降低了单个服务器的负荷。动态的分布式架构,可以在运行时增加服务节点,从而获得更高的并发性能。

  高流量方面,主要涉及低延迟的余票查询。Gemfire支持类Map-Reduce并行处理,能够按车次将余票、共用定义等数据拆分成多个独立的计算单元,对余票查询中最耗时的共 用定义部分做预先处理,生成查询缓存。当余票数据发生变化时,系统会动态更新查询缓存。有了预处理及数据同步过程维护的动态查询缓存,单次查询可以控制在10ms-300ms之间, 同时10分钟的固有延迟也不存在了。

  12306从2012年3月开始改造,把原先采用的Unix小型机架构,通过GemFire的分布式内存计算平台改造成Linux/X86服务器集群架构,从而提升了查询余票的速度。根据系统运行数据记录,技术改造之后,在只采用10几台X86服务器实现了以前数十台小型机的余票计算和查询能力,单次查询的最长时间从之前的15秒左右下降到0.2秒以下,缩短了75倍以上。2012年春运的极端高流量并发情况下,支持每秒上万次的并发查询,高峰期间达到2.6万QPS吞吐量,整个系统效率显著提高。

  订单查询系统改造,在改造之前的系统运行模式下,每秒只能支持300-400个QPS的吞吐量,高流量的并发查询只能通过分库来实现。改造之后,可以实现高达上万个QPS的吞吐量,而且查询速度可以保障在20毫秒左右。新的技术架构可以按需弹性动态扩展,并发量增加时,还可以通过动态增加X86服务器来应对,保持毫秒级的响应时间。

  在以往的春运期间,12306售票系统部署Gemfire集群在2个数据中心,提供服务。在2015年春运购票高峰之前,考虑到超大并发会造成网络流量大以及阻塞的问题,今年特别在阿里云建立一个数据中心,由阿里云提供“虚拟机”的租赁服务,将基于Gemfire实现余票查询功能的系统以及Web服务部署在这些虚拟机上,以分流“余票查询”请求,解决因为高峰期超高并发造成的网络阻塞问题,以进一步提高服务品质。为此,12306在2014年下半年在阿里云做了小规模的部署和调试。2015年春运购票高峰期的12306高效平稳运行,也验证了混合架构的可行性。

  作为国内数据库与大数据领域最大规模的技术盛宴,来自BAT、360、京东、美团、58同城、Ebay、新浪、网易、搜狐、易车网、去哪儿网、携程网等互联网企业,微软、南大通用等数据库厂商、以及北京大学等学术机构等百余名顶尖专家现身演讲,为大家奉献了极为宝贵的干货演讲。

  在2015中国数据库技术大会上,现场展台人员爆满,来自微软、百度、星环科技、宝存科技、云和恩墨、听云、永洪BI、Greeliant、Action Technology、巨杉数据库、联想、慧科、云智慧等厂商强力加盟,大会现场有互联网家庭机器人展台,现场参会的朋友有机会与机器人互动,同时大会现场还安排了填调查赢取奖品互动环节。更多惊喜,尽在2015中国数据库技术大会现场。

12306.cn无疑是全球最繁忙的网站,每到特殊节日,这个世界上规模最大的实时交易系统都要面临巨大考验。2012年初的春运高峰期间,每天有2000万人访问该网站,日点击量最高达到14亿,大量同时涌入的网络访问造成12306几近瘫痪。

  为了改变“逢节必瘫”的现状,铁路总公司从2012年6月开始选择Pivotal GemFire分布式内存计算平台对12306进行改造。如今3年过去,2015年铁路客票的春运早已结束,不难发现,与往年相比今年大家对12306吐槽的花边新闻少了很多。

  在第六届中国数据库技术大会(DTCC 2015)的“内存数据库专场”中,中国科学院自动化研究所大数据应用部高级研究员杨旭钧为我们详尽解读了GemFire是如何帮助12306摆脱“饱受诟病”的命运。

  

  ▲中国科学院自动化研究所大数据应用部高级研究员杨旭钧

  回顾GemFire的前世今生

  1982年

  GemStone Systems成立于美国俄勒冈州西北部城市比弗顿市。GemStone是领先的分布式数据管理技术软件公司,在此方面有着厚重的历史。最初使用Smalltalk语言开发出了第一代面向对象的数据库。并成为Smalltalk执行委员会成员。

  1986年

  第一代产品Gemstone/S 正式面世,受到金融市场的广泛欢迎。

  90年代中后期

  随着Java语言的广泛应用,GemStone与Sun公司合作,参与到JEE的规范制定(JCache -JSR107),并陆续更新与JEE平台相结合的产品。GemStone开发出了GemFire,成为业界第一个满足J2EE标准的中间件。GemFire拥有全新的应用框架,兼容Java, C++, C#。而GemFire在CEP(complex event processing),Event Stream Processing,Data Virtualization, Distributed Caching几个方面有着举足轻重的地位。

  2008年初

  金融危机后,金融监管法规Dodd-Frank、Basel3等陆续出台,各大投资银行为了减少系统风险和增加透明度,加强了金融衍生品交易平台的投资规模,Gemfire击败Oracle等老牌厂商,跻身为华尔街第一大分布式数据处理平台软件。

  2010年5月

  VMware收购了老牌厂商Gemstone,并入SpringSource部门。

  12306的“双高挑战”

  据杨旭钧介绍,在2015年春运高峰日,12306的PV值是297亿,流量较平时增加1000倍。

  12306作为一个面向公众的系统,互联网售票系统具备所有大型互联网系统的特性:“高并发”, “高流量”。尤其是在我国的各个节假日,系统的访问量会激增,导致整个系统后台压力过大,响应变慢。

  

  ▲传统关系型数据库所面临的挑战

  有网友调侃说,12306其实也是一个电商平台,而且是全球最复杂、规模最大的电商平台。但实际上,12306背后所隐藏的业务逻辑非常复杂,远远超过一般的电商平台。

  对于电子商务网站的交易系统,例如淘宝网,当店家出售一件商品,库存减一,客户退货,库存加一,当库存为零,商品下架,有问题线下讨论。此类交易系统提供简单快速的计算。因为不同品牌商品的销售彼此之间没有关联性,不会因为某件品牌商品的出售关联到其他品牌商品的库存量,它们的商品库存是属于“静态库存”

  再来看看12306:12306互联网售票系统是业务逻辑很复杂的系统,如果将每张可出售的火车票当成一件商品来看,每张票的销售都会关联到整条路线每个站点可销售的余票量,有些站点的余票量会产生变化, 有些站点余票量不会有变化。

  由另外一个角度来看,当销售一张票, 改签,或退票时,整条路线每个站点的余票量都需要重新计算,也就是说每个站点的余票库存是个“动态变化库存”的概念。站点与站点之间的余票库存有巨大的关联性,此“动态库存”概念的业务逻辑是12306与电商网站最大的差异。12306的设计重点不但要具有大型电商网站所具备的特性外 (要提供快速响应时间,高可用性(容灾和备份)和系统的扩展性),还需要有强大的CPU计算资源来支撑。

  鉴于12306没有图片、视频等影响带宽的内容,主要矛盾是数据库的高并发量,采用内存数据库是正确的解决思路。参考目前国内外成熟电商网站经验,例如国内的淘宝,百度,国外的谷歌等这类有着海量用户访问的网站,都不约而同的采用分布式的数据处理平台,而Gemfire正是一个基于内存的分布式数据库,并且拥有大量的成功案例,非常适合来解决12306的问题。我们能看到,这两年关于12306网火车余票量不准的抱怨确实减少了。


12306成长历程:12306网站3年时间访问量从10亿PV暴涨到100亿PV,售票量从100万增加到500万,出票处理能力200张/秒增加到1000张/秒。

  杨旭钧表示,针对由海量用户访问带来的高并发挑战,Gemfire本身就是基于内存的技术架构,对于并发访问有天然的IO优势。同时Gemfire是一个分布式数据库,可以将数据访问的请求分散到集群中,有效降低了单个服务器的负荷。动态的分布式架构,可以在运行时增加服务节点,从而获得更高的并发性能。

  高流量方面,主要涉及低延迟的余票查询。Gemfire支持类Map-Reduce并行处理,能够按车次将余票、共用定义等数据拆分成多个独立的计算单元,对余票查询中最耗时的共 用定义部分做预先处理,生成查询缓存。当余票数据发生变化时,系统会动态更新查询缓存。有了预处理及数据同步过程维护的动态查询缓存,单次查询可以控制在10ms-300ms之间, 同时10分钟的固有延迟也不存在了。

  12306从2012年3月开始改造,把原先采用的Unix小型机架构,通过GemFire的分布式内存计算平台改造成Linux/X86服务器集群架构,从而提升了查询余票的速度。根据系统运行数据记录,技术改造之后,在只采用10几台X86服务器实现了以前数十台小型机的余票计算和查询能力,单次查询的最长时间从之前的15秒左右下降到0.2秒以下,缩短了75倍以上。2012年春运的极端高流量并发情况下,支持每秒上万次的并发查询,高峰期间达到2.6万QPS吞吐量,整个系统效率显著提高。

  订单查询系统改造,在改造之前的系统运行模式下,每秒只能支持300-400个QPS的吞吐量,高流量的并发查询只能通过分库来实现。改造之后,可以实现高达上万个QPS的吞吐量,而且查询速度可以保障在20毫秒左右。新的技术架构可以按需弹性动态扩展,并发量增加时,还可以通过动态增加X86服务器来应对,保持毫秒级的响应时间。

  在以往的春运期间,12306售票系统部署Gemfire集群在2个数据中心,提供服务。在2015年春运购票高峰之前,考虑到超大并发会造成网络流量大以及阻塞的问题,今年特别在阿里云建立一个数据中心,由阿里云提供“虚拟机”的租赁服务,将基于Gemfire实现余票查询功能的系统以及Web服务部署在这些虚拟机上,以分流“余票查询”请求,解决因为高峰期超高并发造成的网络阻塞问题,以进一步提高服务品质。为此,12306在2014年下半年在阿里云做了小规模的部署和调试。2015年春运购票高峰期的12306高效平稳运行,也验证了混合架构的可行性。

  作为国内数据库与大数据领域最大规模的技术盛宴,来自BAT、360、京东、美团、58同城、Ebay、新浪、网易、搜狐、易车网、去哪儿网、携程网等互联网企业,微软、南大通用等数据库厂商、以及北京大学等学术机构等百余名顶尖专家现身演讲,为大家奉献了极为宝贵的干货演讲。

  在2015中国数据库技术大会上,现场展台人员爆满,来自微软、百度、星环科技、宝存科技、云和恩墨、听云、永洪BI、Greeliant、Action Technology、巨杉数据库、联想、慧科、云智慧等厂商强力加盟,大会现场有互联网家庭机器人展台,现场参会的朋友有机会与机器人互动,同时大会现场还安排了填调查赢取奖品互动环节。更多惊喜,尽在2015中国数据库技术大会现场。

12306.cn无疑是全球最繁忙的网站,每到特殊节日,这个世界上规模最大的实时交易系统都要面临巨大考验。2012年初的春运高峰期间,每天有2000万人访问该网站,日点击量最高达到14亿,大量同时涌入的网络访问造成12306几近瘫痪。

  为了改变“逢节必瘫”的现状,铁路总公司从2012年6月开始选择Pivotal GemFire分布式内存计算平台对12306进行改造。如今3年过去,2015年铁路客票的春运早已结束,不难发现,与往年相比今年大家对12306吐槽的花边新闻少了很多。

  在第六届中国数据库技术大会(DTCC 2015)的“内存数据库专场”中,中国科学院自动化研究所大数据应用部高级研究员杨旭钧为我们详尽解读了GemFire是如何帮助12306摆脱“饱受诟病”的命运。

  

  ▲中国科学院自动化研究所大数据应用部高级研究员杨旭钧

  回顾GemFire的前世今生

  1982年

  GemStone Systems成立于美国俄勒冈州西北部城市比弗顿市。GemStone是领先的分布式数据管理技术软件公司,在此方面有着厚重的历史。最初使用Smalltalk语言开发出了第一代面向对象的数据库。并成为Smalltalk执行委员会成员。

  1986年

  第一代产品Gemstone/S 正式面世,受到金融市场的广泛欢迎。

  90年代中后期

  随着Java语言的广泛应用,GemStone与Sun公司合作,参与到JEE的规范制定(JCache -JSR107),并陆续更新与JEE平台相结合的产品。GemStone开发出了GemFire,成为业界第一个满足J2EE标准的中间件。GemFire拥有全新的应用框架,兼容Java, C++, C#。而GemFire在CEP(complex event processing),Event Stream Processing,Data Virtualization, Distributed Caching几个方面有着举足轻重的地位。

  2008年初

  金融危机后,金融监管法规Dodd-Frank、Basel3等陆续出台,各大投资银行为了减少系统风险和增加透明度,加强了金融衍生品交易平台的投资规模,Gemfire击败Oracle等老牌厂商,跻身为华尔街第一大分布式数据处理平台软件。

  2010年5月

  VMware收购了老牌厂商Gemstone,并入SpringSource部门。

  12306的“双高挑战”

  据杨旭钧介绍,在2015年春运高峰日,12306的PV值是297亿,流量较平时增加1000倍。

  12306作为一个面向公众的系统,互联网售票系统具备所有大型互联网系统的特性:“高并发”, “高流量”。尤其是在我国的各个节假日,系统的访问量会激增,导致整个系统后台压力过大,响应变慢。

  

  ▲传统关系型数据库所面临的挑战

  有网友调侃说,12306其实也是一个电商平台,而且是全球最复杂、规模最大的电商平台。但实际上,12306背后所隐藏的业务逻辑非常复杂,远远超过一般的电商平台。

  对于电子商务网站的交易系统,例如淘宝网,当店家出售一件商品,库存减一,客户退货,库存加一,当库存为零,商品下架,有问题线下讨论。此类交易系统提供简单快速的计算。因为不同品牌商品的销售彼此之间没有关联性,不会因为某件品牌商品的出售关联到其他品牌商品的库存量,它们的商品库存是属于“静态库存”

  再来看看12306:12306互联网售票系统是业务逻辑很复杂的系统,如果将每张可出售的火车票当成一件商品来看,每张票的销售都会关联到整条路线每个站点可销售的余票量,有些站点的余票量会产生变化, 有些站点余票量不会有变化。

  由另外一个角度来看,当销售一张票, 改签,或退票时,整条路线每个站点的余票量都需要重新计算,也就是说每个站点的余票库存是个“动态变化库存”的概念。站点与站点之间的余票库存有巨大的关联性,此“动态库存”概念的业务逻辑是12306与电商网站最大的差异。12306的设计重点不但要具有大型电商网站所具备的特性外 (要提供快速响应时间,高可用性(容灾和备份)和系统的扩展性),还需要有强大的CPU计算资源来支撑。

  鉴于12306没有图片、视频等影响带宽的内容,主要矛盾是数据库的高并发量,采用内存数据库是正确的解决思路。参考目前国内外成熟电商网站经验,例如国内的淘宝,百度,国外的谷歌等这类有着海量用户访问的网站,都不约而同的采用分布式的数据处理平台,而Gemfire正是一个基于内存的分布式数据库,并且拥有大量的成功案例,非常适合来解决12306的问题。我们能看到,这两年关于12306网火车余票量不准的抱怨确实减少了。


12306成长历程:12306网站3年时间访问量从10亿PV暴涨到100亿PV,售票量从100万增加到500万,出票处理能力200张/秒增加到1000张/秒。

  杨旭钧表示,针对由海量用户访问带来的高并发挑战,Gemfire本身就是基于内存的技术架构,对于并发访问有天然的IO优势。同时Gemfire是一个分布式数据库,可以将数据访问的请求分散到集群中,有效降低了单个服务器的负荷。动态的分布式架构,可以在运行时增加服务节点,从而获得更高的并发性能。

  高流量方面,主要涉及低延迟的余票查询。Gemfire支持类Map-Reduce并行处理,能够按车次将余票、共用定义等数据拆分成多个独立的计算单元,对余票查询中最耗时的共 用定义部分做预先处理,生成查询缓存。当余票数据发生变化时,系统会动态更新查询缓存。有了预处理及数据同步过程维护的动态查询缓存,单次查询可以控制在10ms-300ms之间, 同时10分钟的固有延迟也不存在了。

  12306从2012年3月开始改造,把原先采用的Unix小型机架构,通过GemFire的分布式内存计算平台改造成Linux/X86服务器集群架构,从而提升了查询余票的速度。根据系统运行数据记录,技术改造之后,在只采用10几台X86服务器实现了以前数十台小型机的余票计算和查询能力,单次查询的最长时间从之前的15秒左右下降到0.2秒以下,缩短了75倍以上。2012年春运的极端高流量并发情况下,支持每秒上万次的并发查询,高峰期间达到2.6万QPS吞吐量,整个系统效率显著提高。

  订单查询系统改造,在改造之前的系统运行模式下,每秒只能支持300-400个QPS的吞吐量,高流量的并发查询只能通过分库来实现。改造之后,可以实现高达上万个QPS的吞吐量,而且查询速度可以保障在20毫秒左右。新的技术架构可以按需弹性动态扩展,并发量增加时,还可以通过动态增加X86服务器来应对,保持毫秒级的响应时间。

  在以往的春运期间,12306售票系统部署Gemfire集群在2个数据中心,提供服务。在2015年春运购票高峰之前,考虑到超大并发会造成网络流量大以及阻塞的问题,今年特别在阿里云建立一个数据中心,由阿里云提供“虚拟机”的租赁服务,将基于Gemfire实现余票查询功能的系统以及Web服务部署在这些虚拟机上,以分流“余票查询”请求,解决因为高峰期超高并发造成的网络阻塞问题,以进一步提高服务品质。为此,12306在2014年下半年在阿里云做了小规模的部署和调试。2015年春运购票高峰期的12306高效平稳运行,也验证了混合架构的可行性。

  作为国内数据库与大数据领域最大规模的技术盛宴,来自BAT、360、京东、美团、58同城、Ebay、新浪、网易、搜狐、易车网、去哪儿网、携程网等互联网企业,微软、南大通用等数据库厂商、以及北京大学等学术机构等百余名顶尖专家现身演讲,为大家奉献了极为宝贵的干货演讲。

  在2015中国数据库技术大会上,现场展台人员爆满,来自微软、百度、星环科技、宝存科技、云和恩墨、听云、永洪BI、Greeliant、Action Technology、巨杉数据库、联想、慧科、云智慧等厂商强力加盟,大会现场有互联网家庭机器人展台,现场参会的朋友有机会与机器人互动,同时大会现场还安排了填调查赢取奖品互动环节。更多惊喜,尽在2015中国数据库技术大会现场。

 楼主| 发表于 2015-6-8 15:20:52 | 显示全部楼层

分布式缓存GemFire架构介绍

[url=][/url]1什么是GemFire

GemFire是一个位于应用集群和后端数据源之间的高性能、分布式的操作数据(operational data)管理基础架构。它提供了低延迟、高吞吐量的数据共享和事件分发。GemFire充分利用网络中的内存和磁盘资源,形成一个实时的数据网格(data fabric or grid)。



GemFire的主要特性有:

Ø
多种网络拓扑

Ø
高并发的内存数据结构,避免锁争夺

Ø
可选的ACID

Ø
序列化(native serialization)和智能缓冲(smart buffering)保证消息快速分发

Ø
同步或异步写磁盘

Ø
冗余内存拷贝

2网络拓扑和缓存架构

考虑到问题多样性和架构灵活性,GemFire提供了多种选项来配置在哪(where)以及怎样(how)管理缓存数据,这就使架构师能够从P2P(peer-to-peer)、CS(client-server)、WAN三种组件构建出合适的缓存架构。

2.1 P2P拓扑

在P2P分布式系统中,应用程序使用GemFire的镜像(mirroring)功能来将大量数据跨结点分区(sharding)以及在这些结点间进行数据复制同步。下面主要讲一下GemFire的P2P拓扑中的两个主要角色:mirrored镜像结点和partitioned分区结点(具体见3.2中mirror-type的配置方式)。

因为在P2P拓扑中缓存数据与应用在一起,所以首先说一下嵌入式缓存。所谓嵌入式缓存(embedded cache)其实就是说缓存和应用程序在一起,直接利用应用服务器的内存空间。也就是我们常说的类似Ehcache的那种本地缓存(local cache)。



mirrored结点就像一块磁铁一样,将其他数据区域的数据都吸附过来,形成一块完整的数据集合。当一块数据区域被配置为mirrored的结点第一次新建或重建时,GemFire将自动执行初始镜像抓取(initial image fetch)操作,从其他结点的数据子集中还原出完整的状态。如果此时网络中存在另一个mirrored结点,那么将会执行最优直接抓取(optimal directed fetch)



所以我们很容易看出,mirrored结点主要出于两种目的:

Ø
对于大量读的应用,应用程序通过保存全量数据,使客户端请求可以即时访问到想要数据,而无需经过网络传输

Ø
当发生故障时,mirrored结点可以用来恢复其他结点


不同于mirrored结点,每个partitioned结点都持有唯一的一块数据。应用程序就像操作本地数据一样,GemFire在幕后管理各个分区的数据,并且保证在至多一跳内(at most one network hop)完成数据访问。根据GemFire的哈希算法,分区数据会被自动放入到各个结点的bucket中。同时GemFire也会自动分配出冗余数据的位置并进行复制。当某个结点出错时,客户端请求会自动被重定向到备份结点。并且GemFire会重新复制出一份数据,从而保证数据的冗余拷贝数。最后,我们可以随时向网络中加入新的结点来对GemFire集群进行动态扩容。



P2P系统提供了低延迟、单跳(one-hop)数据访问、动态发现以及透明化的数据存储位置。但是,网络中的每个结点都要维持一个socket连接到其他每个结点。当结点增多时,连接数将成指数级增长。为了提高扩展性,GemFire提供了一种可靠的UDP多播的通信方式。在下一节中我们将看到,P2P数据同步在服务器间复制数据时的作用。

2.2 Client-Server拓扑

Client-Server缓存允许大量结点相连形成客户端-服务器结构。服务器即为客户端提供缓存,也可以为其他服务器提供数据复制或缓存。


2.3 WAN拓扑

P2P集群由于点和点之间的紧耦合而产生了扩展性问题,这种问题在数据中心有多个集群或数据中心跨城市时被放大。GemFire提供另一种模型来解决。


3 GemFire工作原理3.1发现机制

默认GemFire使用IP多播来发现新成员,然而所有成员间的通信都采用TCP。对于部署环境禁止使用IP多播或者网络跨越多个子网时,GemFire提供备用方法:使用轻量级的定位服务器(locator server)来追踪所有成员的连接。新成员加入集群时,将询问定位服务并建立类似于IP多播的socket到socket的TCP连接。

3.2数据分发

每个成员都会创建一个或多个缓存数据区域(data region),通过区域的划分,我们能给每个区域配置不同的分发属性、内存管理以及数据一致性模型。默认GemFire使用P2P分发模型,每个成员都能和其他任何成员通信。同时根据不同的内网特点,传输层可选TCP/IP或可靠多播(UDP)。在这些配置中,有两个属性很重要,范围(scope)和镜像类型(mirror-type)。

首先,范围(scope)有四种选项:

Ø
Local:不分发。那为什么不直接保存到HashMap中。因为GemFire额外提供了数据自动持久化到磁盘、OQL(Object Query Language)查询数据、数据操作的事务等特性。

Ø
Distribute-no-ack:发送数据给成员1,在发送数据给成员2时不等待成员1的响应。适用于对数据一致性要求不高,并要求低网络延迟的情况。这是GemFire的默认配置,能够提供低延迟、高吞吐,并通过尽快分发来降低数据冲突的概率。

Ø
Distribute-ack:在发送给成员2前,发送数据并等待成员1的响应。这样每条数据都是同步分发的。

Ø
Global:分发前在其他成员上获得锁,再分发数据。适用于悲观的应用场景,通过全局锁服务来管理锁的获得、释放和超时。



现在来看一下第二个重要的配置属性镜像类型(mirror-type):

Ø
none:仅当缓存中有此数据时才更新,任何其他成员发来的新数据都会被忽略掉。适用于某一数据区域仅用来保存另一区域数据的子集。

Ø
keys:数据区域仅保存key来节约内存,当真正有请求时再从其他区域抓取数据并保存到本地,之后接受对此数据项的更新。适用于无法预测哪些数据会被某一结点访问的情况。

Ø
keys-values:真正的镜像,将保存全量数据。适用于需要立即访问所有数据的结点,以及数据冗余备份。


这两个属性的配置对数据区域中保存的是什么数据有很大影响:


4持久化和溢出

持久化(persistence)将整个数据集拷贝到磁盘,当成员出错时可以用来还原数据。而溢出(overflow)保存key在内存中而value保存到磁盘,达到节省内存的目的。两者既可以单独使用,也可以混合使用。

4.1持久化

GemFire支持两种写磁盘选项:操作内存数据时同步写,或者固定间隔异步写。后一种只当应用在出错时能够容忍不完整的数据还原时使用。


4.2溢出

当内存不足时,GemFire使用LRU策略来决定是否对某个数据项溢出。


4.3混合使用

持久化与溢出可以混合使用。所有key-value都备份到磁盘,并且当内存不足时,只保留最近使用过的数据。由于LRU而被移除到磁盘的value不会对磁盘有影响,因为所有数据已被持久化到磁盘上了。



5事务

GemFire支持缓存事务与JTA事务两种。

5.1缓存事务

每个事务都有其私有的工作区域。事务开始时,数据将被拷贝到私有区域,直到事务提交。若提交时没有冲突,则数据从私有区域拷贝回原区域。这样事务就可以并发地修改缓存了。



对于范围(scope)配置为local的缓存数据区域,事务提交后就算是完成了。但对于分布式(scope=distributed-no-ack or distributed-ack),则在事务提交时要进行缓存同步。

6查询

(待补充:OOL)

7数据可用性和Failover

(待补充)





您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|boway Inc. ( 冀ICP备10011147号 )

GMT+8, 2024-4-27 01:49 , Processed in 0.101524 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表