选择数据库以每天插入数百万行以为每个用户绘制图形

时间:2019-04-26 10:32:09

标签: database-design architecture scalability system-design

我正在编写一个微服务,该服务需要存储和检索大量净值与时间数据以绘制图形。

基本上,我需要通过cron为每个用户的净资产存储大量数据。

有2万个共同基金可供用户投资。当前,有8000万用户,其中2000万已经投资了多个共同基金。这些数字正在迅速增长。

共同基金的价值每天在数据库中更新。使用共同基金的最新价值,更新所有用户的净资产。

现在,我面临的挑战是创建可伸缩的设计,以每天存储 (用户名,networth,日期) ,以绘制用户进行首次投资时的图表。

我的问题如下:

  1. 我应该使用哪个数据库?

  2. 一旦选择了数据库,每天可插入约1亿条记录的可伸缩性方法有哪些。

谢谢。

1 个答案:

答案 0 :(得分:0)

据我了解,每天都会为每个用户生成新数据,正如在问题中提到的那样,所需的容量是每天插入1亿行。但是,重要的是要知道过去需要将记录保留在数据库中多久了?数据需要保存一个月,一年或五年吗?假设趋势图使用过去一整年的数据,则所需的总行数为1亿* 365(天),即365亿行,即360亿行。假设一行占用24个字节,则所需的总容量约为1TB(四舍五入)。为所有用户存储1年的数据会很好。到年底,可以将数据存档,并可以在明年年初恢复全部容量。

考虑到数据不需要ACID支持,因为它不是事务性数据,并且数据在不同实体之间没有任何关系,因此NoSQL数据库似乎很适合。假设将运行批处理作业并一次为所有1亿用户插入更新后的净资产,则似乎有必要使插入时间保持非常短的时间。具有快速写入支持的键值对数据库(例如Cassandra)似乎是一个不错的选择。分区键将是用户标识。数据的性质也是如此,因此它是不可变的,因此Cassandra的基础数据存储结构仅是追加的,这使其更加适用。

由于数据是不可变的,因此使其非常适合缓存。根据缓存的容量,可以将全部或部分日常活动用户的数据保留在缓存中,以服务于绘制图形所需的查询。 LRU缓存可能是一个不错的选择。

注意:如果不能选择NoSQL数据库,则基于userid进行分区的关系数据库也将完成此工作。

希望它能提供一些指示,如果除了问题中提到的使用场景之外,还有其他使用场景,答案可能会改变。