我们的haproxy负载均衡器为其后端打开了数千个连接,即使它的设置说每个服务器实例打开不超过10个连接(见下文).当我取消注释"选项http-server-close"后端连接的数量下降但是我希望保持活动后端连接.
为什么maxconn不受尊重http-keep-alive?我验证ss了打开的后端连接处于ESTABLISHED状态.
defaults
log global
mode http
option http-keep-alive
timeout http-keep-alive 60000
timeout connect 6000
timeout client 60000
timeout server 20000
frontend http_proxy
bind *:80
default_backend backends
backend backends
option prefer-last-server
# option http-server-close
timeout http-keep-alive 1000
server s1 10.0.0.21:8080 maxconn 10
server s2 10.0.0.7:8080 maxconn 10
server s3 10.0.0.22:8080 maxconn 10
server s4 10.0.0.16:8080 maxconn 10
Run Code Online (Sandbox Code Playgroud) 我们正在努力将我们的EC2架构扩展到我们想要管理自己的负载平衡的程度.我们目前在HAProxy上配置了一系列机器来进行基本负载平衡,但我们正在寻找"最佳实践"意味着让新实例联机并自动(或几乎自动)加入HAProxy.
理想情况下,我们会监控系统负载或依靠几年的分析数据来计算出路由时间表,当我们达到阈值或预定时间时,让流程启动新实例,拥有新节点连接到我们的HAProxy机器上的系统,将其主机名写入配置并重新加载HAProxy,使其成为池的一部分.
我们正在考虑亚马逊的ELB,一旦我们变得足够大,需要多个区域覆盖,但在此之前,我们需要一个简单的设置,可以添加/删除HAProxy的机器.
我知道有一些服务我们可以支付来管理这些东西,但是Scalr似乎将我们限制在非常特定的实例类型,而且Rightscale太贵了,所以和许多其他人一样,我们正在寻找自己的解决方案.
不幸的是,那些推出自己的解决方案的人似乎对他们的流程有点嘘声.
我们有几个http站点在负载均衡器后面运行(具有使用hearbeat的故障转移功能)和一个https站点.一切运行正常,但现在我想添加另一个https网站.我找不到任何托管多个https网站的参考资料.
有没有人使用HAproxy托管多个https网站?你能告诉我怎样才能实现这个目标?请帮助我提供您的意见.
谢谢,
Santhosh
我想使用haproxy作为代理和数千个后端的负载均衡器.因此,需要根据主机名将请求代理到正确的后端,然后在后端内进行负载平衡.我正在使用haproxy-1.5dev21.
配置文件如下所示:
frontend public
bind :80
mode http
acl host1 hdr_reg(host) host1.com
use_backend be_host1 if host1
acl host4000 hdr_reg(host) host4000.com
use_backend be_host4000 if host4000
backend be_host[n]
server hostn_1
server hostn_2
Run Code Online (Sandbox Code Playgroud)
问题是,如果有5000个主机,每个请求会增加30毫秒的延迟.对于20k后端,haproxy需要很长时间才能加载,更不用说每个请求的延迟灾难了.
我可以做一些比顺序acl规则更好的事情吗?我还没有找到新地图功能的示例 - 发行说明说它可以用于大量重定向规则.我试过这个:
use_backend %[hdr(host), map(host_to_backend_map.file)]
Run Code Online (Sandbox Code Playgroud)
使用地图时显然有些愚蠢,但任何指导都会有所帮助.谢谢!
有人可以解释在发布到从节点时具有多个节点和队列的RabbitMQ集群中幕后发生的事情吗?
从我读到的内容看来,除了发布之外的所有操作似乎只发送给主服务器,然后主服务器将操作的效果广播到从服务器(这来自文档).根据我的理解,这意味着消费者将始终使用主队列中的消息.此外,如果我向从服务器发送请求以消费消息,则该从服务器将通过访问主服务器以获取该消息来执行额外的跳转.
但是当我发布到从属节点时会发生什么?此节点是否会将消息首先发送给主节点?
在处理奴隶时似乎有这么多额外的跳跃,所以如果你只知道主人,你似乎可以有更好的表现.但是你如何处理主失败?然后其中一个奴隶将被选为主人,所以你必须知道连接到哪里?
要求所有这些因为我们正在使用带有HAProxy的RabbitMQ集群,所以我们可以将集群结构与我们的应用程序分离.这样,无论何时节点完成,HAProxy都将重定向到活动节点.但是当我们杀死其中一个兔子节点时,我们遇到了问题.与兔子的连接是永久性的,所以如果它失败了,你必须重新创建它.此外,在这种情况下,您必须重新发送消息,否则您将丢失它们.
即使有了所有这些,消息仍然可能丢失,因为当我杀死节点时(在某些缓冲区,网络上的某个地方等),它们可能正在传输中.因此,您必须使用事务或发布者确认,以确保在所有镜像填满消息后进行交付.但这是另一个问题.您可能有重复的消息,因为代理可能已发送了从未到达生产者的确认(由于网络故障等).因此,消费者应用程序将需要以幂等方式执行重复数据删除或处理传入消息.
有没有办法避免这种情况?或者我必须决定是否可以丢失一些消息而不是重复某些消息?
我刚刚购买了SSL证书.它附带1个服务器证书,1个中间证书和1个根证书.
我有*.csr文件和*.key用于创建证书.
我正在使用Tutum和HAProxy,并且有一个SSL_CERT环境变量.我阅读了文档,但无法使其正常工作.如何设置此SSL_CERT环境变量?
我使用HAProxy每10秒发送一次健康检查.
它按以下方式进行:
HAProxy -> server: [SYN]
server-> HAProxy : [SYN, ACK]
HAProxy->server : [RST, ACK]
Run Code Online (Sandbox Code Playgroud)
我的TCP服务器是用以下方式用java编写的:
while (true){
Socket socket = kaServerSocket.accept();
MyListener listener = new MyListener(socket);
listener.start(); //costly operation
}
Run Code Online (Sandbox Code Playgroud)
在Windows 7上,accept()在此交换后不返回(它在常规syn-> ack-> syn握手后返回),这就是我需要的.
但是,当应用程序在Windows Server 2012上运行时,accept()函数[SYN]将从HAProxy发送的第一个函数返回,并执行代价高昂的操作.
所以我有两个问题:
这种行为是可配置的吗?
如果我不想在运行监听器之前等待第一位或消息,我怎样才能在Windows 2012上检测到来自HAProxy的连接?
编辑:
它可以连接到Windows上的ATM TCP/IP吗?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx
使用accept函数时,实现在连接建立遍历发送方和接收方之间的整个距离之前,函数可能会返回.这是因为accept函数在收到CONNECT ACK消息后立即返回; 在ATM中,一旦处理CONNECT消息,就由路径中的下一个交换机返回CONNECT ACK消息(而不是由最终建立连接的端节点发送CONNECT ACK).因此,应用程序应该意识到,如果在收到CONNECT ACK消息之后立即发送数据,则数据丢失是可能的,因为可能没有在发送方和接收方之间始终建立连接.
情况如下:
我有许多Web服务器,比如10.我需要使用(软件)负载均衡器,它可以使用反向代理服务器实现,如HAProxy或Varnish.现在,我们所服务的所有流量都是通过https而不是http,所以Varnish是不可能的.
现在,我想将用户的请求分成几个类别,这些类别取决于请求的一个输入(POST)参数.根据该参数,我需要在服务器之间划分请求,基于此,(即使所有其他输入(POST)参数相同),不同的服务器将以不同的方式提供服务.
所以,我需要定义一个自定义负载平衡算法,这样,对于该参数的特定值,我将负载除以特定的3(比方说),对于某些其他值,将请求分为特定的2和其他值( s),剩下的5.
由于我不能使用清漆,因为它不能用于终止ssl(定义自定义算法在VCL中很容易),我正在考虑使用HA-Proxy.
所以,这是一个问题:
任何人都可以帮助我如何使用HA-Proxy定义自定义负载平衡功能?
我研究了很多,但我找不到任何这样的文件.因此,如果HA-Proxy不可能,您是否可以将我转介给其他一些反向代理服务,它也可以用作负载均衡器,以满足上述两个标准?(ssl终止和定义自定义负载平衡的能力).
编辑:
这个问题是我之前提出的一个问题.用于https的清漆
过去几天我一直在努力在Digtital Ocean上创建一个码头群.注意:我不想使用-link与其他应用程序/容器进行通信,因为它们在技术上被认为已被弃用,并且与docker swarm不兼容(即我无法在不重新编写的情况下向负载均衡器添加更多应用程序实例整个群体)
我根据本指南使用一台服务器作为运行控制台的kv-store服务器.Becasue我在数字海洋,我在DO上使用私人网络,所以机器可以相互通信.
然后我创建一个配置单元主服务器和从服务器,并启动在所有计算机上运行的覆盖网络.这是我的docker-compose.yml
proxy:
image: tutum/haproxy
ports:
- "1936:1936"
- "80:80"
web:
image: tutum/hello-world
expose:
- "80"
Run Code Online (Sandbox Code Playgroud)
因此,当我这样做时,它会创建2个容器.HAProxy正在运行,因为我可以访问端口1936处的统计信息http://<ip-address>:1936,但是,当我尝试在端口80转到Web服务器/负载均衡器时,我得到连接被拒绝.当我跑步时,我似乎连接了一切docker-compose ps:
Name Command State Ports
--------------------------------------------------------------------------------------------------------------------------------
splashcloud_proxy_1 python /haproxy/main.py Up 104.236.109.58:1936->1936/tcp, 443/tcp, 104.236.109.58:80->80/tcp
splashcloud_web_1 /bin/sh -c php-fpm -d vari ... Up 80/tcp
Run Code Online (Sandbox Code Playgroud)
我唯一能想到的是它没有链接到Web容器,但我不确定如何解决这个问题.
我很感激你的帮助.
我想知道是否有人在前端设置了带有http2支持的HAProxy和后端的HTTP/1.1
后端服务器目前是Varnish,所以只支持HTTP/1.1
http2在场景中是否工作,持久连接将保持对负载均衡器的开放,然后负载均衡器将降级到后端的HTTP1.1连接.
或者前端和后端都需要支持HTTP2?
haproxy ×10
https ×2
ssl ×2
amazon-ec2 ×1
connection ×1
docker ×1
docker-swarm ×1
http ×1
http2 ×1
java ×1
networking ×1
rabbitmq ×1
scalr ×1
tcp ×1
varnish ×1