Skip to content
架构中级阅读约 1 分钟

架构实战 · 银行核心系统(强一致 / 对账 / 两地三中心 / 等保) ​

本篇定位

讲清一套持牌金融机构的核心联机链路:渠道接入→前置→核心账务→支付通道→对账清结算,重点攻克资金强一致、分布式事务、幂等防重放、对账冲正、审计留痕、两地三中心 RPO≈0、等保三级。方法见 架构方法论、容量估算、高可用蓝图。

阅读对象:有互联网高并发经验、想转行金融/政企的 SRE。本文假设你已了解 MySQL 分库 与 Redis,重点讲金融特有的"钱与合规"约束。

一、业务特点与规模估算 ​

金融系统与互联网最大的区别:可用性与一致性 > 延迟与吞吐,一切为"钱不能错、不能丢、可追溯"让步。

指标日常峰值(发薪日/大促转账)说明
个人客户累计3000 万-实名+KYC
日活 DAU100 万300 万手机银行为主
联机交易 TPS20008000转账/缴费/支付核心写链路
联机查询 QPS1 万5 万余额/明细查询读多
日交易笔数800 万2500 万含代扣、代发
账户余额/流水库增量 20GB/天-核心流水需留存 15 年
单笔交易 RT 要求≤ 300ms≤ 1s核心账务链路
系统可用性99.99%99.99%核心年化停机 ≤ 52 分钟
RPO / RTORPO≈0 / RTO≤30min-两地三中心硬性指标

核心结论:读流量靠缓存与读副本,资金写链路必须强一致,绝不用"最终一致"对付余额;所有交易全程留痕、可对账、可冲正。

1.1 容量推演(数字如何自洽) ​

推演项计算结论
核心账务服务所需副本8000 TPS ÷ 单副本约 1200 TPS ≈ 6.7,留 30% 冗余8 副本
MySQL 分库数单库稳写 1000 TPS,8000 TPS 需 8 库8 主库(按客户号哈希)
单库连接/内存每主库约 300 应用连接 + InnoDB buffer pool 占内存 60%32C128G
Redis 容量会话+令牌约 5000 万 key × 1KB ≈ 50GB,主从高可用3 主 3 从分片
流水增长20GB/天 × 365 × 留存 15 年 ≈ 110TB,冷热分离历史库+对象存储归档
同城复制带宽峰值 8000 TPS × 平均 2KB redo ≈ 16MB/s 写入复制量裸光纤 1Gbps 足够

原则:金融按"稳态 + 30% 冗余"配,不按极限压测配;机器宁多不可挤,因为核心系统扩容窗口极短、变更极慎重。

二、总体架构图 ​

2.1 一笔转账的强一致交易链路 ​

关键点:本地事务管内部两户记账,跨通道部分用 TCC/悬挂+对账兜底;绝不让"通道成功、本行落账失败"这种钱不平的状态长期存在,靠 T+0 准实时对账与冲正收敛。

注意:交易链路上的每个写操作都必须带全局唯一流水号(txn_id),它是幂等、对账、审计、冲正四件事共同的关联键;没有流水号的交易等于"裸奔"。

三、服务器清单 ​

角色数量CPU(核)内存系统盘/数据盘(类型/容量/IOPS)带宽(内网/外网)每台装什么
四层负载2(主备)1632GESSD 100G / 系统盘外网 500Mbps 多线BGPLVS+Keepalived;见 LVS
API 网关41632GESSD 200G外网 500MbpsAPISIX/Nginx,验签限流
渠道前置41632GESSD 200G内网协议转换、路由
核心账务服务83264GESSD PL2 300G / 3万IOPS内网记账/冻结/落账,多副本
支付转账服务41632GESSD 200G外网 200Mbps对接通道、回调验签
客户/账户服务41632GESSD 200G内网开户/实名/限额
查询明细服务41632GESSD 200G内网余额/流水查询
对账清结算41632GESSD 500G内网对账/冲正/清算
审计/监管报送2816GESSD 500G内网留痕/报文生成
MySQL 核心账户库8主16从32128GESSD PL2 2T / 5万IOPS内网按客户号分 8 库;见 MySQL
MySQL 流水/历史库4主4从1664GESSD PL2 4T内网冷热分离,历史归档
Redis Cluster6(3主3从)1664GESSD 200G内网会话/令牌/余额缓存;见 Redis
Kafka51664GESSD 2T内网交易事件/审计;见 Kafka
对象存储 MinIO41664GHDD 8T×4内网凭证影像/对账文件
监控2832GESSD 1T100MbpsPrometheus/Grafana;见 SLO
同城灾备中心1套同构---裸光纤复制核心库半同步/存储复制,RPO≈0
异地灾备中心1套精简---专线异步复制日终批量复制,RPO≤15min

