TDengine在同花顺组合管理业务中的优化实践
项目背景与问题
依赖多,稳定性较差:PMS作为多品种的投后分析服务, 需要使用到各种日线数据、当天实时行情数据、当天分钟数据等,在数据获取方面需要依赖Http以及Postgres、LevelDB等数据库。过于多的数据获取链路会导致平台可靠性降低,同时依赖于其他各个服务,导致查询问题过于复杂。 性能不能满足需求:PMS作为多品种投后分析,在算法分析层面需要大量的行情获取,而且对行情获取的性能也有较大的要求,当前所有行情会占据大量分析的性能。
技术选型
ClickHouse:运维成本太高,扩展过于复杂,使用的资源较多。 InfluxDB:可以高性能地查询与存储时序型数据,被广泛应用于存储系统的监控数据、IoT行业的实时数据等场景;但是集群功能没有开源。 TDengine:性能、成本、运维难度都满足,支持横向扩展,且支持高可用。
数据清洗,剔除格式不对的数据; 由于历史数据过于杂乱,采取脚本生成csv形式并直接导入,后续增量数据由Python实现脚本导入数据。
数据库建模以及应用场景
数据格式固定,自带时间戳; 数据极少需要更新或删除; 数据标签列不多,而且比较固定; 单条数据数据量较小,字段较少。
每天数据量大,超过2000W; 需保留近几年数据。
子表很多,约20W张表; 每天数据20W; 需保留近30年数据。
以品种类型作为超级表,方便对同一类型的数据进行聚合分析计算; 标的本身包括标的信息,直接将标签信息作为超级表的标签列,每个品种作为子表。
落地实施
数据写入:由于历史行情数据会存在大量的历史数据,不是只接收当前新增的数据,这对历史数据的迁移有很大的挑战。当前TDengine数据库对于现有数据的导入,通过insert语句达到批量更新,会导致历史数据迁移耗时很大。为了解决该问题,我们在本地建立缓存,将现有csv文件修改为可执行导入的形式,直接通过csv导入,大大提升了写入速度。在这个过程中,我们还发现了一个问题:通过csv导入的时候,如果采用自动创建表的方式,会在几个版本内出现崩溃。通过询问官方,他们不建议在导入csv的时候创建表,后来我们就拆解为先创建表结构再进行csv导入,问题得到了解决。 查询问题:查询单点问题。TDengine原生HTTP查询是直接查询特定服务端完成的。这个在生产环境是存在风险的。首先,所有的查询都集中在一台服务端,容易导致单台机器过载;另外,无法保证查询服务的高可用。基于以上两点,我们在TDengine集群使用过程中,在应用使用创建链接的时候会配置多台Http的接口来解决单点问题。 容量规划:数据类型、数据规模对TDengine的性能影响比较大,每个场景好根据自己的特性进行容量规划,影响因素包括表数量、数据长度、副本数和表活跃度等。根据这些因素调整配置参数,确保佳性能,例如blocks、caches和ratioOfQueryCores等。根据与涛思数据工程师的沟通,我们确定了TDengine的容量规划计算模型。TDengine容量规划的难点在于内存的规划。
改造效果
改造后性能对比情况,可以看到性能提升明显。
改造后稳定性对比情况:改造前调用数据情况共40W次,共出现异常0.01%的异常,改造后出现异常降低至0.001%。
TDengine问题解决
restfulRowLimit
可以控制返回结果集的大条数。
总结
支持更加丰富的SQL语句; 灰度平滑升级; 可实现自定义聚合方法; 更快的数据迁移。
tick、minute行情数据的迁移以及线上应用; 采取自定义聚合方法实现分钟行情、日线行情的聚合计算; 当天实时行情的数据的管理。
来源 https://www.modb.pro/db/168858
相关文章