如果大多数浏览器从 DNS 服务器获得多个 A 记录,它们会如何表现?只要可以访问就坚持使用一个IP(并且只有在IP关闭时才使用另一个)?或者他们总是无缘无故地切换?
如果当前的大多数浏览器都坚持使用一个 IP,那么 DNS-RR 作为一种简单的故障转移解决方案对我来说就足够了。
是否可以在以下配置中使用循环 DNS /etc/hosts
?
192.168.4.10 shaakunthala.local
192.168.4.20 shaakunthala.local
Run Code Online (Sandbox Code Playgroud)
我在 Linux 上。
我目前使用 DNS 循环进行负载平衡,效果很好。记录看起来像这样(我的 TTL 为 120 秒)
;; ANSWER SECTION:
orion.2x.to. 116 IN A 80.237.201.41
orion.2x.to. 116 IN A 87.230.54.12
orion.2x.to. 116 IN A 87.230.100.10
orion.2x.to. 116 IN A 87.230.51.65
Run Code Online (Sandbox Code Playgroud)
我了解到并非每个 ISP/设备都以相同的方式处理此类响应。例如,一些 DNS 服务器随机地轮换地址或总是循环它们。一些只是传播第一个条目,其他人尝试通过查看 IP 地址来确定哪个是最好的(区域附近)。
但是,如果用户群足够大(分布在多个 ISP 上,等等),它的平衡就会很好。从最高负载到最低负载的服务器的差异几乎都超过 15%。
但是,现在我遇到的问题是,我正在向系统中引入更多服务器,而且并非所有服务器都具有相同的容量。
我目前只有 1 Gbps 服务器,但我也想使用 100 Mbps 和 10 Gbps 服务器。
所以我想要的是我想引入一个权重为100的10 Gbps服务器,一个权重为10的1 Gbps服务器和一个权重为1的100 Mbps服务器。
我之前添加了两次服务器来为它们带来更多流量(效果很好——带宽几乎翻了一番)。但是向 DNS 添加 100 次 10 Gbps 服务器有点荒谬。
所以我考虑使用TTL。
如果我给服务器 A 240 秒的 TTL 和服务器 B 仅 120 秒(这大约是循环使用的最小值,因为如果指定了较低的 TTL,许多 DNS 服务器设置为 120(所以我听说过))。我认为在理想情况下应该会发生这样的事情:
First 120 …
Run Code Online (Sandbox Code Playgroud) networking domain-name-system load-balancing ttl round-robin
假设我有给定域的 2 个 IP(循环 DNS)。
如果一个 IP 变得无响应,客户端是否会尝试连接到另一个 IP?或者他们将无法与域建立通信?
domain-name-system high-availability redundancy fault-tolerance round-robin
我们运行一个 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 哈希。
我知道已经问过这个问题的许多变体,但我仍然找不到满足我需求的好答案。
我想要做的是设置几个(至少 2 个)VPS来托管我的网络应用程序。我想提供一些负载平衡(使用 Varnish 很容易实现)和相对较高的可用性 - 这是我的问题。
使用负载平衡器(我需要在其中一个 VPS 上托管)会引入单点故障,这几乎与只有一台机器来提供内容一样糟糕。
http://i.stack.imgur.com/lFafj.png
而且 AFAIK DNS 循环方法不仅是负载平衡的坏主意,而且不提供故障转移机制。如果其中一台服务器出现故障,一些人(使用缓存的 DNS IP)仍会尝试连接到不可用的服务器。忘记短 TTL - 这不是正确的解决方案。
http://i.stack.imgur.com/mTLRf.png
需要考虑的一件非常重要的事情:我希望将我的VPS 划分到多个数据中心,这样如果一个数据中心的电力或 ISP 出现故障,网站就不会关闭。
我能想到的唯一 2 个解决方案是依赖 dns 循环(如果服务器出现故障,至少将内容提供给一定比例的用户直到恢复),或者在数据中心购买专用服务器,为停电做好准备并配备有几个互联网连接(与租用甚至 10 个 VPS 相比,这是非常昂贵的)。
所以问题是:在拥有多个负载平衡 VPS 时避免单点故障的正确方法是 什么?
请原谅图片。它们只是我的意思的基本示例。
domain-name-system vps high-availability load-balancing round-robin
我们正在尝试设置 HAProxy (v1.5.1) 以使用 SSL。
虽然我们设法做到了这一点,但我们在循环设置方面遇到了一些问题:
我们确实想要棒会话,但是 haproxy 似乎将所有会话(来自不同浏览器)发送到同一个节点 ( my.vm.2
),即使另一个节点 ( my.vm.1
) 也可用。所以看起来循环设置不能正常工作。
这是我们当前的配置,我们将不胜感激一些帮助/想法。:):
global
debug
stats socket /etc/haproxy/haproxysock level admin
tune.ssl.default-dh-param 2048
defaults
mode http
balance roundrobin
timeout connect 5s
timeout queue 300s
timeout client 300s
timeout server 300s
frontend https_frontend
bind *:8443
mode tcp
reqadd X-Forwarded-Proto:\ https
default_backend my_backend
backend my_backend
mode tcp
stick-table type ip size 200k expire 30m
stick on src
default-server inter 1s
server my.vm.1 my.vm.1:8443 check id 1 maxconn 500
server …
Run Code Online (Sandbox Code Playgroud) 据我所知,这个问题与 PowerDNS 无关。这些服务器运行两个软件包pdns-static-3.0.1-1.i386.rpm
并pdns-recursor-3.3-1.i386.rpm
运行最新版本的 Amazon Linux。
亚马逊 ec2 负载均衡器分配有多个主机的 CNAME。下面是实际行为的示例。请注意主机如何始终保持相同的顺序。
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
Run Code Online (Sandbox Code Playgroud)
主机的预期行为是循环赛
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has …
Run Code Online (Sandbox Code Playgroud) balance-rr和xmit_hash_policy 设置为 layer3+4 的802.3ad 有什么区别。
https://www.kernel.org/doc/Documentation/networking/bonding.txt
layer3+4
:此算法不完全符合 802.3ad。包含分段和未分段数据包的单个 TCP 或 UDP 会话将看到跨两个接口的数据包。这可能会导致无序交付。大多数流量类型不符合此标准,因为 TCP 很少对流量进行分段,并且大多数 UDP 流量不涉及扩展对话。802.3ad 的其他实现可能会也可能不会容忍这种不合规性。
我们有以下 IP 地址(例如):
1.1.1.1
2.2.2.2
Run Code Online (Sandbox Code Playgroud)
每个托管相同的网站,但在不同的服务器上。我们希望通过让 Web 用户对每个请求访问不同的 IP 地址来做一些非常简单的负载平衡。我们的应用程序完全支持这一点,因此不存在身份验证等技术问题。
我想我已经开始工作了,但我不确定。如果我使用 nslookup 来查询区域,那么 IP 会以循环方式交替,这很酷。
Addresses: 1.1.1.1
2.2.2.2
Run Code Online (Sandbox Code Playgroud)
...
Addresses: 2.2.2.2
1.1.1.1
Run Code Online (Sandbox Code Playgroud)
我观察到如果 http 服务器在第一个 IP 上不可用,Web 浏览器将只使用第二个 IP,这也很酷。
然而,这似乎真的很难测试,因为一旦浏览器有了 IP(例如 Chrome),它就会坚持下去。也许这是一件好事?那么,根据我的解释,这听起来像它可以作为具有冗余的负载平衡器吗?
我有两台服务器,在处理能力和负载方面具有相同的能力。我想要完成的是:(我已经拥有并运行 DNS 服务器,所以这应该不是问题)。
服务器 A 将向 sub.domain.com 的所有传入请求提供服务,服务器 B 仅在服务器 A 停机时提供服务,如果需要等待片刻来决定,那没关系。
是否可以?加权循环不能满足我的需要,常规循环也不能,因为如果第一个请求成功传递,它只会前进到下一个服务器。
有没有办法让它在服务器 A 上的 sub.domain.com 不可用时转发到服务器 B,直到 A 上线?
谢谢,这真的有助于我的项目的一致性。
好的,所以我和我的朋友正在建立一个新网站。我们预计会有严重的 DDoS 攻击,所以我们的计划是使用 nginx 从各种云服务器进行代理,这样人们就无法找到我们实际服务器的 IP。
然而,我们需要将所有这些代理服务器链接到一个域,这样当域(我们会说 domain.com)被请求时,它会选择一个代理服务器来发送用户并将它们粘贴在那里。然而,它还需要检查它发送给用户的服务器是否真的启动并运行(并且有互联网连接)。如果将用户发送到的服务器受到攻击,那么首先就违背了代理服务器的目的。
关于如何做到这一点的任何想法?
round-robin ×12
a-record ×1
bind ×1
bonding ×1
cname-record ×1
ddos ×1
failover ×1
haproxy ×1
hosts-file ×1
lvs ×1
networking ×1
powerdns ×1
proxy ×1
redundancy ×1
ssl ×1
ttl ×1
uptime ×1
vps ×1