问题标签 [horizontal-scaling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
amazon-web-services - 如何使用 AppHarbor 和 DB 插件水平扩展应用程序和数据存储
如果您直接与 AWS 交谈,那么您有几个选择,但基本上您将执行以下操作来扩展您的应用程序:
在 EC2 上扩展应用服务器
您将结合使用 CloudWatch 和 EC2 服务来查看性能指标,并根据您认为合适的方式启动和关闭 EC2 应用程序实例。
扩展 SQL 和 NoSQL 数据库
这取决于 DB 有点不同,但是AWS 从你那里抽象了很多东西,所以如果你使用他们的服务,有办法通过 DB 以编程方式水平扩展。
AppHarbor 问题
Appharbor 引入了工人的概念。工人是否喜欢多个实例,它们是否会自动进行负载平衡?
我可以以编程方式添加/删除工作人员吗?如果是这样,基于什么指标?
如果您使用的是附加组件,例如 MongoLab,为了简单起见,您是否必须通过拥有多个 MongoLab 数据库来手动管理分片,或者附加组件提供者是否为您提供该抽象?
本质上,AppHarbor 的水平扩展故事是什么?
web-applications - 反应式编程、缩放和 Meteor
我们正在为我们的新一代企业级系统评估 Meteor。令人惊叹的内置功能之一是客户端中的每个数据模型都绑定到数据库中的模型,并在服务器更新时更新。但我担心可扩展性。
使数百万连接用户失效所需的架构是什么?
我想基本问题是数据库如何绑定到服务器和客户端上的模型。进一步推断,假设我们有多个网络服务器在运行,还有一个数据库。是否支持?如果是这样,怎么做?如果有人能描述实现它的底层技术,那将有很大帮助。
我想这可能是扩展任何使用响应式模型的 Web 应用程序的一般问题。首先,这是真的——任何关于它的讨论也很棒(实现它的最佳设计是什么?)。
其次,特别是 Meteor,因为它看起来更加单一(在“一切都为您完成”的意义上),我们正在寻找更多的可见性来帮助我们了解内部(无需阅读整个代码库)并帮助我们做出决定。
非常感谢,里奥
architecture - 横向扩展服务
我有一个系统,其服务用于跨多个数据库处理计划任务,计划任务是按数据库配置的。由于来自越来越多的数据库的工作负载,系统需要水平扩展,以便有多个服务副本,每个副本都安装在单独的服务器上。有一个通用数据库,其中包含需要处理的数据库列表。
我不想将数据库静态分配给服务实例,因为每个数据库的工作负载会有所不同。
我正在寻找的是一种方法来编组数据库的选择以在服务的各种实例之间进行处理。
请给点建议,谢谢
c# - 横向扩展 Windows 服务
我正在寻找有关如何扩展目前在我公司运行的 Windows 服务的一些信息。我们正在使用 .NET 4.0(可以并且将来会升级到 4.5)并在 Windows Server 2012 上运行它。
关于服务
该服务的工作是查询日志表中的新行(我们正在使用 Oracle 数据库)、处理信息、创建和/或更新 5 个其他表中的一堆行(我们称它们为跟踪表),更新记录表并重复。
日志表有大量的 XML(每行最多 20 MB)需要选择并保存在其他 5 个跟踪表中。新行一直以每小时 500,000 行的最大速率添加。
跟踪表的流量要高得多,从最小的表中的 90,000 新行到最大表中的潜在数百万行,每小时不等。更不用说这些表上也有更新操作。
关于正在处理的数据,
我觉得这一点对于根据这些对象的分组和处理方式找到解决方案很重要。数据结构如下所示:
- 报告是我需要选择和处理的日志数据
- 对于每条消息,平均有 5 个报告。在某些情况下,这可以在 1 到数百之间变化。
- 消息有一堆其他集合和其他关系,但它们与问题无关。
今天,我们几乎没有管理 16 核服务器上的负载的 Windows 服务(我不记得完整的规格,但可以肯定地说这台机器是野兽)。我的任务是找到一种方法来扩展和添加更多机器,这些机器将处理所有这些数据并且不会干扰其他实例。
目前,每条消息都有自己的线程并处理相关报告。我们分批处理报告,按其 MessageId 分组,以在处理数据时将数据库查询的数量减少到最低限度。
限制
- 在这个阶段,我可以使用我认为合适的任何架构从头开始重写此服务。
- 如果一个实例崩溃,其他实例需要能够从崩溃的一个离开的地方接起。不会丢失任何数据。
- 从插入数据库的报告开始,此处理需要尽可能接近实时。
我正在寻找有关如何构建这样一个项目的任何意见或建议。我认为服务需要是无状态的,或者有没有办法以某种方式同步所有实例的缓存?我应该如何在所有实例之间进行协调并确保它们不处理相同的数据?如何在它们之间平均分配负载?当然,如何处理实例崩溃而不完成它的工作?
编辑
删除无关信息
mysql - multiple rails engines talking to one mySQL server for horizontally scaling application servers
I've seen pictures like this where multiple rails engines write to a single mySQL server.
1) Is this possible? Or does Rails want each application server to write to one database server?
2) If this is possible, how is it accomplished? Are there queues and a scheduler between the application servers and the write database server?
database - 开箱即用的自动水平扩展数据库
我寻求 DBMS:
- 开箱即用水平缩放,没有或几乎没有手写“胶水”
- 允许通过少数索引中的任何一个查询记录
- 易于维护和扩展(即我们只需添加新服务器,DBMS 自行重新分配数据)
目标是重新设计并最终从当前解决方案(基于 Oracle RAC)迁移。旧解决方案的问题在于它的设计和代码质量很差,而不是 Oracle 本身。
关于我们的数据。我们有两种类型的记录:节点和事件。两者都被添加到 db 并且永远不会被删除。大约有 2e9 个节点和 5e11 个事件。每个事件都绑定到一个节点。我们需要的查询是:
- 根据节点的少数属性 n1、n2、n3 查询节点
- 按 node_id 查询节点
- 按时间间隔及其主要属性 e1 查询事件
- 按 node_id 查询事件
当然,我们需要插入新的节点和事件。查询 1-4 的数量是每天几千个,不会增长很多,但所有数据都需要可访问。每天的新事件数量大致等于节点数量。每天的新节点数量最多为几百个。
我们不需要事务或连接来保持一致性,因为数据在插入后始终是一致的,并且永远不会被删除。我们本可以使用单独的 postgres 服务器(并手动分派查询)来实现它,但有更好的方法吗?我们会考虑适合我们任务的任何(SQL 或 NoSQL)开源数据库。我们也不受任何特定语言的约束。优先级是易于扩展,同时保持良好的查询速度。
nosql - 水平缩放完全由列表组成的对象(行、文档)
有一些看起来像这样的数据:
需要这样查询数据:
在这种情况下,相等运算符categories == 'hair'
实际上是在说WHERE 'hair' equals at least one of the values in the list
. 使用一种我认为被称为“之字形合并连接”的算法,该操作可以在与传统相等操作相同的大 O 时间内完成。
我们正在使用的数据集包含数以千万计的这些对象。上面提供的查询需要每秒对数据库执行大约 50 次。该数据库每秒也有大约 50 次插入。由于这个要求,数据库必须在多台机器上水平扩展,这样读写操作就不必触及集群中的所有机器。我相信最好的方法是使用sharding
.
据我了解,只要查询不包含针对多个字段的不等式运算符,它查询的数据就可以在多台机器上进行索引和分片。(这是 GAE 大表的规则)
我的印象是 MongoDB 将是这个用例的一个很好的候选者,但是我最近意识到 MongoDB 的分片功能的一个警告:列表字段不能用作分片键。因此,如果我想为此使用 MongoDB,我将不得不在连接到 MongoDB 的应用程序的数据层中编写一个 hack。这是我之前发布的关于使用 MongoDB 存储和查询此用例的问题:Can a list field be a shard key in MongoDB?
我之前使用 GAE 的 Big Table 实现了这些要求,据我了解,它是一个大规模分片的数据库。但是,由于 GAE 访问大表的高成本(100 万次读取或写入操作大约 1 美元?),我们已经将我们的基础架构迁移到云服务器(我们现在在 Rackspace 云服务器上,如果您不熟悉它们,他们类似于 Amazon EC2)。
我的问题是:
我们应该为此使用什么数据库?
我知道还有其他 NoSQL 数据库声称能够像 CouchDB 和 Cassandra 一样水平扩展。我认为 MongoDB 就是其中之一。我们花了几个星期将大量数据移植到 MongoDB 中,然后发现它不支持我们的主要用例之一,我感到有点无能。不想再犯这个错误。
cassandra - Cassandra 是否是一个很好的候选数据库,因为它必须每秒支持超过 100 次读/写操作?
目前我们的系统使用 PostgreSQL,但是我们似乎已经突破了它的能力极限。我们的一些表需要每秒处理超过 100 次读/写操作,因此可能是时候在多台机器上进行水平扩展了。
有很多使用GAE的Big Table的经验。Big Table 有丰富的查询选项。例如,可以对列表数据字段进行查询。Cassandra 应该基于 Big Table,但如果我理解正确的话,对于 Cassandra,我们实际上必须在 Cassandra 之上自定义编码一个使用和维护索引表的层。
如果有一个可用的开源数据库,我们不必为维护索引表、之字形合并连接等构建自己的自定义逻辑,那就太好了……
Cassandra 是这里的好人选吗?或者有没有可能被认为更好的?
mongodb - 由时间戳+搜索组成的复合分片键是一个好的吗?
province
具有低基数并且start_date
是时间戳的事件集合:
我知道将升序键作为分片键不是一个好的选择,最终会出现热点(所有写入都转到最后一个分片)。低基数又是一个糟糕的选择,因为我们最终会得到不可分割的块。
那么,由start_date
+组成的复合键province
是一个不错的选择吗?为什么在这种情况下没有热点?
mongodb - Mongodb本地分片
我正在学习 Mongodb,到目前为止这是一次有趣的经历。现在我正在处理大约 3-4 个集合,每个集合都有超过 600 万条记录,我正在尝试查看是否可以将其横向扩展为碎片。大家都知道,我只是想学Mongodb,我的环境是64位的ubuntu系统。
我只有一个系统,所以我想了解是否可以创建本地数据库的分片。老实说,我还不明白分片的概念。但我想知道是否可以在单个开发系统上创建多个分片。
我尝试在网上寻找资源,但我还没有找到。对此的任何帮助都会很棒。