合计生产自建约 70 台(不含同城/异地灾备同构资源)。与规模自洽:核心账务 8 副本扛削峰后 8000 TPS 的记账压力,MySQL 按客户号分 8 库把单库写 TPS 压到 1000 量级,符合金融库稳为主的策略。

3.1 为什么这样配(自洽说明) ​

  • 核心账务服务 8 副本:单副本稳定处理约 1200 TPS(本地事务+行锁),8×1200≈9600 TPS,覆盖 8000 峰值并留冗余;该服务是 CPU+锁密集型,故给 32C64G。
  • MySQL 8 主 16 从:一主两从,从库承接查询与灾备;半同步复制保证主库宕机不丢已确认事务;32C128G 主要喂 InnoDB Buffer Pool(占 60%≈76G)。
  • Redis 3 主 3 从:会话/令牌/余额缓存总量约 50GB,分片后单主内存压力小,主从切换对缓存类可接受(重建即可)。
  • 带宽:金融外网流量不大(报文小),瓶颈在数据库内网复制与存储 IOPS,故数据盘选 ESSD PL2 高 IOPS 而非大带宽。

3.2 关键中间件版本(2026 现状) ​

组件选型版本说明
MySQL8.0.36+窗口函数、原子 DDL、并行复制;金融库少用 8.4 LTS 以保稳定
Redis7.2.xCluster 分片,避免大 key 与热 key
Kafka3.7.x交易事件缓冲,acks=all + 副本 3
K8s1.30.x无状态服务容器化,有状态数据库虚机部署;见 K8s
JDK17 LTS核心服务运行时,G1/ZGC

四、服务依赖与各自解决的问题 ​

服务解决什么问题与谁交互同步/异步
LVS+Keepalived四层入口高可用,主备切换网关同步转发
API 网关统一验签、TLS 卸载、限流、黑名单前置同步
渠道前置多渠道协议转换、报文组装核心/支付/账户同步
核心账务唯一记账入口,冻结/落账/冲正MySQL、Kafka本地事务同步写库
支付转账对接人行/银联,回调验签外部通道、Kafka同步调通道,异步回调
客户/账户实名、KYC、限额、开户MySQL、Redis同步
查询明细余额/流水读多Redis、MySQL 从库同步读,读写分离
对账清结算行内/通道对账,差错处理与冲正Kafka、MySQL、OSS异步消费+T+0批量
审计报送全程留痕、监管报文Kafka、OSS异步,不可篡改

同步/异步边界铁律:凡是动钱的链路(记账、扣款、落账)一律同步+本地事务,必须等数据库提交成功才返回用户;凡是"事后"的动作(审计、报送、通知、对账)一律异步走 Kafka,绝不让用户为写审计日志多等 100ms。

五、关键设计点与坑 / 注意事项 ​

  1. 强一致优先:账户余额这类资金字段,读也要读主或读已提交,绝不能容忍主从延迟导致"余额扣了却看到旧数"。对延迟敏感的记账查询一律走主库。
  2. 分布式事务选型:行内两户记账用本地事务;跨系统(本行↔通道)用 TCC(Try 冻结 / Confirm 落账 / Cancel 解冻),长流程清算用 Saga。严禁用本地消息表去"最终一致"一笔真实扣款。
  3. 幂等与防重放:每笔交易带客户端 clientReqId + 服务端流水号双重去重;回调、批量、重试全部幂等。接口加时间戳+nonce 防重放,签名验签防篡改。
  4. 悬挂与空回滚:TCC 必须处理"Try 没到、Cancel 先到"的悬挂,和"空 Cancel";用事务状态表记录分支状态。
  5. 对账与冲正:T+0 准实时对账(行内账务 vs 通道报文),T+1 全量对账;差错走冲正交易原路退回,绝不允许"手工改库"。
  6. 审计留痕:所有交易、登录、后台操作写不可篡改日志(只追加、哈希链、异地保存),留存 15 年,满足等保与监管。
  7. 灰度与回滚:核心系统变更走灰度(先 1% 渠道/网点),备好一键回滚与交易旁路;大版本必须在窗口内发布,拒绝无回滚方案上线。
  8. 监管报送:反洗钱(AML)、大额可疑、1104 报表按监管报文规范生成,字段错误会被监管退回,要有独立校验服务。
  9. 热点账户:手续费过渡户、公共手续费户是全系统写热点,行锁会打满。做法:拆分多个过渡户(transit_001..N)分摊写,日终汇总。
  10. 批量与联机隔离:日终批处理(结息、对账、清算)与联机交易抢库资源,必须用独立库实例或低峰窗口跑,避免白天批量拖垮联机 TPS。
  11. 多活 vs 主备:核心账务一般不做"双活写"(冲突难处理),而是"同城热备 + 异地冷备",故障切换而非同时写。
  12. 压测与演练:核心系统上线前必须做全链路压测(影子库/影子表隔离流量),每季度做一次同城切换、每年一次异地切换演练,形成剧本。

