假设您在postgresql数据库之上运行您的业务.经过一段时间后,你会得到如此多的流量,以至于单个postgresql实例无法处理它,所以你想要添加更多实例(水平扩展)以便能够处理增长.
您的数据是关系型的,因此可能无法切换到某些键/值解决方案.
你会如何用postgresql做到这一点?
PS.Postgresql版本:9.5
经过一些谷歌搜索我发现:
来自mysql文档的注意事项:
MySQL Cluster可以跨节点自动分割(分区)表,使数据库能够在低成本的商用硬件上水平扩展,以便为读取和写入密集型工作负载提供服务,从SQL和直接通过NoSQL API访问.
关系数据库可以横向扩展吗?它会以某种方式基于NoSQL数据库吗?
有人有任何现实世界的例子吗?
如何在这样的数据库中管理sql请求,事务等?
假设有一个工作服务从队列接收消息,从文档数据库中读取具有指定Id的产品,根据消息应用一些操作逻辑,最后将更新的产品写回数据库(a).
在处理不同的产品时,这项工作可以安全地并行完成,因此我们可以横向扩展(b).但是,如果多个服务实例在同一产品上运行,我们最终可能会遇到并发问题或数据库中的并发异常,在这种情况下我们应该应用一些重试逻辑(并且仍然可能会再次失败,等等) .
问题:我们如何避免这种情况?有没有办法可以确保两个实例不能在同一产品上运行?
示例/使用案例:在线商店在productA,productB和productC上有很好的销售,一小时结束,数百名客户正在购买.对于每次购买,都会将消息排入队列(productId,numberOfItems,price). 目标:我们如何运行我们的工作服务的三个实例,并确保productA的所有消息最终都在instanceA,productB到instanceB和productC到instanceC(导致没有并发问题)?
注意:我的服务是用C#编写的,作为工作者角色托管在Azure上,我使用Azure队列进行消息传递,我正在考虑使用Mongo进行存储.此外,实体ID是GUID
.
它更多的是关于技术/设计,所以如果你使用不同的工具来解决问题,我仍然感兴趣.
假设我们有微服务A和B.B有自己的数据库.但是B必须水平缩放,因此我们最终有3个B实例.数据库会发生什么?它是否相应地扩展,是否为3 B实例保持相同(集中)数据库,它是否成为分布式数据库,会发生什么?
所以这个问题困扰着我,我实际上并不需要这种规模,我只是好奇.最近,Chris Mccord使用Elixir/Phoenix在一个盒子里获得了200万个持久连接.如果我在一个集群中有3个盒子,每个盒子处理200万个持久连接:
box1.foo.com
,box2.foo.com
,box3.foo.com
并告诉客户端连接到其中的一个?我知道答案可能是特定于应用程序的,但是请您举例说明如何实现这种规模?同样,这只是一个思考练习,我无法在任何地方找到答案,我对水平缩放感兴趣.
谢谢.
erlang load-balancing cluster-computing elixir horizontal-scaling
我正在寻找有关如何扩展当前在我公司运行的Windows服务的一些输入.我们正在使用.NET 4.0(可以并且将来会在某个时候升级到4.5)并在Windows Server 2012上运行它.
关于服务
该服务的工作是查询日志表中的新行(我们正在使用Oracle数据库),处理信息,创建和/或更新其他5个表中的一堆行(让我们称之为跟踪表) ),更新日志表并重复.
日志记录表具有大量XML(每行最多可达20 MB),需要在其他5个跟踪表中进行选择和保存.始终以每小时500,000行的最大速率添加新行.
跟踪表的流量要高得多,从最小的一行中的90,000个新行到每小时最大表中可能有数百万行.更不用说那些表也有更新操作.
关于正在处理的数据
我觉得这一点对于根据这些对象的分组和处理方式找到解决方案非常重要.数据结构如下所示:
public class Report
{
public long Id { get; set; }
public DateTime CreateTime { get; set; }
public Guid MessageId { get; set; }
public string XmlData { get; set; }
}
public class Message
{
public Guid Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
今天Windows服务我们几乎没有管理16核服务器上的负载(我不记得完整的规格,但可以肯定地说这台机器是野兽).我的任务是寻找扩展和添加更多机器的方法,这些机器将处理所有这些数据而不会干扰其他实例.
目前,每个Message都有自己的Thread并处理相关报告.我们批量处理报告,按其MessageId分组,以便在处理数据时将数据库查询的数量减少到最少.
限制
我正在寻找有关如何构建此类项目的任何意见或建议.我假设服务需要是无状态的,还是有办法以某种方式同步所有实例的缓存?我应该如何在所有实例之间进行协调,并确保它们不处理相同的数据?如何在它们之间平均分配负载?当然,如何处理实例崩溃而不完成它的工作?
编辑
删除了无关的信息
我最近被迫将我的应用程序转移到亚马逊并使用自动缩放,我偶然发现了 cron 作业和自动缩放的问题。
我有一个每 15 分钟运行一次的 cron 作业,它检查订阅是否应该收费,查询选择所有过期的订阅,并尝试对它们收费。它一旦处理就会改变它们的状态,但是它们是批量获取的,并且该过程需要 1-3 分钟。
如果我有多个具有相同 cron 作业的实例,它可能会同时触发并对订阅进行多次收费。这种事其实已经发生过一次了。
这里最好的方法是什么?以某种方式锁定桌子?
我正在使用 Amazon elastic beanstalk 和 symfony3。
distributed-computing horizontal-scaling symfony amazon-elastic-beanstalk
我是 NoSQL 新手,并试图理解它的含义。
我在许多不同的网站上看到许多文章重复这样一个事实:“SQL 数据库是垂直扩展的(通过添加 CPU/内存),而 NoSQL 数据库是水平扩展的(通过添加更多可以执行分布式计算的机器)”。
例如这些文章:
http://dataconomy.com/sql-vs-nosql-need-know/
http://www.thegeekstuff.com/2014/01/sql-vs-nosql-db/
问题是我不明白为什么。
据我所知,SQL 和 NoSQL 之间的主要区别(除了可扩展性问题)是 SQL 存储在表中,而 NoSQL 以不同的方式存储(Key-Value/Graph/xml 等)。
我似乎无法理解这两个事实(可扩展性和存储策略)之间的联系。这些对我来说似乎是无关的事情(可能是由于缺乏理解)。
它们是 Kubernetes 水平 pod 自动缩放中的配置,用于指定在向上/向下扩展之前运行或创建 pod 的最小延迟吗?
例如像这样的东西:
# I am looking for a flag like this
--horizontal-pod-autoscale-initial-upscale-delay=5m0s
# Similar to these existing flags
--horizontal-pod-autoscaler-downscale-delay=2m0s
--horizontal-pod-autoscaler-upscale-delay=2m0s
Run Code Online (Sandbox Code Playgroud)
结果是:
我有一种情况,即 Pod 在启动时消耗大量资源进行引导(这是预期的),但我不希望它在此期间扩展,一旦引导完成,它可能有资格进行自动扩展。
问题 1.)
给定一个多容器 pod 的场景,其中所有容器都有一个定义的 CPU 请求:
Kubernetes Horizontal Pod Autoscaler 如何计算多容器 pod 的 CPU 利用率?
它是平均的吗?(((500m cpu req + 50m cpu req) /2) * X% HPA 目标 cpu 利用率
是否添加它们? ((500m cpu req + 50m cpu req) * X% HPA 目标 cpu 利用率
是否单独跟踪它们?( 500m cpu req * X% HPA 目标 cpu 利用率 = 目标 #1,50m cpu req * X% HPA 目标 cpu 利用率 = 目标 #2。)
问题 2.)
给定多容器 pod 的场景,其中 1 个容器具有为其他容器定义 CPU 请求和空白 CPU 请求:
Kubernetes …
scalability ×4
kubernetes ×2
nosql ×2
api ×1
autoscaling ×1
azure ×1
c# ×1
containers ×1
database ×1
elixir ×1
erlang ×1
instances ×1
mysql ×1
postgresql ×1
sharding ×1
sql ×1
symfony ×1
transactions ×1