现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

技术揭秘12306改造(一):尖峰日PV值297亿下可每秒出票1032张

2015-11-29 14:31 工业·编程 ⁄ 共 6735字 ⁄ 字号 评论 1 条

【编者按】12306网站曾被认为是“全球最忙碌的网站”,在应对高并发访问处理方面,曾备受网民诟病。 2015年铁路客票春运购票高峰期已过,并且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值的增加速度远远高于售票量增加的速度。

尖峰日 PV值

放票次数

网络带宽

尖峰日

12306 售票(张)

同时在线人数限制

订单处理(张/秒)

2012

10亿

4次

1.5G

110万

1万

200

2013

15亿

10次

3G

265万

20万

450

2014

144亿

16次

5G

501万

1000

2015

297亿

21次

12G

564万

1032

高流量除了代表网络容易造成阻塞以外,系统服务器也会面临更高的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 小型机。

在后续章节,以12306为案例做进一步分析,使用Pivotal Gemfire会给12306带来什么好处。

回顾12306 成长的烦恼

(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的情况下,虽然稍微有点卡, 但是大致的反应还是不错的。此轮点与我们的推论是大致符合。

尖峰日 PV值

放票次数

尖峰每次放票 平均PV值

网络带宽

带宽最大理论PV值/秒

浏览请求最大PV值/秒

2012

10亿

4次

2.5亿次

1.5G

11,250

10,000

2013

15亿

10次

1.5亿次

3G

22,500

250,000

2014

144亿

16次

9.0亿次

5G

37,500

150,000

2015

297亿

21次

14.14亿次

12G

117,400

117,800

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)

2012

415,000

> 3000

300-400

》 1600

200

2013

265,000

> 3000

》 10,000

》 1030

500

2014

313,000

> 3000

》 10,000

1200

1000

2015

268,500

> 3000

》 10,000

1050

1000

在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改造后的分布式系统,极易分散部署到不同的数据中心
  • 例如,余票查询子系统可以独立于原来的大系统部署到公有云上,同时也可以再将此子系统一分为二,将另一部分服务器部署在私有云的数据中心。即按业务需求随时部署所需要的资源,来解决高并发的难题。

作者简介:刘云程 (YC),技术总监,任职于资拓宏宇(上海)公司,主要负责提供客户应用系统升级, 迁移到高性能和高扩展性的“云应用平台”。 刘云程毕业于台湾清华大学,在美国拿计算机博士,于1994年由IBM外派到北京。他在IT行业有近30年工作经验,曾任职于IBM中国研究中心负责电子商务和移 动互联网方面的研究。

目前有 1 条留言    访客:0 条, 博主:0 条 ,引用: 1 条

    外部的引用: 1 条

    • 技术揭秘12306改造(二):探讨12306两地三中心混合云架构 | 求索阁

    给我留言

    留言无头像?