证券交易所行情数据架构的简单实践

公司引进了上海证券交易所和深圳证券交易所行情数据,行情数据分为两个解绑level-1,和level-2 ,我们用的是level-1,在level-1中 上交所数据的更新频率是 5s(据说要升级到3s),深交所的更新频率是 3s;截止到2016 最新的上市公司情况为:

2016年10月18日中国股市上市公司数量、总市值
股市总况 深圳股市 上海股市 沪深合计
上市公司(家) 1,824 1,140 2,964
上市证券(只) 4,225 8,664 12,889
总 市 值(亿元) 227,321.16 275,085.14 502,406
流通市值(亿元) 155,204.35 233,509.40 388,714

那么一天的交易时间按照 4小时计算,单是股票行情逐笔数据的数据量大概为:2964*(60/3)*4*60 条,同时需要汇总生成 1分钟,5分钟,15分钟,1小时等行情数据,每个交易日大概为1600w左右,如果再加上其它指数等数据数据量还会增加不少,而这些数据要全部存储下来,行情的历史数据还是比较值钱的;如果把连续几年的逐笔数据存储下来然后进行相关的研究对金融方面的理解还是比较有益的;整体来说这种数据每天的量不是很大,但是一般这种数据都是供行情应用使用的,所以对稳定性要求高一些;下面简单介绍下,笔者使用架构,很普通,够用就好;

level1

一般接收证交所的行情数据都是使用专线的,这个没有什么特别的,一般的IDC都提供专线接入;证交所的数据一般需要落地到一台windows上,因为其提供的基本就是这种win版的数据同步客户端,这里称之为sessinfo node;我们使用的Mysql作为短期存储,开始使用的基本架构是:

34a1587b-b8e3-411e-9539-a2082e11597f

在sess-info-net node上面同时运行了自行开发的转码工具,将证交所发送过来的数据快照,转码为数据库数据,数据库使用传统的M-S架构,这种架构存在的缺点是master 会成为单点,Replication 功能可能会停止,这都会造成前端数据的不正常,而影响整体的功能;那么我们发展的一个方向是改造成,多主结构,即数据会同时写入多个节点,但是多写的数据一致性是需要保证的,完全自己单独开发一个中间件似乎也不太现实,这里我们选取了cobar–简单、轻量、易用,还有源码;

level2

需要注意的是 cobar如何完成多多个表的同时写,注意这里不是分表;经过一段的测试并没有网上所说的有关cobar的那些问题;那么此时的问题是cobar 成为单点,对cobar做一个高可用,似乎不妥,因为cobar节点的切换也是需要时间的,那么怎么办呢?于是又做了些改进:

level3

这里自行开发了 快照传输程序,即将行情快照,同时向一个节点将快照发送出来,然后在reciver node上进行转码然后存储到一个备份mysql当中,如果cobar有问题,或者几个主同时宕机了也不会丢数据;对外提供数据时,同时走代理将负载分发到不同的节点上,这里的代理的使用可以参考:confd+haproxy+etcd;

上面就是整个架构的简单描述,细节上需要注意的是自己开发的快照转码产生的数据量,以及快照传输问题,还有就是代理的设置问题,比如代理节点的修改,无缝切换(haproxy 无缝切换)等问题;

发表评论

电子邮件地址不会被公开。 必填项已用*标注