注:本文首发于CSDN,转载请标明出处。
【编者按】在年前的「技术揭秘12306改造」专题中,一位对12306改造非常关注的技术架构师,他从技术的角度,用科学论证的方式说明12306是如何实现高流量高并发的关键技术。今天,他继续为大家带来第二章:解析12306两地三中心混合云架构。
以下为正文》》
前言
2015年春节最大的特色就是“摇一摇”,微信红包在春晚摇一摇互动总量超过110亿次,峰值达8.1亿次/分钟,有185个国家传递微信祝福。支付宝钱包在除夕晚上8点达峰值,首页被点击的次数为8.832亿次/分钟。表面上来看“摇一摇”是在送红包,但从深层次的互联网思维来看,摇一摇的目的是要创造和凸显“移动支付”在互联网金融的价值链,甚至一带一路,将“移动支付”模式的业务,带出国门推向全球,此举对金融行业未来的生态影响意义重大。
摇一摇隐含的商业模式不是此篇文章讨论重点,在此要强调的是在云计算和大数据时代,任何一个商业模式的创新都需要有最先进的技术配合和支撑。从技术角度来看,这些看似业务逻辑简单的“摇一摇”在面对高流量和高并发情况下,承载天量的访问量对系统框架设计师来说是巨大的挑战。当面临“有计划、难预测、暂时性”的巨大访问量,该如何解决此问题?是花巨资建设系统呢? 还是将需要“短暂”巨大资源的业务托管在云计算数据中心,让它们提供快速灵活可调度的资源呢?
本文作者从互联网收集大量有关12306的信息,首先描述12306系统与大型电商交易系统的主要差异和说明此差异为何需要巨大的计算资源来支撑; 再进一步探讨12306混合云设计的考量 - 安全性和系统资源扩展性,并说明为何只将“余票查询业务”放在阿里云提供服务。最后以论证的方式“推测”12306两地三中心的混合云架构设计(有关12306混合云的架构和解析是作者个人的推测,有误解地方请求交流和指正)
在此篇文章,不探讨火车运能不足,抢不到车票返乡引起民怨问题,因为铁路的基础建设需要时间解决;以Pivotal Gemfire为例, 是因为2015年12306在两地三中心部署数百个Gemfire节点,这些应用节点(“异于虚机节点”)可按需以热部署方式来扩展,体现“云”的伸缩特性和流动性。
一、12306与电商交易系统
很多人喜欢将12306与淘宝网做比较, 认为12306互联网售票网站从属性来说是电子商务B2C的一支;用户必须登录,浏览,选择商品,下订单, 订单确认,支付和物流。如果只看整个交易流程,它们确实是一样的。 但从深层次的细节探讨,12306背后所隐藏的业务逻辑是非常复杂,远远超过一般人的想象。
12306网站与电商交易系统业务逻辑的差异
如何解决大型网站所面对的高负载流量和高并发访问,一直以来都是全世界公认的技术难题。对于任何一个交易系统来说不外乎做两件事,一是提供查询,二是数据计算;任何查询业务都有响应时间的要求,从用户体验最好不要超过5秒钟;而数据计算(实时计算或非实时批量计算)与实际业务逻辑有密切的关系。
对于电子商务网站的交易系统,例如淘宝网,当店家出售一件商品,库存减一,客户退货,库存加一,当库存为零,商品下架,有问题线下讨论。此类交易系统提供简单快速的计算。因为不同品牌商品的销售彼此之间没有关联性,不会因为某件品牌商品的出售关联到其他品牌商品的库存量,它们的商品库存是属于“静态库存”;所以电商交易系统的主要设计重点是提供快速响应时间,高可用性(容灾和备份)和系统扩展性,避免在高峰交易期间,因为响应时间慢或是系统当机而失去庞大的商机。
12306互联网售票系统是业务逻辑很复杂的系统,如果将每张可出售的火车票当成一件商品来看,每张票的销售都会关联到整条路线每个站点可销售的余票量,有些站点的余票量会产生变化, 有些站点余票量不会有变化。由另外一个角度来看,当销售一张票, 改签,或退票时,整条路线每个站点的余票量都需要重新计算,也就是说每个站点的余票库存是个“动态变化库存”的概念。站点与站点之间的余票库存有巨大的关联性,此“动态库存”概念的业务逻辑是12306与电商网站最大的差异。12306的设计重点不但要具有大型电商网站所具备的特性外 (要提供快速响应时间,高可用性(容灾和备份)和系统的扩展性),还需要有强大的CPU计算资源来支撑。
12306 系统主要瓶颈 - 余票计算与配票规则
由上面所述,每张火车票的销售状态变化(买票,退票,改签),都会影响到整条路线火车站点可销售的余票量;例如,某条火车路线有100个车次,每个车次可承载1000人,有100个一等座, 900个2等座,另外还有50个火车停靠站,这有多少个排列组合? 从理论上来说,余票计算是在解答数学模型的难题。
在整个客票系统里,有数十条行车路线,有3000多个车次(G,D,K,Z,C,..),5000多个火车站点,有不同的席次(硬座,硬卧, 软座, 软卧,无座),座位等级(商务, 一等, 二等),和车票等级(一般,军人, 学生,残障,小孩)等因素,将这些参数放在数学模型上,至少有数千亿条的排列组合。而目前的客车运量有限,每天不超过1000万名旅客。 如何将1000万张车票分配到数千亿条的排列组合里面呢?并且还要考虑公正,公平的合理分配。
如果将整条路线的所有车票都放在起始站出售的话,乘车距离最远的先购票,创造的利润最大,但是下游站点就买不到票,失去公正和公平的分配原则。所以,每个站点的余票计算并不是简单的两站之间算好的票数,做加加减减的计算。
铁路运输为民众提供便捷的出行, 如何将有限资源公正公平的合理分配,让大众满意是需要靠智慧解决的。 参考国内外的售票原则,运输部门一定要制定一套复杂的分配规则,这些规则是与车次,路线,加班车,席次,座位等级,车票等级,乘车区间,x天预售期和搭乘时间等都有密切关系。 每一个特定的余票查询,都会触发余票计算,每班车次的余票计算都有上万条规则需要匹配,所有经过“乘车区间”的车次都需要做余票计算;全国有3000多个车次,5000多个站点,这些分配规则总数可能达千万条级别。例如,以沪宁线为例,在春运尖峰期间,经过“上海到南京”区间的车次达300多班次,每次查询需要计算300多班车次的余票量。
这意味着余票查询/计算需要使用大量的CPU计算资源,同时必须快速反应余票查询的结果给用户。在春运售票高峰期间,每分钟都有数万张车票的销售,假如余票查询的响应时间缓慢,这些信息就失去价值,会发生看得到票,但实际上买不到票的情况发生。
二、12306 混合云考虑因素和规划
一般的商业活动都有季节性的旺季和淡季之分,在旺季时烦恼是否有足够的库存,以免失在商机,在淡季时就要想办法促销,降低库存。 使成本最小化,利润最大化,是市场经济的商业法则。 12306互联网售票系统,也面临节假日和非节假日高高低低的需求,12306在春运售票高峰期间的访问流量(PV值)和平时访问流量高达上千倍的差异;如果按原来的系统架构,要解决春运时高流量高并发的问题,可能需要扩充“数十倍”或数百部的Unix服务器才能满足需求。 如果12306自建系统,但在春运以后,又该如何处理服务器过剩的问题,才不会造成资源浪费呢?
根据百度百科对混合云的定义,“混合云是融合公有云和私有云,是近年来云计算的主要模式和发展方向。企业用户出于安全考虑,更愿意将数据存放在私有云中,但是同时又希望可以获得公有云的计算资源,在这种情况下混合云被越来越多的采用,它将公有云和私有云进行混合和匹配,以获得最佳的效果,这种个性化的解决方案,达到既省钱又安全的目的”。
混合云托管考虑因素
由上面的定义,混合云服务模式应该是12306最佳的选项,可以将“有计划,难预测,暂时性”需要巨大资源的业务放在公有云提供服务。如果12306采用混合云的服务模式,有哪些重要因素需要考虑?
- 托管方式:整个业务托管还是部分业务托管?
- 安全性的考量:敏感性资料该如何存放和保护呢?如何规避风险?
- 业务子系统的独立性:如果是部分业务托管,被指定托管业务的子系统是否能独立剥离原先系统的业务流程?
- 协同合作:在公有云的业务子系统的数据又如何回流与私有云的原来系统在业务上配合,协同合作呢?
- 数据源的传输和复制/同步:如何复制/同步私有云和公有云的数据?
- 资源的弹性扩展:迁移到公有云的业务子系统是否能实现按需弹性扩展,利用云计算数据中心的网络和服务器资源来提供服务?
混合云的规划——按需弹性扩展改造
在 前面一篇文章提到,要解决12306面对“高流量,高并发“的难题是需要从软件平台和应用系统层面出发,要实现“可扩展的应用云平台架构”,灵活和快速热部署的机制,才是真正解决高并发访问的根本。 12306承建单位-铁科院在此方面做很多改进,使用Pivotal Gemfire内存数据管理平台,重新设计和改造核心子系统,从用户登录,余票计算,票价计算,实名身份认证,到订单查询;这些改造后的业务子系统都能支持“按需弹性扩展”, 不再受限于原来关系型数据库无法做分布式扩展的问题。这些一连串的改造,打通各个环节,实现“质”的*, 也为未来使用混合云服务模式的架构打下良好的基础。
信息安全和业务子系统托管的选择原则
下列进一步探讨如何选择“业务子系统”放在公有云提供服务,主要有两点考虑因素,一为个人信息保护, 二为需要“短暂”且强大计算机资源支持的子系统业务。
1. 购票流程和个人信息:
- 登录:含个人信息
- 余票查询/计算:不含个人信息
- 订单确认和订单查询:含购票人信息和身份确认
- 付款:含个人的支付信息
2. 主要服务器集群和个人信息:
- Web服务器 - 不含个人信息
- 应用服务器缓存服务器 - 不含个人信息
- 登录服务器 - 含个人信息
- 余票查询/计算服务器- 不含个人信息
- 订单确认和订单查询服务器 - 含个人信息
- 实名制身份确认服务器 - 含个人信息
- …
3. 最耗用网络资源
- Web服务器
- 应用服务器缓存服务器
- 余票查询/计算服务器
4. 最耗用服务器资源
- Web服务器集群
- 应用服务器缓存集群
- 余票查询/计算集群
5.售票高峰期访问量振幅最大业务
- Web服务器
- 应用缓存服务器
- 余票查询/计算服务器
综合以上的分析,余票查询/计算业务符合安全性考虑和售票高峰期访问量振幅最大,最耗系统资源;其他适合放在公有云提供服务有三大服务器集群,Web服务器集群, 应用服务器缓存集群, 和余票查询/计算集群。
三、12306混合云架构推测和解析
互联网有一篇关于2015年春运12306用户体验报导,在此篇采访提到12306网站采取5项措施,制定多套应急预案,以应对突发情况,来提高用户体验。
12306用户体验有改善,“为了保障春运期间正常订票,12306网站建设了两个生产中心。在中国铁路总公司又增加了一套设备。这样就增加了一倍的网络内部处理能力……多建中心的同时,也增加了网络的带宽,带宽从5G扩容至12G。增加带宽就等于我们多开了几个门,能让更多的用户同时进来……还不只这些,我们在春运高峰期租了个”云”……在网络高峰期间,12306网站的查询量最大,占到整个网站的85%,就把75%的查询业务都放在租来的“云”上…“春运高峰期的点击量、浏览量是平时的几倍,甚至十几倍。从经济角度考虑,一个网站不太可能以最高峰值的承受力为标准来建设。我们只能在满足日常需求与高峰期售票需求之间寻求一个最佳点,合理进行硬件配置。”现在云技术成熟,高峰期租个云用几天,价格合理,安全也有保障。
有这些新设备、新技术,今年的用户体验大为改善。据测算,今年12306网站的点击速度和页面打开速度比去年缩短了一半。
由上面对话透露的信息,再以专业IT经验来分析并推测12306 混合云的架构设计。
1. 两个生产中心和租了个“云”:
两个生产中心应该是指铁路总公司数据中心和铁科院数据中心,“云”是指阿里云
2. 75%的查询业务都放在租来的“云”上:
意谓着12306只将75%流量的查询业务交给阿里云托管,阿里云只提供租赁查询服务,不涉及任何系统功能的改造。
3. 两地三中心 高可用性和容灾设计:
以专业的IT来看,12306提供全国的网上售票服务,在系统设计上一定有高可用性和容灾的设计。
Gemfire平台已具备高可用性的设计, 所以,两个生产中心一定运行整套业务流程服务,彼此作为异地容灾备份的准备,而阿里云只提供部分业务查询的服务。
4. 业务连续性,应用不中断,操作可持续的设计:
在2012年12月24号下午,由于空调设备故障,12306中断服务数小时。这可以看出12306是单数据中心的设计, 没有考虑容灾的设计。
为了吸取以前的经验,假设12306已经考虑业务连续性,应用不中断,操作可持续的设计,这意味着双生产中心是需要并行作业提供服务;万一有一个生产中心系统出故障,可以在瞬间将流量导至运行良好的数据中心,保持服务的连续性。
5. 数据源的传输和数据库的复制:
过去数据源的传输和数据库的复制机制已经证明此技术是稳定和成熟的,所以会沿用以前的设计。
6. 阿里云的余票查询业务托管:
在前一节已经详述,考虑个人资料的敏感度和安全性,12306不会将这些资料放在阿里云,但会将需要耗费巨大资源的余票查询业务放在阿里云提供服务。另外符合此条件的有3大服务器集群,Web服务器集群, 应用服务器缓存集群, 和余票查询/计算集群。
综合上述的分析,推测和描绘12306混合云的架构如下图:
12306 两地三中心 混合云架构
四、12306两地三中心混合云探讨
12306两地三中心的混合云架构是目前国内规模最大,业务系统最复杂的混合云服务。在12306承办单位 - 铁科院的领导下,经过精心的设计,部署和试运行,在2015年春运上线,它的表现是很令人瞩目的。此混合云设计的特点归纳如下:
1. 业务托管:
从整个购票流程来说,12306只是将部分流程的环节-“余票查询”业务交由阿里云提供服务,并不是“整个系统”按需扩容的托管,这与一般企业的业务托管有最大的差异。如何将“业务子系统“剥离整个系统独立作业, 再将数据结果传回系统,协同作业,这需要从应用系统框架设计着手。
2. 敏感资料的存放和安全性:
12306是公共服务平台,敏感性资料的保护和安全性是首要考虑因素。在混合云设计上,12306将这些资料存放在私有云的数据中心, 确保数据安全无虑。
3. 业务连续性,应用不中断的容灾设计:
双数据中心并行作业,不但可以分担高负载运行,而且可以相互备份, 保证操作不间断。
4. 资源动态扩展:
将“难预测,暂时性”的巨大访问量-余票查询业务放在阿里云,阿里云可以按需动态调整网络带宽和“虚机“资源,保证12306的服务品质,并解决网络传输瓶颈问题。
5. 关系型数据库(SQL) 和非关系型数据库(NoSQL)混合应用:
12306将热点数据放在NoSQL的Gemfire平台,提供快速查询和计算;将关键数据持久化到关系型数据库。
总体而言,目前12306混合云架构是很合理的设计,求稳,求安全,又省钱。如果追求技术的完美性来说,有如下四点建议:
- 提供同个车次不同车厢的联程票 (例如,在同个车次, 北京到上海没票, 但北京到天津, 天津到南京, 南京到上海有票),和 不同车次的联程票 (中途站点换车),使旅客出行订票更方便;
- 思考“数据大集中”的模式,摒除路局和12306数据中心的数据交换,提高处理效率,且易于整个售票系统的维护;
- 整合12306售票网站和线下作业系统(窗口购票,电话订票,代售点),提供更快速的服务;
- 大胆采用“软件定义数据中心”的技术,可以做更灵活更快速数据中心的迁移/复制,为将来多数据中心混合云的部署和服务(分散网络流量)或异地容灾设计打基础。
作者:刘云程 (YC),技术总监,任职于资拓宏宇(上海)公司,主要负责提供客户应用系统升级, 迁移到高性能和高扩展性的“云应用平台”。 刘云程毕业于*清华大学,在美国拿计算机博士学位,于1994年由IBM外派到北京。他在IT行业有近30年工作经验,曾任职于IBM中国研究中心负责电子商务和移 动互联网方面的研究。