【问题标题】:Is this a logical way to log real time data into a database?这是将实时数据记录到数据库中的一种合乎逻辑的方式吗?
【发布时间】:2014-01-27 06:50:58
【问题描述】:

改写的问题
是否有其他(通用)解决方案来记录将通过客户端 Web 应用程序使用的实时数据?

背景
我有一个在小型嵌入式 Linux 机器上运行的 Web 应用程序。它将有许多连接到它的子卡,用于监视/控制其他设备。有单独的进程运行以通过 Websocket 控制各种 IO 和与客户端的接口。由于用户的唯一界面是通过 HTML,检索数据、绘制数据等对我来说最有意义的是从数据库而不是原始文件系统中提取数据(我以前为富客户端软件做过)。

担忧
虽然我提出的模式最小化了数据库的大小,但LogSample 表很大是否存在性能问题?假设每天运行 8 小时的采样率为 1Hz:3600 samples * 8 hours * 10 LogValues = 288000 LogSamples / day

建议的数据库架构

LogRecord
---------
  + Name
  + Start
  + Stop
  + Notes
  - LogValues ----> LogValues
                    ---------
                      + Name
                      + Units
                      + Sample Rate
                      - Samples ----> LogSample
                                      ---------
                                        + Time Stamp
                                        + Value

地点:

  • 带下划线的名称是独立的表格
  • ----> 表示一对多关系
  • 采样率最高为 5Hz(目前计划为 1Hz)
  • 时间戳将是一个整数,表示自开始时间以来的样本数

系统信息
最大连接用户数:15
数据库:sqlite3 或 PostgreSQL 操作系统:Ubuntu 13.04
Web 框架/ORM:Django

【问题讨论】:

    标签: python database django web-services database-design


    【解决方案1】:

    我认为这个问题的答案取决于以下决定:

    这些数据是临时的吗?

    如果是,您最好将样本推送到 RabbitMQ 之类的东西中,以供 websocket 连接的客户端使用,或者使用现有的解决方案,例如 statsd+graphite。这将消除 postgres 的许多存储/性能问题,并将它们放入旨在处理这些用例的软件中。

    这些数据是否需要永久可用?

    继续使用 Postgres,但请确保您尽可能使用仅附加语义(这意味着不要连续写入 LogRecord.Stop)。我还会有一个辅助数据通道,例如 Redis Pub-Sub 队列,用于将结果分发给实时客户端。如果您同时进行连续写入和轮询,则会导致性能瓶颈。

    附录:我认为您的模式映射是倒退的。为了保持 1 LogRecord 与许多 LogFields 的一致性和不变性(LogField -> LogSample 等),您需要以下结构:

    LogRecord <--,  LogField <--,  LogSample
    ---------    |  ---------   |  ---------
    + Name       `--+ Record    `--+ Field
    + Start         + Name         + Time Stamp
    + Stop          + Units        + Value
    + Notes         + Sample Rate  
    

    另外,请按照这个简单的教程来设置 Postgres 以提高性能:

    【讨论】:

    • 数据在过程中记录实时数据(如果出现问题,稍后查看),这就是我使用 SQL 数据库的原因。一般来说,只有 1 个写入者(记录数据)和 1 个或 2 个消费者查看过去的数据。数据需要和闪存一样长,所以我同意 postgres。感谢您提供有关 postgres 性能的提示。你画的模式是我脑子里想的,把它数字化就好了。
    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多