簡體   English   中英

HAProxy 和 AWS loadBalancer - 503 錯誤

[英]HAProxy and AWS loadBalancer - 503 error

我們最近將我們的主要 Web 應用程序(在具有自動縮放功能的負載均衡器后面的 https 中的 EC2 上運行)拆分為兩個單獨的 Web 模塊。

主要基礎設施現在有一個負載均衡器和一個用於主模塊的 n-server ( main.elasticbeanstalk.com ) 和一個帶有 n-server 的負載均衡器用於輔助模塊 ( secondary.elasticbeanstalk.com )

我們創建了一個 HAproxy 專用實例,該實例由域 www.mycompany.com 解析並代理請求,如下所示:

- ://www.mycompany.com/ fancymodule - > secondary.elasticbeanstalk.com

-://www.mycompany.com/ -> main.elasticbeanstalk.com

我們將其投入生產,大約 12小時后.. http://www.mycompany.com/fancymodule開始獲得 503 服務不可用。 如果我手動重新啟動 HAproxy,一切都會開始正常運行。

我設法復制了更新與 secondary.elasticbeanstalk.com 關聯的 IP 地址的問題(即:從負載均衡器轉換為單個實例)。

似乎 HAproxy 沒有更新解析到 secondary.elasticbeanstalk.com 的 dns,因此它卡住了舊 IP,無法正確訪問 Web 服務器。

而且停機時間不短! 在我重新啟動服務之前,它無法正確路由!

負載均衡器是否有可能在 elasticIp 中與新的 ipaddress 相關聯,因此不再可訪問?

有人可以看看這個配置並告訴我我是否在做一些愚蠢的事情嗎?

global
  log         127.0.0.1:514 local2 info
  chroot    /var/lib/haproxy
  pidfile     /var/run/haproxy.pid
  maxconn     4000
  user        haproxy
  group   haproxy
  daemon

# turn on stats unix socket
  stats socket /var/lib/haproxy/stats
  tune.ssl.default-dh-param 2048

defaults
  retries                 3
  timeout http-request    10s
  timeout queue           1m
  timeout connect         10s
  timeout client          1m
  timeout server          1m
  timeout http-keep-alive 10s
  timeout check           10s
  mode    http
  option  httplog

frontend mydomain
  log global
  bind *:80
  bind *:443 ssl crt /etc/ssl/certificate.pem
  acl isSsl ssl_fc
  redirect scheme https if !isSsl
  option dontlog-normal
  mode http

  acl secondaryDomain url_beg /fancymodule

  acl liveDomain hdr_end(Host) -i www.mycompany.com

  use_backend live_secondary if secondaryDomain liveDomain
  use_backend live_main if liveDomain

  default_backend live_main

backend live_main
  rspadd Set-Cookie:\ module=main;Path=/
  server main main.elasticbeanstalk.com:80

backend live_secondary
  rspadd Set-Cookie:\ module=secondary;Path=/
  server secondary secondary.elasticbeanstalk.com:80

listen stats :1234
  mode http
  stats enable
  stats hide-version
  stats realm Haproxy\ Statistics
  stats uri /stats
  stats auth user:pswd

我發現,為了提高性能,HAproxy 只是在啟動時用實際的 IP 地址替換配置域。 之后沒有進行 dns 解析。

http://www.serverphorums.com/read.php?10,358605 https://serverfault.com/questions/681000/force-haproxy-to-lookup-dns-for-backend-server

因此,解決方案是使用 HAProxy 創建自動縮放負載均衡器,或者使用外部偵聽器在 dns ip 更改上自動重新加載服務

我在 AWS 中部署了后端服務器的設置中遇到了同樣的問題。 在我們的內部網絡中運行的 HAProxy 會突然關閉這個后端服務器,並給出 L7STS/503 檢查結果,而我們的監控正在(直接)訪問后端服務器就好了。 當我們運行 HAProxy 對(LB01 和 LB02)時,LB01 的重新加載立即起作用,后端服務器再次啟動。 在 LB02(不是故意重新加載)上,這個后端服務器仍然關閉。

所有這些似乎都與 AWS LB 的 DNS 更改以及 HAProxy 如何進行 DNS 緩存有關。 默認情況下,HAProxy 在啟動/重新加載時解析所有 DNS 記錄(例如后端)。 這些解析后的 DNS 記錄會保留在 HAProxy 自己的 DNS 緩存中。 因此,您必須重新加載 HAProxy 以更新 DNS 緩存。

另一個無疑更好的解決方案是定義 DNS 服務器和 HAProxy 內部 DNS 緩存 TTL。 這是可能的,因為 HAProxy 版本 1.6 具有如下配置片段:

global
[...]

defaults
[...]

resolvers mydns
  nameserver dnsmasq 127.0.0.1:53
  nameserver dns1 192.168.1.1:53
  nameserver dns2 192.168.1.253:53
  hold valid 60s

frontend app-in
  bind *:8080
  default_backend app-out

backend app-out
  server appincloud myawslb.example.com:443 check inter 2s ssl verify none resolvers mydns resolve-prefer ipv4 

因此,這樣做是使用以nameserver開頭的條目定義的 DNS 服務器來定義名為mydns的 DNS 名稱服務器集。 內部 DNS 緩存應保留 60 秒,由hold valid 60s秒定義。 在后端服務器的定義中,您現在通過添加resolvers mydns來引用此 DNS 名稱服務器集。 在此示例中,首選通過添加resolve-prefer ipv4 (默認使用 ipv6)來解析 IPv4 地址。

請注意,為了在后端服務器中使用resolvers ,還必須定義check 每當觸發后端服務器檢查時,就會發生 DNS 查找。 在此示例中,定義了check inter 2s ,這意味着 DNS 查找將每 2 秒發生一次。 這將是相當多的查找。 通過將內部hold緩存設置為 60 秒,您可以限制 DNS 查找次數,直到緩存過期; 最遲在 62 秒后應進行新的 DNS 查找。

從 HAProxy 1.8 版開始,甚至還有一種稱為“DNS 服務發現”的高級可能性,它使用 DNS SRV 記錄。 這些記錄包含多個響應字段,例如優先級、權重等,可以被 HAProxy 解析並相應地更新后端。

更多信息:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM