【问题标题】:High-performance storage for messages消息的高性能存储
【发布时间】:2013-04-29 19:22:45
【问题描述】:

我一直在寻找用于在 Java EE 环境中持久化 soap 消息的高性能文件存储解决方案。

我们目前在 Oracle RMDBS 上使用 CLOB 表,但扩展成本非常高。虽然 oracle 可以很好地存储相关元数据,但它在消息内容方面表现不佳。在带有 CLOB 的表上插入比没有它的表性能差大约 1000%(这是通过比较 VARCHAR2(4000)-insert 与 CLOB-insert 的性能来衡量的,当 CLOB 已禁用行内存储时)

在文件系统上持久化消息是一种选择,但我非常怀疑普通文件系统每天如何存储数百万个文件。考虑到我们必须将这些文件保存几个月,这听起来不太对。

我知道有几个开源键值数据库(jackrabbit、mongodb 仅举几例)可以胜任这项任务,但我只是找不到时间来评估它们。我也想听听开源 RMDBS 的性能。

考虑到传输的消息量不断增加,优先考虑的是低延迟和高性能。我们不需要集群或事务性,并且系统故障导致的(少量)数据丢失是可以接受的。

要求:

  • 当消息大小为 8 KB 时,必须能够保持至少 100 条持久消息/秒的速率
  • 必须能够存储至少 1 亿条消息
  • 必须支持按年龄删除持久消息
  • 在删除过程中必须支持持久化
  • 必须支持按 id 检索消息

感谢您的帮助

【问题讨论】:

  • 我会尝试 couchDB,但我不知道这比其他数据库解决方案更适合您的使用。你会想要阅读所有这些。此外,如果您的 IT/DBA 不支持 mongodb 或 couchdb,您可能希望使用它们。
  • 我们实际上设法通过将 lob 存储切换到 SECUREFILES 来大幅降低 Oracle 负载。尽管如此,我认为我仍然必须评估开源选项。完成后我会发布一篇关于我的发现的帖子。

标签: java jakarta-ee messaging


【解决方案1】:

Here 是 MongoDB 和 SQL Server 之间的一个很好的比较(我相信 Oracle 会有类似的性能)。从图表中可以看出,Mongo 每秒可以处理 20 000 次插入。 Mongo 也有基于 JSON 的查询语言,它几乎可以像常规 SQL 一样做所有事情,它有分片集群和副本集,可以处理所有必要的备份和故障转移(一些基本信息 here)。

此外,如果您有兴趣深入挖掘,10 gen 将在两周内获得 online course 并获得证书。

【讨论】:

    【解决方案2】:

    您可以尝试以下产品:

    • HBase
    • MongoDB
    • 卡桑德拉
    • Solr 4.0(仅限)

    这些是我有经验的人。市场上还有很多其他的好产品可以满足您的需求。

    一些观察:据我所知,它们都没有开箱即用的“按年龄删除”功能。但是实现它应该非常简单。我必须假设在 MogoDB 中更容易。

    如果您将尝试 Solr,则应坚持使用 4.X 版本,因为这些版本是唯一支持近实时提交的版本,它会影响您的“删除和插入”要求。

    它们都具有出色的性能,但我没有按照您的要求运行基准测试。如果我是你,我会制定自己的基准。

    【讨论】:

      【解决方案3】:

      Oracle11g 引入了重复数据删除功能。此功能将提高使用 clob 的 oracle 数据库的性能。

      【讨论】:

      • 因为存储的消息是唯一的,重复数据删除没有提供任何改进 - 但是压缩在 xml 上效果很好
      【解决方案4】:

      这是我迄今为止发现的。我会在评估每个产品后尝试更新这个答案。

      我使用 MongoDB 开始了我的实验,这在纸面上看起来是一个可行的选择。以下是我的发现的摘要:

      • 用 C++ 编写
      • 复制(replicaset)需要 3 个节点才能实现高可用性
      • 其中一个节点被选为master——只有master可以写
      • 通过分片(分区)进行横向扩展
      • 每个分片本质上是一个副本集 - 因此分片环境需要至少 6 个节点才能实现高可用性
      • mongod 实例消耗所有可用内存 - 应使用虚拟化进行资源分区(如果您打算在同一硬件上运行应用服务器)
      • Master 连任最多可能需要 1 分钟
      • 文档集合(表)在写操作期间使用排他锁
      • Java API 非常易于使用,并且包含一个名为 GridFS 的虚拟文件系统
      • 1kbyte 文档在测试系统上的单节点写入性能约为 20000 次插入/秒
      • 1kbyte 文档的单节点读取性能约为 20000 次读取/秒

      MongoDB 在两个数据中心配置上需要 6 个节点,这让我进一步寻找更具成本效益的解决方案。

      Apache Cassandra:

      • 用 Java 编写
      • 复制需要 3 个节点才能实现高可用性
      • 数据库经受住网络分区的影响
      • 复制算法专为多个数据中心设计
      • 所有节点都是可写的
      • 可以通过添加更多节点(达到一定限制)来实现横向扩展
      • Cassandra 可能需要 JVM 垃圾收集调整
      • Java API 不是最容易使用的
      • 1kbyte 文档的单节点写入性能约为 7000 次插入/秒
      • 1kbyte 文档的单节点读取性能约为 7000 次读取/秒

      虽然 Cassandra 在单节点配置中速度较慢,但​​在高可用性配置上的写入性能将与 MongoDB 的性能相匹配。在每个节点上执行写入的能力(即使在网络分区期间)是非常受欢迎的日志记录功能。

      沙发床:

      很遗憾,我无法测试 Couchbase。

      现在我们将继续使用 Oracle SecureFiles。我们会用完 Oracle 上的资源吗,Cassandra 和 MongoDB 似乎都是可行的替代方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2016-03-30
        • 2017-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多