我目前正在运行一个站点,其流量现在分布在 7 个镜像服务器中(使用 DNS 循环)。但鉴于持续增长的大量流量,很快将需要更多的镜像。
使用循环 DNS 时,与给定域名关联的 IP 地址数量是否有任何实用的建议限制?
此外,当镜像数量较多时(例如超过 10 或 20 个镜像),您会推荐什么样的解决方案?
谢谢。
我们有一个 WCF 服务托管在一组 12 台机器上。有一个负载平衡器是这些机器的网关。
现在站点设置为 SSL;就像用户通过使用带有 https 的 URL 访问它一样。我知道这么多,该站点的 URL 是 https,但没有任何服务器具有 https 绑定或设置为需要 SSL。这让我相信负载平衡器处理 https 并且从平衡器到服务器的连接是未加密的(这发生在防火墙后面,所以没什么大不了的)。
我们遇到的问题是,当 Silverlight 客户端尝试访问 WCF 服务时,它会收到“未找到”错误。我已经与我们的开发人员机器一起建立了一个测试站点,并确保 web.config 中的绑定和端点与客户端一起工作。在生产环境中,我们收到此错误似乎就是这种情况。
下面的 web.config 有什么问题吗?我们应该设置如何以不同的方式处理 https 吗?
我们目前对此不知所措,因为我已经尝试了所有带有端点和绑定的程序化解决方案。我发现的所有解决方案都没有以我们处理的方式处理负载平衡器。
Web.config 服务模型信息:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="TradePMR.OMS.Framework.Services.CRM.CRMServiceBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior name="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregationBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="SecureCRMCustomBinding">
<binaryMessageEncoding />
<httpsTransport />
</binding>
<binding name="SecureAACustomBinding">
<binaryMessageEncoding />
<httpsTransport />
</binding>
</customBinding>
<mexHttpsBinding>
<binding name="SecureMex" />
</mexHttpsBinding>
</bindings> …Run Code Online (Sandbox Code Playgroud) 基于这个问题:广泛使用的负载均衡解决方案?, LVS 可能是我的问题的正确解决方案。
但是当我去它的主页http://www.linuxvirtualserver.org/ 时,我发现LVS 从2008 年11 月开始更新了。世界变化很快,我不知道LVS 是否已经过时了。
LVS 是停滞不前,还是有更好的解决方案来替代它?
非常感谢。
我正在尝试研究针对以下场景对长时间运行的 TCP 连接进行负载平衡的最佳方法:
我们在一组冗余防火墙后面有多个服务器,客户端与我们的后端服务器建立长期运行(通常 10-15 小时)的 TCP 连接。
现在,“负载平衡”是通过客户端循环方法处理的,以通过 IP 地址列表,这些 IP 地址都位于我们的防火墙中,并相应地 NAT 到后端服务器。
我想摆脱这种方法,只有一个公共 IP,并有一个单独的负载平衡器,可以检查服务器的运行状况/负载并相应地分发传入的客户端连接请求。
这里的一个问题是,每个客户端在 3 个不同的端口上建立 3 个套接字连接,如果这些连接是“粘性的”,我更喜欢,因此所有这 3 个连接请求都发送到同一个后端服务器。
我一直在研究例如 HAProxy,但我不确定它是否真的适合我的场景。我们的连接数相对较少(约 300 个客户端 * 每个客户端 3 个套接字连接)。通常我们看到每个套接字约 15KB/s 的连续数据传输量。
非常感谢您对此的任何意见!
谢谢,
汤姆
我们正在使用 HAProxy 来平衡我们的 websocket 和 Comet 应用程序。后面有一个 HAProxy 和 3 个应用程序在运行。我们使用 HTTP 基本身份验证(将来我们将使用其他类型的身份验证,如 OAuth)来识别连接的用户。
我们不能使用常规循环,因为给定用户的连接最终在同一台服务器上很重要。在哪里并不重要,但重要的是他们使用相同的服务器。
我知道 HAProxy 是一种基于智能 cookie 的方法,但不幸的是,在我们的例子中,有时,同一用户会从不同的机器连接,所以 cookie 不起作用)。
是否可以使用 HTTP Authorization 标头的散列来进行负载平衡?另外,这更复杂,是否可以定义我们自己的散列方法?
后续问题[在威利的回应之后]:
既然可以做balance hdr(Authorization),是否可以只在登录字段上做(解析后)?
另外,确切的算法是什么?我相信它的形式是hash(Authorization) % number_of_backend_server,但是,散列函数是什么,更重要的是,它是否可以调整?(或者我可以添加一个偏移量)。
我问是因为这个应用程序实际上是保持 XMPP 组件连接打开,我需要使用相同的算法对 XMPP 组件进行负载平衡。toXMPP 节中的jid 由 HTTP 标头授权确定。
我们运行一个 Web 应用程序,为越来越多的客户端提供 Web API。首先,客户端通常是家庭、办公室或其他无线网络,向我们的 API 提交分块的 http 上传。我们现在已经扩展到处理更多的移动客户端。文件从几千到几场不等,分解成更小的块并在我们的 API 上重新组装。
我们当前的负载均衡是在两层执行的,首先我们使用轮询 DNS 为我们的 api.company.com 地址通告多个 A 记录。在每个 IP 处,我们托管一个 Linux LVS:http : //www.linuxvirtualserver.org/,负载均衡器查看请求的源 IP 地址以确定将连接交给哪个 API 服务器。这个 LVS 盒子配置了 heartbeatd 来相互接管外部 VIP 和内部网关 IP。
最近,我们看到了两个新的错误条件。
第一个错误是客户端在上传中摇摆或从一个 LVS 迁移到另一个。这反过来会导致我们的负载均衡器失去对持久连接的跟踪,并将流量发送到新的 API 服务器,从而破坏跨两个或更多服务器的分块上传。我们的目的是让下游缓存名称服务器、操作系统缓存层和客户端应用程序层遵守 api.company.com 的循环 DNS TTL 值(我们已将其设置为 1 小时)。大约 15% 的上传会出现此错误。
我们看到的第二个错误要少得多。客户端将向 LVS 盒发起流量并路由到它后面的 realserver A。此后,客户端将通过 LVS 框无法识别的新源 IP 地址进入,从而将正在进行的流量路由到也在该 LVS 后面的真实服务器 B。
鉴于我们上面部分描述的架构,我想知道人们对更好的方法有什么经验,这将使我们能够更优雅地处理上述每个错误情况?
2010 年 5 月 3 日编辑:
这看起来是我们需要的。源 IP 地址上的加权 GSLB 哈希。
数据包如何从网络接口队列调度到 CPU,然后再转发到线程进行处理?在涉及如何跨队列散列数据包、硬件中断与软中断、CPU/内存/应用程序/线程局部性以及多线程与多进程守护进程时,需要考虑什么,以避免尽可能多的数据包重新调度/复制?
我有一个多线程网络守护进程(比如,Unbound 解析器)在 Debian amd64 和 Linux 2.6.32(是的,旧的)上运行 16 个本机线程,因此应用程序负载分布在 16 个 CPU 上。网卡是 bnx2 (BCM5709S),支持 8 个 MSI-X rx/tx 队列。每个队列的 IRQ 通过静态映射 /proc/irq/n/smp_affinity 中的中断亲和性分配给单独的 CPU(irqbalance 从来没有做得很好),队列散列类型(RSS 类型)是默认的(IP src+dst , TCP 运动+dport),使用默认的散列键。
所有这些都有助于分散负载,但并不均匀:通常有一个应用程序线程完成其他线程两倍的工作(=每秒请求数),一个 CPU(可能是处理该特定线程的一个)软中断率是其他线程的两倍CPU。
CPU 启用了超线程,但我还没有做任何事情来在“真实”内核之间分散负载(我真的应该这样做)。
Linux 附带了一个相当全面的网络扩展文档,但我遗漏了一些空白:
该文档是关于 RSS 配置的:
如果设备支持足够的队列,典型的 RSS 配置将是每个 CPU 有一个接收队列,否则每个内存域至少有一个接收队列,其中内存域是一组共享特定内存级别(L1、L2 、NUMA 节点等)。
问:如何确定服务器的 CPU/缓存/内存域配置?
有关接收流控制 (RFS) 的信息似乎回答了我关于将数据包发送到正确的 CPU/线程的一些问题:
RFS 的目标是通过将数据包的内核处理引导到正在运行使用数据包的应用程序线程的 CPU 来提高数据缓存命中率。
Q:在DNS解析的情况下,通常有一个查询包和一个应答包。使用多线程守护进程,是否只有一个线程运行 bind()+recvfrom(),因此在将工作调度到其他线程之前,无论如何必须处理所有新传入的数据包?这个特殊的用例会从分叉操作(每个 CPU 一个进程)中受益吗?
问:那么接收流控制通常最适合多线程 TCP 守护进程吗?
Q:如何确定是多线程还是多进程操作?显然有共享内存和数据结构、资源争用等,但我正在考虑数据包流和应用程序侦听器。
问:如果没有接收流控制,或者使用简单的 UDP 服务,数据包是否会到达“错误”的 CPU,因此会以某种方式重新调度到“正确”的 CPU?这会触发 NET_RX 软中断吗?
Q:网卡队列和CPU之间是否有NET_RX软中断?CPU 和监听线程/进程之间是否也有一个?如果接收线程将数据包调度到工作线程,是否还有另一个可能?
太糟糕了,Ben Hutchings …
对于针对 Active Directory DC 进行身份验证的应用程序,显然最好将它们指向主域 DNS 记录而不是特定的 DC 以进行故障转移、负载平衡等。
对于那些迫使您对 DC 的 IP 进行硬编码的应用程序,最佳实践是什么?我们可以对负载均衡器的 IP 地址进行硬编码,这样即使一个 DC 出现故障,该应用程序仍然能够进行身份验证。有没有更好的选择?
首先让我说我不是系统管理员,我是程序员。
最近,我们的系统管理员安装了 F5 负载均衡器。从那时起,我注意到任何时候请求超时并最终抛出 500,负载均衡器都会向我们的另一台服务器发送相同的请求。即使脚本实际上仍在运行,IIS 也会发送超时响应。如果脚本运行超过 5 分钟,即使 POST 请求也会重复。这对我来说似乎是一个潜在的问题,尤其是对于涉及客户计费的电子商务网站。
这只是我们一些运行时间较长的脚本的问题(但这是一个严重的问题)。我被告知这是预期的行为,我们必须更改我们的代码以符合要求。所以我的问题是:
我需要一种方法来跟踪和限制网络会话到网络应用程序。“会话”被松散地定义为单个用户浏览所述网络应用程序的页面。我觉得可以翻译成:
<clientIP,vHost>或者是<clientIP,serverIP,serverPort>或<cookie,vHost>,具体取决于层和可用数据达到指定的会话限制后,应将下一个用户定向到自定义错误页面。我还需要一种方法来跟踪当前会话数以进行监控,以及将监控服务器(它定期向 web 应用程序发出查询)列入白名单并使其不受限制的能力。
我可以使用的东西:
我宁愿不涉及额外的代理服务器,但如果没有其他选择,我会考虑它。
所有这一切背后的基本原理是,上述 Web 应用程序很容易过载并开始不规律地拒绝请求,这激怒了(通常)在此过程中丢失表单输入数据的工作用户。通过指定一个不太可能发生过载条件的限制,我们希望创建一个明确定义的故障条件,如果负载可能会激增,用户将被告知稍后返回。
编辑:Web 应用程序是一个 3 层实现,第一层(表示层,在 Apache vHost 中实现为 CGI 代码)相当简单,显然仅限于应用服务器之间的基本错误处理和请求负载平衡。它不会对其运行的 Web 服务器施加任何重大负载 - 这就是为什么我们在 AppDirector 场中仅以故障转移模式(无负载平衡)运行它,这应该在某种程度上简化事情。
除此之外的一切对我们来说基本上都是一个黑匣子——在数据层,我们有一个 MSSQL 数据库,但几乎不可能从供应商那里获得有关表结构的任何有意义的信息。应用服务器是闭源的,供应商使用了一个相当全面的框架来实现,但似乎无法回答更不复杂的操作相关问题。
load-balancing ×10
haproxy ×2
linux ×2
lvs ×2
apache-2.2 ×1
f5-big-ip ×1
high-load ×1
http-headers ×1
https ×1
iis ×1
iis-7 ×1
ldap ×1
linux-kernel ×1
round-robin ×1
scalability ×1
session ×1
socket ×1
tcp ×1
threads ×1
traffic ×1
wcf ×1