问题标签 [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.

0 投票
1 回答
85 浏览

architecture - 横向扩展:分工还是冗余?

这是我一直想知道的事情。我知道水平扩展是关于在组合中添加更多机器。但我可以想到两种方法。假设我有 20 台服务器要使用(加上一个数据库)。我可以:

  1. 使所有 20 台服务器作为应用程序服务器运行。
  2. 让不同的服务器执行任务的不同部分。例如,让一组服务器处理请求,然后另一组应用业务逻辑,然后另一组进行数据库调用。

数字 1 似​​乎更常见且更容易理解,但数字 2 似乎被认为是“最佳实践”(因为它主要是 n 层架构)。如何在这两种模式之间进行选择?每种方法的优缺点是什么?

0 投票
2 回答
189 浏览

language-agnostic - 什么时候开始考虑扩展?

在过去的几天里,我一直在设计一个网站,并对水平扩展网站的不同方面进行了一些研究。如果事情按计划进行,几个月后(几年?)我知道我需要担心扩大和扩大网站,因为它最终会消耗大量资源。

所以,这让我开始思考,什么时候开始考虑和设计可扩展性的最佳时机?如果您开始得太早,您很容易使您的设计过于复杂,并使其无法实际构建。你也可能过于关注细节、架构等等,最终什么也没做。此外,如果您确实让它正常工作,但该网站从未起飞,那么您可能已经浪费了大量额外的努力。

另一方面,你可以为自己节省大量的精力。从头开始将它设计得很大,这样以后让它变大变得容易得多,几乎不需要重写。

我知道我正在做的事情,我决定现在至少在扩展方面做出一些选择,但我不会完全改变思维来让它完全扩展。值得注意的是,我已经将我的数据库从传统的关系设计重新设计为类似于下面链接的 Reddit 站点上建议的数据库,我将尝试使用 memcache。

所以,基本的问题是,什么时候开始考虑或担心缩放的好时机,以及这样做时有哪些好的设计、技巧等?

我一直在阅读一些东西,对于那些感兴趣的人:

http://www.codinghorror.com/blog/2009/06/scaling-up-vs-scaling-out-hidden-costs.html

http://highscalability.com/blog/2010/5/17/7-lessons-learned-while-building-reddit-to-270-million-page.html

http://developer.yahoo.com/performance/rules.html

0 投票
2 回答
420 浏览

performance - 用于优化 Hadoop 应用程序可扩展性的工具?

我正在与我的一个团队合作开发一个小型应用程序,该应用程序需要大量输入(一天的日志文件)并在几个(现在 4 个,将来可能是 10 个)map-reduce 步骤(Hadoop 和 Java)之后产生有用的输出.

现在我已经完成了这个应用程序的部分 POC 并在 4 个旧桌面(我的 Hadoop 测试集群)上运行它。我注意到的是,如果您“错误”地进行分区,水平缩放特征就会被破坏得面目全非。我发现比较单个节点(比如 20 分钟)和所有 4 个节点上的测试运行只会导致 50% 的加速(大约 10 分钟),而我预计加速是 75%(或至少 >70%)(大约 5或 6 分钟)。

使map-reduce水平缩放的一般原则是确保分区尽可能独立。我发现在我的情况下,我对每个步骤进行了“错误”的分区,因为我只是使用了默认的 Hash 分区器;这使得记录在下一个 map-reduce 步骤中跳转到不同的分区。

我希望(还没有尝试过)如果我能说服尽可能多的记录留在同一个分区中(即构建一个自定义分区器),我可以加快速度并使扩展性更好。

在上述情况下,我手动找到了这个解决方案。在我开车上班的时候,我通过认真思考这个问题来推断出了什么问题。

现在我要问大家: - 有哪些工具可用于检测此类问题?- 是否有任何要遵循的指导方针/清单?- 我如何去测量诸如“跳过分区的记录数”之类的东西?

非常感谢任何建议(工具、教程、书籍……)。

0 投票
2 回答
179 浏览

real-time - 分布式应用程序的水平可扩展性,如何实现?

我想在这里忽略 Web 应用程序,因为要水平扩展它们,即一起使用多个服务器实例,只需在机器上复制服务器软件并使用一种将请求转发到“不太忙”的服务器机器。

但是,如果我的服务器应用程序允许用户实时互动怎么办?

如果对某个客户端 X 的请求的响应取决于客户端 Y 的上下文,该客户端 Y 的连接由另一台机器管理,则需要“机器间”通信。

我想知道人们在这种情况下使用的那种“设计解决方案”。

例如,Facebook 的人们在启用其社交应用程序的聊天功能时肯定已经遇到过这种情况。

提前感谢您的任何建议。

0 投票
1 回答
1197 浏览

mysql - 如何处理 MySQL 读/写拆分中的最终一致性问题

我一直在寻找扩展 MySQL 的解决方案。除了添加 Memcached 层之外,经常出现的一个问题是读/写拆分——所有写入都转到主服务器,所有读取都转到一组负载平衡的从服务器。

这种方法明显提出的一个问题是“最终一致性”。当我在主服务器上运行写入时,复制到读取从服务器需要一定的时间。因此,如果我请求新创建的行,它可能不存在。

有谁知道处理这个问题的具体策略?我已经阅读了关于“阅读你所写的内容”能力的概念性部分解决方案。但是,是否有人对如何实现这样的解决方案有任何想法——无论是在概念上,还是特别是在 Spring/Hibernate 堆栈中?

0 投票
3 回答
6312 浏览

javascript - HighCharts:水平条形图的对数刻度

我正在使用HighCharts制作条形图。我的值的范围可以从最小 0 到高达 100k(示例)。因此,图表的一个条形可能非常小,而另一个条形可能很长。HighCharts 引入了“对数缩放”功能。其中的例子可以在这里看到

我的 js 代码写在这个jsfiddle文件中。我想以对数方式显示我的水平轴(x 轴)。我已插入示例中所示的密钥类型,但脚本进入必须停止的无限循环。

执行中的缺陷是什么,或者 HighCharts 的对数缩放仍然不成熟?

PS jsfiddle 中的注释行导致了问题

0 投票
3 回答
2326 浏览

jsf-2 - JSF 2.0 应用程序的水平缩放

鉴于 JavaServer Faces 在服务器端本身就是有状态的,建议使用哪些方法来水平扩展 JSF 2.0 应用程序?

如果一个应用程序运行多个 JSF 服务器,我可以想象以下场景:

  1. 粘性会话:将与给定会话匹配的所有请求发送到同一服务器。
    • 问题:通常使用什么技术来实现这一点?
    • 问题:服务器故障导致会话丢失......并且通常看起来像脆弱的架构,尤其是在重新开始时(不尝试扩展现有应用程序)
  2. 状态(会话)复制:在集群中的所有 JSF 服务器上复制 JSF 状态
    • 问题:通常使用什么技术来实现这一点?
    • 问题:无法缩放。集群总内存 = 最小服务器上的总内存
  3. 指示 JSF(通过配置)将其状态存储在外部资源上(例如,另一台运行非常快的内存数据库的服务器),然后在需要应用程序状态时从 JSF 服务器访问该资源?
    • 问:这可能吗?
  4. 指示 JSF(通过配置)是无状态的?
    • 问:这可能吗?

[编辑]

根据 Ravi 对 Sticky Sessions 的建议进行了更新

0 投票
1 回答
1488 浏览

git - 如何制作水平可扩展的 Git 解决方案

所以我已经成功建立了自己的 git 服务器。关于它的一点背景是:

服务器:Ubuntu Git 服务:Gitolite Web 界面:GitWeb

现在要在这个服务器上添加一堆项目,我的 10gig 实例很容易用完。我的问题是,由于 git 将所有文件都存储在文件系统上,我现在如何进行水平扩展?

0 投票
1 回答
158 浏览

sql-server - 扩展 SQL Azure 表/架构的体系结构要求

我正在 SQL Azure 中设置架构/一些表,并想知道我是否需要在架构上做任何事情以提高可伸缩性,尤其是水平可伸缩性。ID应该是某种类型吗?主键是某种类型?

我希望避免未来的风险/问题......让我知道。

谢谢,

0 投票
1 回答
497 浏览

mysql - 使用两个索引对 mysql 表进行水平分区

我有一个 mysql 表,用于存储不同项目的用户评分。它具有以下字段:

  • id (int, pk)
  • 用户 ID(整数)
  • itemId (int)
  • 评级(浮动)
  • 时间戳(整数)

和以下指数:

  • (userId, rating):用于查询特定用户已评分的所有项目
  • (itemId, rating):用于查询所有对特定项目进行评分的用户

该表有超过 1000 万行。为了使其更具可扩展性,我想执行水平分区。特别是,我计划将表分区为 20 个表:

  • tbl_rating_by_item_0:存储itemId以0结尾的评分
  • tbl_rating_by_item_1:存储itemId以1结尾的评分
  • ……
  • tbl_rating_by_item_9:存储itemId以9结尾的评分

  • tbl_rating_by_user_0:存储userId以0结尾的评分
  • tbl_rating_by_user_1:存储userId以1结尾的评分
  • ……
  • tbl_rating_by_user_9:存储userId以9结尾的评分

这个想法是,当我们从 tbl_rating_by_item_itemId 中读取 itemId 查询时,我们从 tbl_rating_by_user_userId 中读取 userId 查询。缺点是每当我想插入或删除评分时,我都需要在两个表中插入或删除。

还有其他解决方案吗?