我正在尝试将 HAProxy 1.4.22 与 URI 平衡和哈希类型一致用于 3 个清漆缓存后端之间的负载平衡。我的理解是,这永远不会在服务器之间实现完美平衡,但它应该比我看到的结果要好。
我的 HAproxy 配置的相关部分如下所示:
backend varnish
# hash balancing
balance uri
hash-type consistent
server varnish1 10.0.0.1:80 check observe layer7 maxconn 5000 id 1 weight 75
server varnish2 10.0.0.2:80 check observe layer7 maxconn 5000 id 2 weight 50
server varnish3 10.0.0.3:80 check observe layer7 maxconn 5000 id 3 weight 50
Run Code Online (Sandbox Code Playgroud)
我一直在通过将我自己的主机文件指向新的代理服务器来进行自我测试,我什至尝试将流行的主页重新路由到一个单独的后端,该后端是平衡循环的,以从散列平衡后端中去除异常值,这似乎工作正常。作为测试,我将 varnish1 的权重提高到 75,但这似乎没有帮助。我的负载非常不成比例,我不明白为什么会这样。


一个有趣的花絮是,如果我反转 ID,更高的 ID 将始终获得最大份额的流量。为什么 ID 会影响平衡?
调整权重很好,但随着我网站的流量模式发生变化(我们是一个新闻网站,最受欢迎的帖子可能会迅速变化),我不想经常调整权重。我知道它永远不会达到完美的平衡,但我期待比让一台重量较低的服务器获得比另一台重量较高的服务器多 25 倍的连接更好的结果。
我的目标是通过减少缓存级别的重复来减少数据库和应用程序服务器负载,HAproxy URI 平衡被推荐用于,但如果它会失去平衡,它对我来说根本不起作用。
有什么建议吗?
我有 x 集群。这个集群看起来像
Cluster 1
192.168.1. (Server type 1)
192.168.2. (Server type 2)
192.168.3.1 (Server type 3) <Redis server>
Cluster 2
192.167.1. (Server type 1)
192.167.2. (Server type 2)
192.167.3.1 (Server type 3) <Redis server>
Run Code Online (Sandbox Code Playgroud)
目前我正在用代码管理集群组配置。是否有可能使用 haproxy 调用一个域,并且根据源 ip 需要哪些重定向?例如
192.167.* request gets redirect to 192.167.3.1
Run Code Online (Sandbox Code Playgroud)
和
192.168.* request gets redirect to 192.168.3.1
Run Code Online (Sandbox Code Playgroud) 我创建了一个测试用户,并希望限制这个“测试”用户通过 visudo 只运行以下命令。
echo "show stat" | socat stdio /var/run/haproxy.sock
Run Code Online (Sandbox Code Playgroud)
视觉
test ALL=(root)NOPASSWD:/usr/bin/socat stdio /var/run/haproxy.sock
Run Code Online (Sandbox Code Playgroud)
ls -lat /var/run/haproxy.sock
srwxr-xr-x 1 munin haproxy 0 May 22 22:32 /var/run/haproxy.sock
Run Code Online (Sandbox Code Playgroud)
我运行了以下命令
test#sudo echo "show stat" | socat stdio /var/run/haproxy.sock
Run Code Online (Sandbox Code Playgroud)
错误信息
2013/05/22 23:13:14 socat[21289] E connect(3, AF=1 "/var/run/haproxy.sock", 23): Permission denied
Run Code Online (Sandbox Code Playgroud)
我可以知道 visudo 中哪些配置不正确吗
我是 haproxy 的新手,并将其用于 rsyslog 日志到 ArcSight 连接器的 TCP 负载平衡。在我的一生中,我无法让流量在池中的所有节点之间均匀平衡(这是所需的行为)。我已经尝试了很多权重和 maxconn 的排列都无济于事。
感觉这应该是一个简单的问题,但是每个池节点的行为非常混乱。此外,由于大多数人使用 haproxy 进行 http 负载平衡,因此我发现关于我正在尝试做的事情的最佳方法的文档很少。
任何人都可以推荐任何见解、经过验证的配置或故障排除步骤?
谢谢!
这是我们当前的配置:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 256000
user haproxy
group haproxy
spread-checks 5
daemon
quiet
defaults
log global
option dontlognull
option redispatch
option allbackups
maxconn 256000
timeout connect 5000
listen stats :1936
mode http
stats enable
stats realm Haproxy\ Statistics
stats uri /
stats auth admin:savetheday
frontend rsyslog_netscreen
bind 127.0.0.1:8514
mode tcp
option tcplog
option contstats
option tcpka …Run Code Online (Sandbox Code Playgroud) 在将行添加到/etc/haproxy/haproxy.cfg作为创建透明代理的一部分之后,
source 0.0.0.0 usesrc clientip
Run Code Online (Sandbox Code Playgroud)
重新启动 haproxy 开始出现错误
~# service haproxy reload
* Reloading haproxy haproxy
[ALERT] 230/153724 (1140) : [/usr/sbin/haproxy.main()] Some configuration options require full privileges, so global.uid cannot be changed.
Run Code Online (Sandbox Code Playgroud)
我已经service haproxy reload以root. 我们还需要做什么?谢谢!
有一个fastcgi二进制健康检查的例子在HAProxy的博客。我将如何为 MongoDB 构建一个类似的检查,以便我对它进行更强大的健康检查MongoDB- 一个验证服务器实际上在那里并做出响应而不是仅仅检查端口是否打开的检查?
如果运行状况检查足够通用以与各种MongoDB分片组件(配置服务器、mongos、mongod)一起使用,这将非常有用。
我开发了一个简单的 REST 风格的 Web 应用程序,由 2 个基本模块组成。
模块#1:服务器暴露 REST Web 服务,无状态,部署在 Tomcat 中
模块#2:REST 客户端
有一个部署了 Module#1 的 Tomcat 实例。
我想水平扩展它并在第二台机器上运行第二个 Tomcat。在负载平衡/集群方面,我是一个完整的新手,这就是我需要帮助的原因。不需要会话复制和故障转移。
我应该如何处理它?
我做了一项研究,这些是我看到的可能的方法:
1.无集群,无第三方代理。
我在第二台机器上运行第二个 Tomcat。由于我可以控制客户端和服务器,我可以在客户端提供一个非常基本的算法并随机选择一个主机,这将在 API 调用之前选择。不需要配置集群,也不需要提供第三方代理。是否有任何潜在的陷阱?这是正确的方法吗?
2.Tomcat集群
说到Tomcat集群配置,是不是说有2个Tomcat在单独的机器上运行,并且他们的配置说它们是一个集群?我需要一个单独的库,工具吗?Tomcat 就够了吗?我会像第一种方法一样运行 2 个进程吗?
3.Tomcat负载均衡器
Tomcat集群和Tomcat负载均衡器有什么区别?再次,我需要一个单独的库,工具吗?Tomcat 就够了吗?
4. 第三方代理
我找到了一些关于 HAProxy 之类的信息。这是否意味着,所有调用都经过它,代理决定选择哪个主机?这是否意味着除了两个Tomcat进程之外还会有第三个单独运行?假设我在两台不同的机器上有 2 个 Tomcat,这个代理在哪台机器上运行?
我应该选择哪一个?我误解了什么吗?文章,答案表示赞赏。
我一直在尝试测试如下所示的设置:
网站:Http GET 请求 -> Nginx -> HAProxy -> .Net 应用程序
我将 Nginx 和 HAProxy 放在同一台 Debian 机器上。但是,HAProxy 不断返回“Bad Request (Invalid Host)”。我已经确定 HAProxy 有问题,首先将请求直接从网站发送到 .Net 应用程序,该应用程序有效。将 Nginx 链接到 .Net 应用程序也有效。但是,当我尝试使用 HAProxy 进行测试时,我开始收到错误消息。.Net 应用程序是否实际在 HAProxy 后面运行并不重要,我总是收到错误消息。
我尝试发送的消息的一个示例是http://192.168.7.119:81/a:diff1. 预期的回复是 JPG 图像。当发送到 HAProxy(Apache、Nginx、应用程序)以外的任何东西时,这似乎工作正常,但 HAProxy 只是说“错误请求”。奇怪的是,我的日志文件中没有看到任何错误。
以下是日志文件中的示例:
Feb 2 15:10:08 companyDebian haproxy[5566]: 192.168.7.114:51105 [02/Feb/2015:15:10:08.415] renderfarm renderfarm/renderA 0/0/0/1/1 400 212 - - ---- 1/1/0/1/0 0/0 "GET /a:diff1 HTTP/1.1"
Feb 2 15:10:08 companyDebian haproxy[5566]: 192.168.7.114:51105 [02/Feb/2015:15:10:08.417] renderfarm renderfarm/renderA 73/0/0/4/77 400 212 - - ---- …Run Code Online (Sandbox Code Playgroud) 试图弄清楚为什么 haproxy.cfg 中的环境变量在 HA-Proxy 版本 1.5.2 中不起作用
在命令行上,使用 Printenv 我得到了一个环境变量列表,比如 FE_PORT_8000_TCP_ADDR=172.17.0.4
我需要在 haproxy.cfg 中使用它。根据this和文档 How can I use environment variables in haproxy.conf using $FE_PORT_8000_TCP_ADDR or ${FE_PORT_8000_TCP_ADDR} 应该可以工作。然而,这是行不通的。
在 Haporxy.cfg 硬编码确实有效,并在浏览器中访问它按预期显示:
backend FE
# balance roundrobin
server FE1 172.17.0.4:8000 maxconn 256
Run Code Online (Sandbox Code Playgroud)
但是具有相同假定值的环境变量没有,在浏览器中它给出 503 Service Unavailable。
backend FE
# balance roundrobin
server FE1 $FE_PORT_8000_TCP_ADDR:8000 maxconn 256
Run Code Online (Sandbox Code Playgroud)
关于做错了什么的任何想法?
更新:这个人有同样的问题 如何在 haproxy.conf 中使用环境变量
IETF RFC 2616 第 4.2 节允许请求包含具有相同字段名称的多个标头,只要保留插入的时间顺序,并且它们的值可以转换为具有逗号分隔值列表的单个标头。
http://tools.ietf.org/html/rfc2616#section-4.2
当且仅当该头字段的整个字段值被定义为逗号分隔列表[即,#(values)] 时,消息中可能存在具有相同字段名的消息头字段。通过将每个后续字段值附加到第一个字段值,每个字段值用逗号分隔,必须可以将多个标题字段组合成一个“字段名称:字段值”对,而不改变消息的语义。因此,接收具有相同字段名的头字段的顺序对组合字段值的解释很重要,因此当转发消息时,代理不得更改这些字段值的顺序。F5 不会覆盖任何现有的 X-Forwarded-For。它也不会将现有的 X-Forwarded-For 连接成一个逗号分隔的值。反而,
但是,如果环境中有多个客户端、代理、CDN、流量管理器、参与操作X-Forwarded-For集合的服务器呢?
执行统一的做法似乎有好处。但最佳实践是什么?
F5 BIG-IP 默认 http 配置文件插入标头X-Forwarded-For在请求的预先存在的 XFF 标头集合的末尾累积一个附加标头,以保留顺序。
AWS ELB 鼓励将传入请求的多个X-Forwarded-For合并到一个包含以逗号分隔的 XFF IP 列表以及用户主机地址的单个标头中,以保留顺序。
其他设备可以采用其他变体。
是否存在针对异构环境的商定建议或事实上的标准?
此外,是否提供了任何时间戳数据,以允许代码X-Forwarded-For在先前对 XFF 标头的操作可疑的情况下按添加的时间顺序对标头进行明确排序。
haproxy ×10
400 ×1
amazon-elb ×1
bad-request ×1
cluster ×1
f5-big-ip ×1
http-headers ×1
mongodb ×1
routing ×1
sudo ×1
tomcat ×1
ubuntu ×1
ubuntu-14.04 ×1
varnish ×1
web-server ×1