【问题标题】:Architecture question for performance and scalability性能和可扩展性的架构问题
【发布时间】:2011-06-05 23:56:02
【问题描述】:

我有一个完全用 C# 编写的高性能系统(我认为,但还没有 100%),我认为我在设计时犯了一些重大的架构错误。原因是它不易扩展。

虽然它目前运行良好,但我想确保它可以横向扩展,以应对我预计几个月后可能会发生的交易量增加。

这个系统有大量的数据并发连接进入系统,这些数据在处理后最终会进入数据库。我们目前每分钟获得大约 300 条记录/连接。

系统的架构是这样的。

  1. 整个系统托管在 amazon 的 win 2003 服务器 8 GB RAM/4 vCPU infra 上
  2. 获取数据并放入 MSMQ 的 C# Socket 服务器
  3. 用于数据和插入到 sql server 2008 数据库表的处理器。即使在清除定期数据后,其中一个主表也有大约 3 GB 的数据。这具有正确的索引,并且目前的报告速度相当快,即使是到远程位置也是如此。
  4. 然后将处理后的数据发布到 MQ,然后根据规则进行处理,从而生成某些警报
  5. 除上述之外,还有一些其他相关的程序

现在主要担心的是步骤(3)中处理器的可扩展性和Sql server 2008的可扩展性。随着并发连接的大小随着sql server数据的增加而增加,这将使我的生活变得更加艰难。

我想出了 2 个替代方案。考虑到当前系统完全基于 Microsoft 技术构建的事实,其中之一是后端处理器的主要替代品。

对于所有选项,对于最大的主表,使用 postgresql/pgpool III 负载平衡(流复制)解决方案进行存储。其他表和架构仍将保留在 sql 2008 中。这为我提供了一种经济高效的数据库存储解决方案。

选项 1: - 用 JBOSS 和 HornetQ 替换 MSMQ - 将第 3 步中的数据处理器放入 JBOSS ejb 容器中的容器管理的“消息驱动 bean”中,这将为我提供负载平衡和集群的选项。
- 这个选项需要我将我的解决方案的主要部分转移到 unix/linux(我正在考虑 fedora)

选项 2: - 将 MSMQ 替换为 ActiveMQ 队列(集群和负载平衡) - 编写一个 Java 应用程序来处理队列消息并处理数据库持久性。
这个选项将允许我使用 activemq 集群实例和新的 java 应用程序实例来增加 linux 服务器的数量。

选项 3: - 将 MSMQ 替换为 ActiveMQ 队列(集群和负载平衡) - 仅使用当前的数据处理器(通过一些小的改动将数据推送到 postgresql) 此选项将迫使我继续使用 Windows

请注意,该系统是实时系统。如果系统有 99% 的故障证明就足够了。这不是一个交易系统,所以我可以承受少量的数据丢失。

不知道我是否已经清楚地解释了我想要什么。但我欢迎任何问题,因为它们肯定会帮助我更好地解释它。

请提出您宝贵的建议,以便为长期解决方案做出正确的选择。我自己实际上反对选项 3,但不想再犯错误,将其排除在列表之外。

穆图

为澄清而添加:

抱歉,不清楚。 1.问题实际上是关于架构的可扩展性。尤其是水平可扩展性。 2. 当前的平均负载约为每分钟 300 次,这可能不会完全在一分钟内传播。 3. 在接下来的 8 到 12 个月内,负载可能会更容易扩展到 10 倍。

问题是我们在一个月内销售了大约 50 台设备,而现在销售团队的发展速度太快了。我相信这可能很快会翻倍。

Sql server 有大约 8 GB 的数据,我们限制了每台设备的存储量,这有助于减小大小。目前最大的表被划分为每 200 个设备 1 个分区,查询是合理的。但我可以看到 Sql 方面的可扩展性瓶颈。

所以即使 Sql server 放在另一台服务器上,我可以在 sql server 上进行的同时更新量也会受到限制。我看不到具有 Sql 服务器负载平衡的水平可扩展性选项(尽管它支持具有集群的高可用性选项)。我是不是对负载均衡中的 MS Sql 有误解?

【问题讨论】:

  • "现在主要担心的是步骤(3)中处理器的可扩展性和 Sql server 2008 的可扩展性。" - 3GB 的数据不多。毫无疑问,SQL Server 2008 的扩展性比你我写的任何东西都要好!

标签: java sql-server performance postgresql architecture


【解决方案1】:

性能和可扩展性是完全不同的东西,您不应混淆它们。所以我的第一个问题是:“你的问题到底是关于什么的?”。

有点简化,但是:提高性能意味着您可以在更短的时间内执行给定的任务。可扩展性衡量您的系统在添加资源时增加其吞吐量的能力。

可扩展性完全与架构有关,所以我有点困惑,为什么您如此强调工具而不是架构本身。 MSMQ 在许多方面都具有很好的可扩展性,而 SQL Server 不能很好地横向扩展(与大多数关系数据库一样),但在纵向扩展场景中却非常出色。

您说您主要关心的是数据处理器。因为我假设传入的连接是相互独立的,一个标准的解决方案是物理的两层,并为 SQL Server 设置不同的机器(这就是 SQL Server 喜欢它的方式)。然后,SQL Server 可以担心(磁盘)I/O 并利用其机器的全部 RAM,而网络处理程序/数据处理器会消耗 CPU 周期,这些周期很容易扩大(或扩大,通过不同机器上的多个副本得到寻址)负载均衡器)。

Stackoverflow 不太适合这种讨论,因此我们需要将 cmets 保持在最低限度,并改为修改问题和答案。

【讨论】:

    【解决方案2】:

    取决于连接数,每个连接每秒更新 5 次并不多。你没有说你有多少人脉,预计会有多少人脉。

    在 Java 中,在您的情况下(我想在任何技术中都一样容易),我会做的是使用批量数据。

    消息传递和数据库的性能问题通常与您执行的消息/事务的速率有关。我将有一个任务/线程,它将所有消息挂起并将它们滚动到一个批处理中,一个 MQ 消息,一个事务到数据库。该解决方案的优点在于 MQ 消息传递越慢,批次越大,它处理每个连接消息的效率就越高。剩下的问题是,消息传递/数据库能否处理数据带宽。

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 2011-12-21
      • 2014-04-28
      • 2018-08-26
      • 1970-01-01
      • 2020-03-27
      • 2012-05-10
      • 2019-09-21
      • 2012-01-31
      相关资源
      最近更新 更多