设为首页 收藏本站
查看: 1235|回复: 0

[经验分享] 最大化的利用 HAProxy

[复制链接]

尚未签到

发表于 2015-11-20 12:10:43 | 显示全部楼层 |阅读模式
HAProxy是一个我们在Twilio上广泛使用的神奇软件。今天我们回过头看一下我们的HAProxy配置并解释其中的一些设置。但首先,是我们使用HAProxy历史的一个小故事。



最开始的时候,我们的创始人创建了一个HAProxy的配置。这个配置让集群中的一台主机与其他主机进行通信,并承载各种形式的流量。这个配置在那时是可接受的,它使得创始人开始首轮筹资。

然后创始人说,“我要做一个SMS服务,这个服务可以发送短信。API也可以调用SMS服务来发送消息,这样会很好的。” 不过他们需要一个可以调用SMS服务API的配置。他们将语音服务的配置复制过来,还有它调用SMS的API,很简单。但这个配置不适合SMS请求的要求。

这个配置通吃,它被应用到了Twilio的很多服务。但没有人真正了解这个配置或它的选项。所以当他们需要一个新的配置时,他们就从老配置复制一个。在这种情况下,问题蔓延到了整个集群。






这就是我们过去在Twilio使用HAProxy设置的状态。我们所有的HAProxy配置都是相互拷贝,只更改一些超时值。在我们5个9的可靠性追求下,我们对我们的HAProxy配置进行了增强,以确保它们能稳定地提供服务和承载流量。让我们来看一个示例配置。

# Twilio HTTP HAProxy Configuration# Version: 0.1

这行让我们一看就知道配置在近期由公司的谁重置或更新过,一目了然。

mode    http
option  httplog
log 127.0.0.1 local0 info

这两个选项打开了HAProxy的大多数功能,如果你让HAProxy承载HTTP流量的话你一定也有这个设置。mode http表示HAProxy将检查传入的HTTP请求,如果请求无效便拒绝它。





这个模式允许你记录HTTP请求,生成的日志格式形式如下:


1
Oct
9 15:32:25 127.0.0.1 haproxy[32156]: 127.0.0.1:34677


2
    [09/Oct/2013:15:32:25.744]
twilio-frontend twilio-backends/10.10.10.10


3
    0/0/0/38/71
200 944419 - - ---- 94/0/0/ 0/0 0/0


4
    "GET
http://example.com/ACaaaa?Signature=signature HTTP/1.1"


这些日志给我们展示了请求的丰富细节——从请求的URL到连接花费的时间、下载耗时、应答流的并发连接总数等许多信息。要了解这些日志信息的详细解释的话,看一下HAProxy文档的日志部分

由于我们将越来越多的Twilio工具转换成了面向服务的架构,这些日志在调试错误时非常有用。举个例子,一个顾客反馈她的录音下载时会偶尔失败。虽然录音使用多个不同的服务,但日志中记录了网络组件间协作的时序,这样它就帮助我们定位到了故障的单台主机。





第三行

log 127.0.0.1 local0 info

开启haproxy记录日志到syslog。local0有一个指定的守护进程监听请求,并将收到的haproxy日志记录到一个日志文件中。

注意,启用info级的日志级别意味着HAProxy将记录每一个传入的请求。对于长时间运行的服务器来说,这意味着日志文件早晚会占满硬盘。有一个数据整理策略很重要——每晚使用logrotate等工具截断压缩前一天的日志,删除两周前的日志等。

option http-server-close

假设你有一台HAProxy前端与十个不同的后端通信,且这十个后端不支持HTTP keep-alive。这个设置让HAProxy在客户端和前端之间保持一个持久的连接,并在所有后端服务器之间轮询HTTP请求。当然,要发挥这个设置的功效的话需要客户端同样启用keep-alive。




timeout client 30s
timeout server 30s
这两个设置一起用来设置 HAProxy发送请求的超时时长。实际上,HAProxy等待服务器返回信息给客户端需要多久呢?大多数应用都有某种最大延迟时间,因此你需要添加超时时长。对我们来说,API等待响应的最长时间是30秒,所以每个内部服务根据自身的服务级等级协议(SLA)都应该设置低于30秒的超时时长。注意:如果服务器缓慢地以流的方式传输一个字节,也就是每29秒传输一个字节的话,你将不能触发读超时,所以你可能需要有一个单独的线程监控这样的请求,以保证在适当的时间内完成传输。你还应当把客户端和服务端的超时时长设置为相同的值-即套接口上所期望的读超时时长。
timeout connect 3100
这是一个不同于客户端和服务端超时时长的超时时长!它是HAProxy应当用来试图连接主机所花费的时长。在RWilio以前的日子里,它设置为与服务器超时时长30秒相同的值,因此如果主机宕机的话,HAProxy将试图连接同一个主机30秒。当服务器和客户端主机位于同一个机器上或者在同一个局域网内(或者AZ主机的附近)的时候,这样的连接通常发生在毫秒级。我们允许在进一步处理默认的重传窗口时等待3秒,并且允许有小量的缓冲。



不像服务器超时时长,连接超时时长隐含着客户端的重新连接请求是安全的这层意思。

retries 2
option redispatch

当我说30秒的连接超时时长意味着HAProxy将在30秒内试图进行一次未连接上的连接的时候,我撒谎了。实践证明: 默认情况下,HAProxy将试图进行3次连接请求。因此30秒的连接超时实际上是120秒的连接超时,这违反了服务级别协议,而且意味着我们给客户兑现的是空头支票。

如果第一台主机关机了,那么通常假设HAProxy自动给第二台主机发送请求。不过这仅仅在HAProxy对这个主机进行健康检查后并标记这台主机已经关机的情况下才是这样的。如果一台主机关机了而且对它的健康检查花费了20秒,那么这时你正在对这台主机进行可能的20秒的无效请求。重新分发选项让最终的连接请求发送给另一台下游主机上,因此不同主机发送各自的请求在某种程度上保护了已经不健康的主机。





这两个设置混合在一起缩减重试次数到2,并且这也意味着在放弃这个连接并对另一台主机进行连接之前,我们试图对这台主机进行连接的最大超时时长只有8秒。

option httpchk GET /healthcheck
默认情况下,HAProxy只是对主机打开了一个TCP连接来检查这台主机是否启动。这种ping只能检测这台主机是否关机,不过不能确定它是不健康的(磁盘损坏,网络连接不正常)。httpchk选项将给位于后端的终端节点发送HTTP请求。后端可以进行自检,并回答自身是否健康。注意健康检查应当是相当保守的一种做法,而且通常还扩大了单台主机健康的范围。健康检查未通过将使HAProxy给这台主机不发送任何包,而且如果所有的主机同时都“不健康”,那么你将没有任何后端可依赖了。 我希望这篇文章对你有帮助-我已经在 这儿发布了HAProxy配置的所有更新版本。至于其他问题,
可以阅读手册,这样可以让服务器在性能、可靠性、可用性和稳定性方面得到很大的提高。希望这篇概览能够节省你的时间。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-141485-1-1.html 上篇帖子: 配置 Haproxy 防止 DDOS 攻击 下篇帖子: Haproxy 配置片段记录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表