全国多地网友反映支付宝出现"无法登陆"异常
2015年5月27日杭州市萧山区某地光纤被挖断,全国多地网友反映支付宝出现"无法登陆"异常。一时间,民心骚动,腾讯新闻网友“匆匆那些年”抱怨说:“试着登录了半个多小时,还以为被坏人转走了,支付宝赔偿我精神损失。”得到了广大网友的一致声援,可以发现广大百姓皆在担心支付宝不能恢复,或者恢复后个人账户余额与实际存储的不一致而担忧。支付机构如此,银行账务紊乱的例子也时有发生。当然这一切也不是机构或者银行所希望出现的。
网联作为向支付机构提供支付业务转接清算的专业化服务机构,秉持对社会和百姓的责任,致力于提供不重复、不遗漏、不出错的资金清算服务,全力保障数据高一致。为实现该目标,平台重点从数据库、网联内部、平台与机构银行外部三个维度来对数据一致性加以保障。
搭建安全稳定数据库
众所周知,数据库是很成熟的数据存储介质,而丢失数据,首当其冲就是用户的大量投诉。因此,数据库层面必须保障数据强一致性,网联平台从数据库安全到数据库容灾,再到数据库灾难恢复都努力做到这一点。
(一)数据库安全
目前,平台选用MySQL数据库,是目前世界上较为成熟稳定的数据库,且是全球最受欢迎、使用率最高的数据库,足以保障平台的安全、稳定运行。在该数据库下,交易要么成功、要么失败,并且各个交易间相互独立,互不影响,从而保障了清算服务不出差错。平台在设计之初将交易流水号和机构号上设置为唯一,确保了任何一家机构的交易流水号的唯一性,进而保障了清算服务不重复。任何交易的产生都会持久化到磁盘上,保障了数据不遗漏。
为保障数据存储的完整性,[网联使用数据库异常自动切换组件,最大程度的提高可用率。网联数据库集群选用主备架构,在主库出问题时如何保障数据一致性呢?网联选择在成熟的高可用自动切换组件基础上,进行二次开发,保障主备之间强一致性。如果单台数据库出现故障,监控程序会自动探测多次,确认异常后,再交给仲裁探测,双方确认数据库异常后,开始检查主备数据一致性状态,只有数据一致,才会发生自动切换,否则该套数据库停止提供服务。如果主备都异常,会在提交央行大额清算系统前从同城灾备数据库中拉取数据,应用日志也会抓取交易成功数据,全面保障数据最大化和最终一致性。
(二)数据库容灾
在容灾方面,平台整体采用多地多中心的分布式架构,整个数据库集群采用成熟的CDS组件进行分库分表,确保数据相互独立又完整统一。任何一套数据库都包含同机房主库、同机房备库、同城灾备、异地灾备4台机器,某城市出现地震等灾难性故障时,能及时从同城灾备或异地灾备中恢复数据。那么容灾备库是如何保证和主库的一致性呢?为了尽可能减少对业务的影响,网联容灾库选用异步方式同步,仅从数据库角度显然无法保证容灾库的强一致性。为此,网联采取了多项措施,包括从应用日志中恢复数据、交易到清算半同步方式,如果交易主备都宕机,可以从清算库恢复交易数据、兜底等等方式,保证数据最终一致性。
完备的内部高一致性
为保障交易清算一致性,网联内部做了大量的方案,通过与市场顶尖专家充分探讨,理论与实践相结合,最终采取按每小时清分一次的方式进行任务处理。当一小时的交易都完成时,系统会首先校验交易和清分数据的一致性,发现异常时及时告警,通知相关人员紧急处理。接着其次,清算系统在发起清算任务前,也会自动检查上个批次交易数据的准确性,如果发现数据不一致,清算任务会自动停止,监控通知人工介入,宁可延迟至下一批次清算,也坚决不能让清算出错。如果在规定时间内,数据恢复一致,会立刻启动对该批次的清分任务,保证了交易清算数据的一致性和最大化。如果恢复时间较长,不能在规定时间内恢复,那么对清算库现已有的数据清分,先保证清算最大化。遗漏的数据通过第2天进行补清分和补对账确保数据一致。
网联会将清算结果生成对账文件,分别发送给相应银行和机构确认,确保网联清算的数据与机构、银行三方一致。那对账文件是何时生成的呢?清结算系统在清分时按原有清分逻辑进行处理,在批次清分汇总任务完成后,清结算系统主动向对账系统生成对账通知:某个批次、某些中心、某些库、总笔数(以库为单位分别统计)、清分状态信息。
对账系统收到清结算系统通知后,对账子系统按照某个批次、某些中心、某些库、清分状态读取清算库的交易记录,对账子系统根据通知的总笔数进行数据完整性校验,校验完成后生成常规交易对账单,保证清算与对账单数据结果的一致性。
参与者一致性
交易以平台状态为主,网联会将清算结果生成对账文件,分别发送给相应银行和机构,让他们确认,确保网联清算的数据与机构、银行三方一致。清结算系统在清分时按原有清分逻辑进行处理,在批次清分汇总任务完成后,清结算系统主动向对账系统通知。对账系统收到清结算系统通知后,对账子系统读取清算库的交易记录,对账子系统根据通知的总笔数进行数据完整性校验,校验完成后生成常规交易对账单,保证清算与对账单数据结果的最终一致性。
为解决交易不一致问题,网联平台建立了交易查询重试、关单机制、终态通知、对账机制、差错处理等多重机制,确保与银行、机构三方数据一致性。具体流程如下:
首先,机构会发起交易,通过报文发给平台渠道,渠道会转发交易模块进行处理,同时调用银行前置接口查询交易状态,如果处于未名状态,则会重试3次,最终会将网联交易状态置为终态,返回支付机构,协议支付整个过程最长持续1分钟,退款和付款10分钟,最后进行关单处理。整个过程在架构和报文上保证了三方一致性。
其次,每个批次清算完成后还会进行对账处理,平台会给机构和银行发送对账文件,机构和银行会与平台进行对比,如果发现不一致,将立刻通知网联,如果平台发现数据存在缺失,会进行补对账处理,重新生成对账文件,发送给机构和银行,确保三方对账一致。
最后,当银行或机构发现自己对账文件和网联对账文件不一致时,银行或机构会始终以网联平台为准,银行或机构将走差错处理。如果出现银行扣款,但用户还未收到商品时,此时银行就会将这笔资金退换给用户,用户就不要再担心多扣款的情况了。
综上所述,网联平台会从各个维度去保障数据一致性,即使机构或者银行造成了不一致,网联也会把他们纠正为一致状态。即使极端情况下,出现数据短暂不一致场景,平台也会通过对账、差错处理等措施把数据补上,保障数据最终一致性。