六、安全与高可用 ​

  • 网络分区:核心区、DMZ 前置区、办公区严格隔离,防火墙白名单;核心库不直接暴露,只允许账务服务访问(见 iptables)。
  • 加密:全链路 TLS/国密 SM2/SM4;存储敏感字段加密(身份证、卡号);密钥 KMS/HSM 托管,定期轮换。
  • 两地三中心:生产中心 + 同城灾备(裸光纤,存储/数据库半同步,RPO≈0)+ 异地灾备(专线异步,RPO≤15min);每年至少两次灾备切换演练。
  • 消除单点:LVS 主备、网关多副本、MySQL 一主多从+分库、Redis Cluster、Kafka 多副本。
  • 准入与权限:运维走堡垒机 + 双人复核;后台操作 RBAC,资金类操作强制二次审批;见 堡垒机。
  • 数据脱敏:测试/开发环境使用脱敏数据,生产数据不出内网;日志中的卡号、身份证号落盘前掩码。
  • 等保三级:物理安全、访问控制、入侵检测、日志审计、数据备份恢复逐项达标,定期测评。
  • RPO/RTO 设计:同城用数据库半同步复制(主库提交需至少一个同城从库收到 binlog),宕机切换不丢已确认交易(RPO≈0);异地用 binlog 异步归档,容忍分钟级丢失。切换目标 RTO≤30 分钟,靠预演练与自动化脚本达成。
  • 变更窗口与熔断:核心系统只在业务低峰(如 0:00–4:00)变更;一旦监控到账务错误率超阈值,自动熔断写交易、切只读保护资金安全。

七、上线后可能出现的状况与应对 ​

类别征兆处置
性能类核心记账 RT 飙高、超时增多查慢 SQL 与行锁等待;定位热点账户(如公共过渡户);临时降级非核心查询
性能类Redis 余额缓存击穿,DB 压力突增热点 key 预热+互斥重建;记账查询临时读主限流
容量类MySQL 单库写 TPS 逼近上限检查分库键是否倾斜;热点客户再分片;历史流水归档到历史库
容量类Kafka 对账事件积压扩分区与对账消费组;排查冲正服务卡死
故障类API 网关卡LVS 自动摘流,流量切其他网关;下调限流保护后端
故障类核心 MySQL 主库宕机按预案提升同城从库,应用切连;期间冻结非必要写,演练过的切换 ≤30min
故障类支付通道回调中断主动查单任务轮询在途交易,状态不丢;对账兜底
故障类同城机房断网DNS/负载切异地灾备,公告渠道,事后补数核对
流量突增发薪日/双十一转账洪峰网关限流+排队;非查询接口降级;核心库读主限流
扩容客户量增长分库不足按客户号再哈希扩库,双写迁移,停写窗口短割接
降级预案外部通道全挂转账交易暂停,余额查询/缴费仍可用;公告+工单
数据类对账发现长短款自动生成差错单,走冲正交易原路处理;禁止直接改库
数据类主从延迟导致查询不一致延迟敏感请求读主;监控 seconds_behind_master 告警
数据类备份/恢复失败定期恢复演练验证备份可用性;异地备份保留多份
合规类监管报文校验失败报送服务拦截报错,人工复核字段后重报,留痕
性能类批量结息拖慢联机批量切到独立只读实例/历史库跑,限制并发
故障类Redis 集群脑裂暂停缓存强一致读主;修复集群后重建缓存
故障类MinIO/对象存储盘满清理过期影像,扩容磁盘,对账文件转冷存储
容量类审计日志暴增打满 Kafka审计异步落 OSS,Kafka 只做缓冲;扩分区
数据类冲正后仍不平挂起人工差错处理流程,双人复核,禁止技术直接改库
故障类K8s 节点漂移导致账务服务重调度有状态账务数据库不上 K8s;无状态副本重建后从 Redis/DB 恢复会话
容量类历史流水库膨胀冷热分离,超 1 年流水归档到对象存储,在线库只留近 6 个月

7.1 分级响应 ​

  • P0(资金风险/核心不可用):5 分钟内升级,自动熔断 + 切换同城灾备,通知业务与合规。
  • P1(部分渠道慢/非核心故障):30 分钟内处置,降级非必要功能。
  • P2(容量告警/慢查询):工作时间处理,纳入下一个变更窗口。

相关阅读:架构方法论 · 容量估算 · 高可用蓝图 · MySQL · Redis · Kafka · LVS+Keepalived · K8s 架构 · SLO · 容量与容灾