HAProxy ตรวจสอบสถานะเซิร์ฟเวอร์หลายเครื่องด้วยชื่อโฮสต์ที่ต่างกัน


11

ฉันต้องการโหลดยอดคงเหลือระหว่างเซิร์ฟเวอร์ที่ใช้งานหลายเครื่องที่มีชื่อโฮสต์ต่างกัน ฉันไม่สามารถตั้งค่าโฮสต์เสมือนเดียวกันในแต่ละรายการได้

เป็นไปได้หรือไม่ที่จะมีเพียงหนึ่งการกำหนดค่าการฟังที่มีหลายเซิร์ฟเวอร์และทำให้ Health Checks เป็นไปตามhttp-send-name-header Hostคำสั่ง? ฉันใช้ HAProxy 1.5

ฉันมากับ haproxy.cfg http-send-name-header Hostทำงานนี้อย่างที่คุณเห็นผมต้องตั้งชื่อโฮสต์ที่แตกต่างกันสำหรับแต่ละการตรวจสุขภาพการตรวจสอบสุขภาพละเว้น ฉันต้องการที่จะใช้ตัวแปรหรือวิธีการอื่น ๆ และทำให้สิ่งต่าง ๆ รัดกุมยิ่งขึ้น

global
    log 127.0.0.1 local0 notice
    maxconn 2000
    user haproxy
    group haproxy

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    retries 3
    option redispatch
    timeout connect  5000
    timeout client  10000
    timeout server  10000
    stats enable
    stats uri /haproxy?stats
    stats refresh 5s
    balance roundrobin
    option httpclose

listen inbound :80    
    option httpchk HEAD / HTTP/1.1\r\n
    server instance1 127.0.0.101 check inter 3000 fall 1 rise 1
    server instance2 127.0.0.102 check inter 3000 fall 1 rise 1

listen instance1 127.0.0.101:80
    option forwardfor
    http-send-name-header Host
    option httpchk HEAD / HTTP/1.1\r\nHost:\ www.example.com
    server www.example.com www.example.com:80 check inter 5000 fall 3 rise 2

listen instance2 127.0.0.102:80
    option forwardfor
    http-send-name-header Host
    option httpchk HEAD / HTTP/1.1\r\nHost:\ www.bing.com
    server www.bing.com www.bing.com:80 check inter 5000 fall 3 rise 2

คำตอบ:


2
defaults
log global
retries 2
timeout connect 3000
timeout server 5000
timeout client 5000

listen any-name-1
bind IP-Address:port
mode tcp or http
option user-check user haproxy_check
balance roundrobin
server hostname IpAddress:port check
server hostname  IpAddress:port check
listen any-name-2
bind IP-Address:port
mode tcp or http
option user-check user haproxy_check
balance roundrobin
server hostname IpAddress:port check
server hostanme  IpAddress:port check

listen any-name-3
bind IP-Address:port
mode tcp or http
option user-check user haproxy_check
balance roundrobin
server hostname IpAddress:port check
server hostname  IpAddress:port check

listen any-name-4
bind IP-Address:port
mode tcp or http
option user-check user haproxy_check
balance roundrobin
server hostname IpAddress:port check
server hostname  IpAddress:port check

listen any-name-5
bind IP-Address:port
mode tcp or http
option user-check user haproxy_check
balance roundrobin
server hostname IpAddress:port check
server hostname  IpAddress:port check

listen haproxyadmin
bind HAproxyServerIP:HaproxyPort
mode http
stats enable
stats uri /haproxy
stats realm Strictly\ Private
stats auth username:password

1

อัปเดต : ในกรณีที่คุณอธิบายคุณต้องตรวจสอบ HTTP / 1.1 ซึ่งจำเป็นต้องใช้ชื่อโฮสต์ที่ฮาร์ดโค้ด เมื่อพิจารณาจากเอกสารของรุ่น 1.5 ดูเหมือนจะไม่มีทางหลีกเลี่ยงปัญหานี้ได้เว้นแต่ว่าคุณจะสามารถลดการตรวจสอบ http (ซึ่งโดยทั่วไปไม่แนะนำให้ใช้)

คำตอบเดิม : ในขณะที่ฉันไม่คุ้นเคยกับการเปลี่ยนแปลง 1.5 ของ haproxy สิ่งที่ฉันจะทำใน 1.4 (และฉันค่อนข้างแน่ใจว่ามันยังคงใช้ใน 1.5) คือต่อไปนี้ โปรดทราบว่าการแยกส่วนหน้า / แบ็กเอนด์เป็นเพียงความสะดวกสบายส่วนตัวและคุณสามารถใช้ฟังได้

defaults
    mode http
    option  httplog
    timeout connect  5000
    timeout client  10000
    timeout server  10000

frontend inbound
    bind 127.0.0.1:8000
    default_backend webservers

backend webservers
    option forwardfor
    option httpchk HEAD / HTTP/1.0
    http-send-name-header Host
    server google www.google.com:80 check inter 5000 fall 3 rise 2
    server bing www.bing.com:80 check inter 5000 fall 3 rise 2

และผลลัพธ์:

$ curl -i localhost:8000
HTTP/1.1 301 Moved Permanently
Cache-Control: no-cache
Content-Length: 0
Location: http://www.bing.com/
Server: Microsoft-IIS/8.0
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"
Set-Cookie: _HOP=I=1&TS=1399981378; path=/
Edge-control: no-store
X-MSEdge-Ref: Ref A: 26CEE14531BF45EFAC91FAC3D1945EDF Ref B: 42CE8D142D427C30F7851B56F38837A6 Ref C: Tue May 13 04:42:58 2014 PST
Date: Tue, 13 May 2014 11:42:57 GMT

$ curl -i localhost:8000
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
X-Content-Type-Options: nosniff
Date: Tue, 13 May 2014 11:43:00 GMT
Expires: Thu, 12 Jun 2014 11:43:00 GMT
Cache-Control: public, max-age=2592000
Server: sffe
Content-Length: 219
X-XSS-Protection: 1; mode=block
Alternate-Protocol: 80:quic

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
$

ฉันคิดว่าวิธีการของคุณจะไม่ทำงานเนื่องจากไม่ได้ตั้งค่าส่วนหัวของโฮสต์ หากไม่มีส่วนหัวโฮสต์คำขอจะไม่สามารถเข้าถึงเว็บเซิร์ฟเวอร์ที่ต้องการได้ คุณสามารถทดสอบสิ่งนี้ได้ด้วยexample.heroku.com
Marco Bettiolo

คุณถูกต้อง httpchk ต้องการส่วนหัวโฮสต์ในตัวอย่าง heroku และไม่มีวิธีแก้ปัญหาใด ๆ การทิ้งคำสั่งตรวจสอบจะทำให้พร็อกซีทำงานตามที่ตั้งใจไว้ แต่คุณจะไม่สามารถตรวจพบความล้มเหลวล่วงหน้าได้
user76776

นั่นเป็นปัญหาของฉันอย่างแน่นอนตรวจสอบสุขภาพให้แน่ใจว่าอินสแตนซ์คลาวด์ที่ต้องการส่วนหัวโฮสต์ที่ถูกต้อง
Marco Bettiolo

ฉันไม่สามารถวางเช็ค HTTP / 1.1 ได้ ฉันจะติดกับการใช้งานของฉันตอนนี้
Marco Bettiolo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.