合规风控系统是很多金融企业极其重要的业务系统,这里面既包含了金融监管的要求,也有企业内部管理的要求,而这类系统往往存在着上游系统较多、数据链路复杂、数据不同步等多种问题。本文将会以业务系统运维+DBA的视角,提供一个基于OceanBase改造的方案,旨在降低系统架构的复杂程度,减少ETL以及数据不同步带来的问题。
现有方案
如图所示,合规风控系统是基于Oracle数据库的系统,其中上游数据主要由如下几个部分组成:
实时交易数据。保存在上游的多个Oracle数据库中,为了尽可能降低业务时间对系统的负载,不会直接频繁读取,而是从Dataguard同步备库,再从备库同步到一个MySQL中间库。通过合规风控系统的调度任务,每分钟取数一次。实时性要求高,容错率低。主要用于实时的交易监控。
盘后交易数据。同样保存在上游的多个Oracle数据库中,每天盘后读取,直接从备库取数,无需中间库同步。与实时交易数据相比,对实时性要求较低,而且容错率较高。主要用于盘后的反洗钱、异常交易、风险控制等多个模块的计算。
外部文件。业务需要的数据文件,包含TA文件、估值文件、离线行情文件、黑名单文件、场外基金信息等等。这些既有行情文件这样实时读取的,也有每天定时读取的。特点是格式不统一、实时性要求不一,与其他数据存在着依赖关系。
实时行情数据。主要是交易所行情网管提供的流式行情数据,用于盘间的行情计算,在异常交易和风险控制两个模块有应用,其中数据的实时性要求很高。
资讯数据。包含了各类股票、基金、债券、市场公告、舆情等数据,通常以定时推送的方式由资讯供应商落盘方式写入到数据库中。这些资讯不仅仅是合规系统用,交易系统、财务都可能用到。
而数据接入都是依赖于应用系统的数据任务,每个具体的调度任务有自己的时间,并且各个调度任务有自己对应的依赖关系,比如反洗钱计算,需要获得最新的黑名单数据,结合客户数据交易数据来计算,风险控制,需要获得财务数据、持仓数据、行情数据共同计算。而到了月度、季度、年度时间节点,要对净资本、客户、交易多类数据做综合计算,生成报送数据上报监管。实际上不仅仅是一个系统,更加是一个特定主题的数仓。
当前方案呈现出如下几个问题:
数据库架构繁杂,上游数据中,数据库来源较多,交易柜台、财务系统、中间库、资讯数据等等,不同数据库之间版本管理、高可用、多副本、数据同步等等,关联复杂,维护起来成本较高。
存在单点风险,一旦中间库所在的『服务器』或者实例不可用,将会出现合规系统无法正常获取数据的情况。
数据不一致风险,Oracle与MySQL之间的跨平台数据交互,需额外处理兼容性问题,易引发数据一致性风险。
资源隔离问题:两个资讯数据库实际上是在同一个MySQL实例中,易出现资源争用,尤其是数据批量写入或采集时。
根据现有方案,我们来做一个替换方案,选用OceanBase分布式版本4.4。
替换方案
作为分布式多租户的数据库,在替换之前,我们要使用到如下的功能:
多租户机制:OceanBase通过租户实现资源隔离,每个租户类似于传统数据库的实例,可以创建自己的用户、数据库、表等所有客体对象,有自己独立的系统数据库和变量。这意味着你可以在一个OceanBase集群内为交易、财务、资讯等不同业务线创建独立租户,实现资源隔离与管理简化。
金融级高可用:OceanBase通过多副本(通常至少3个)架构保障高可用,数据以多副本方式存储在集群各个节点,保证RPO=0(恢复点目标),甚至支持异地多活。这对于合规系统至关重要。
高度兼容性:OceanBase高度兼容MySQL和Oracle数据库生态,与MySQL业务可无缝切换,并支持Oracle平滑迁移。这降低了从现有Oracle和MySQL迁移而来的复杂性。
HTAP混合负载:OceanBase的分布式并行计算引擎对OLTP和OLAP应用都进行了很好优化,支持跨数据库节点的DQL和DML并发执行,一套引擎即可同时支持混合负载。这使得合规系统既能处理交易类业务,也能进行实时分析。
多副本:无论是及金融监管还是合规角度,都需要多副本的模式,而OceanBase的多副本以及定向访问模式,可以帮助我们在不干扰业务正常进行的情况下,对只读副本取数。
整个改造方案可以按照如下进行:
创建4个Oracle租户,分别为交易系统1、交易系统2、财务系统、合规系统使用。不同的租户之间实现资源与权限的隔离,并且考虑到交易系统和财务系统需要同步数据到合规系统,因此这三个业务系统的租户各自至少2个副本。并且配置定向访问。
创建2个MySQL租户,分别为万得资讯、聚源资讯。而这两个MySQL租户没有多副本的需求,可以直接通过访问原表的方式来获取数据。但是多配置一个租户完成高可用,总是好的。
不同租户之间的数据获取,可以依赖DBLink与数据库自己的定时任务,也可以依赖应用程序本身的调度任务,考虑到如果改用DBLink与定时任务,会对应用程序造成较多的改动,因此本方案依旧使用内置的调度任务。
离线文件OceanBase可以直接读取,同样因为对应用程序的改造比较多,因此保留原有的配置。