haproxy: วิธีเตรียมการบำรุงรักษาเซิร์ฟเวอร์โดยไม่ต้องเตะเซสชันแอป


13

ปัญหา

ฉันใช้ haproxy เพื่อโหลดเว็บเซิร์ฟเวอร์ที่มีความสมดุล ฉันใช้การคงอยู่ของเซสชันกับคุกกี้เพิ่มเติมเนื่องจากบางแอปพลิเคชันใช้ไฟล์เซสชันและสิ่งเหล่านี้จะไม่ซิงโครไนซ์ระหว่างเซิร์ฟเวอร์

ฉันต้องการที่จะปิดการใช้งานเซิร์ฟเวอร์เพื่อการบำรุงรักษา แต่ไม่มีการทำลายเซสชัน ดังนั้นฉันต้องการอนุญาตให้ลูกค้าที่มีอยู่เพื่อดำเนินการต่อแอปพลิเคชันของพวกเขา แต่ไม่ยอมรับลูกค้าใหม่

พฤติกรรม haproxy

  • ฉันตั้งเซิร์ฟเวอร์เป็น "กำลังบำรุงรักษา"
  • หากลูกค้ามีชุดคุกกี้ให้ใช้เซิร์ฟเวอร์แม้ว่าทำเครื่องหมายว่า "กำลังเข้าสู่การบำรุงรักษา"
  • หากมีลูกค้าใหม่ (ไม่มีคุกกี้) จะถูกส่งไปยังเซิร์ฟเวอร์อื่น
  • หลังจากไคลเอนต์ทั้งหมดจบเซสชันแอปพลิเคชันแล้วจะไม่มีลูกค้าตั้งคุกกี้ไว้ที่เซิร์ฟเวอร์นี้อีกต่อไปและฉันก็ยินดีที่จะปิดมันโดยไม่ทำให้ผู้ใช้หยุดชะงัก

คุณคิดว่าสิ่งนี้สามารถทำได้ด้วยการกำหนดค่า haproxy บ้างไหม? หรือมีวิธีที่ชาญฉลาดที่จะทำมัน?

ทางอื่น

รายการอื่น ๆ ที่ไม่ครบถ้วนสมบูรณ์เพื่อให้บรรลุความต้องการนี้

  • ซิงโครไนซ์ไฟล์เซสชันระหว่างเซิร์ฟเวอร์ (ต้องการวิธีการซิงโครไนซ์ไฟล์ระหว่างเซิร์ฟเวอร์หลายเครื่องหรือจุดเมานต์เดียวทั่วไป)
  • ใช้ฐานข้อมูลเพื่อเก็บข้อมูลเซสชัน (จำเป็นต้องเปลี่ยนพฤติกรรมของแอปพลิเคชัน)

รายละเอียดเพิ่มเติม

ฉันใช้การกำหนดค่าประเภทนี้:

frontend https-in
   bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
   reqadd X-Forwarded-Proto:\ https

   acl APP1 hdr(host) -i APP1.atac.local
   use_backend APP1 if APP1

   default_backend _default

backend APP1
   redirect scheme https if !{ ssl_fc }
   mode http
   balance roundrobin
   cookie HAPROXY_SESSION insert indirect
   option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
   server SRV1 SRV1_IP:PORT cookie SRV1 check
   server SRV2 SRV2_IP:PORT cookie SRV2 check

ถ้าฉันเพิ่งปิดการใช้งาน SRV1 (ด้วยคำสั่ง haproxy cli) ฉันคิดว่าแอปพลิเคชันเซสชันทั้งหมดที่เปิดบน SRV1 จะแตกหลังจากสิ้นสุด HTTP "เซสชัน" ปัจจุบัน นั่นถูกต้องใช่ไหม?


เซิร์ฟเวอร์ของคุณทำงานในโหมด HTTP หรือโหมด TCP หรือไม่
ออสติน

1
@austinian; ดูเหมือนว่าโหมด http น่าจะเป็นวิธีที่เขาพูดถึงเรื่องการทรงตัวและการคงอยู่โดยอิงตามคุกกี้ (โหมด TCP ไม่มีคุณสมบัติดังกล่าว)
GregL

@Christophe คุณลองใช้การตั้งค่าตามที่อธิบายไว้ในส่วน 'พฤติกรรม haproxy' ของคุณเพราะมันควรจะทำงาน
GregL

@GregL ใช่ฉันเองก็คิดเช่นกัน หากเขาใช้โหมด HTTP และตั้งค่าเซิร์ฟเวอร์เป็นโหมดการบำรุงรักษาก็จะหยุดรับเซสชันใหม่ แต่ให้เซสชันที่ถูกต้องใช้งานได้จนกว่าจะหมดอายุ คุณยังสามารถมีคุกกี้และอื่น ๆ ในโหมด TCP แต่จะไม่มีความหมายอะไรกับ HAProxy
austinian

@Christophe คุณพยายามใช้ "วิธีที่ฉลาดกว่านี้" เพื่อทำให้เวลาในการบำรุงรักษาสั้นลงหรือเพียงแค่มองหาวิธีที่จะทำให้การประชุมสิ้นสุดลงอย่างงดงามในขณะที่คุณรอการบำรุงรักษาหรือไม่?
ออสติน

คำตอบ:


6

ทำให้เซิร์ฟเวอร์อยู่ในโหมดระบายน้ำโดยใช้อินเตอร์เฟสการจัดการเว็บ ที่มีฟังก์ชั่นที่แน่นอนที่คุณกำลังมองหา


3
หากคุณตั้งค่าให้ Maint ก็จะหยุดการส่งใดจราจรไปดังที่ระบุไว้ที่นี่ ค่อนข้างเขาต้องการที่จะนำมันเข้าสู่โหมดการระบายน้ำและใช้ a stick-tableพร้อมกับหมดอายุเพื่อให้การติดตา
GregL

@GregL โอ๊ะโอกำลังแก้ไขตอนนี้
ออสเตียเนียน

ขอบคุณสำหรับคำตอบออสเตรียและ @GredL ฉันจะลองดู ส่วนที่ยากจะอยู่กับไม้โต๊ะฉันคิดว่า ฉันจะต้องหาวิธีที่จะเก็บลูกค้าทุกคนด้วยการตั้งค่าคุกกี้ให้กับเซิร์ฟเวอร์โหมดการระบายในโต๊ะแบบนี้
Christophe Drevet-Droguet

ดูเหมือนว่าโหมด drain จะเพียงพอในกรณีของฉันเซสชันที่มีชุดคุกกี้แล้วยังคงใช้เซิร์ฟเวอร์ที่ระบายออกแล้วและเซสชันใหม่จะถูกนำไปยังเซิร์ฟเวอร์อื่น
Christophe Drevet-Droguet

1
คุณจะเปลี่ยนโหมดในเว็บอินเตอร์เฟสได้อย่างไร? ดูเหมือนว่าจะเป็นข้อมูลเท่านั้น
kagronick

9

หากคุณใช้socatเพื่อสื่อสารกับการกำหนดค่า haproxy ของคุณคุณสามารถทำให้เซิร์ฟเวอร์อยู่ในสถานะระบายได้ด้วยวิธีต่อไปนี้:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

คำสั่งเพิ่มเติมที่นี่ ! สำหรับการติดตั้ง socat ใน Ubuntu ไปที่คำตอบนี้

ฉันทดสอบด้วย haproxy 1.6.3 เวอร์ชั่น :)


1

ทางอื่น

ซิงโครไนซ์ไฟล์เซสชันระหว่างเซิร์ฟเวอร์ (ต้องการวิธีการซิงโครไนซ์ไฟล์ระหว่างเซิร์ฟเวอร์หลายเครื่องหรือจุดเมานต์เดียวทั่วไป)

หากเซิร์ฟเวอร์ด้านหลังของคุณใช้ PHP สำหรับแอปพลิเคชันคุณสามารถใช้ Memcache เพื่อซิงค์เซสชันระหว่างพวกเขา

นอกจากนี้Couchbase-Serverยังสามารถทำ memcache replication ได้อีกด้วย
แน่นอนว่ามันเกินความสามารถในการใช้ couchbase-server สำหรับการจำลองแบบเซสชัน :)


แม้ว่ามันจะเป็นวิธีที่ดีกว่า แต่ก็ต้องมีการเปลี่ยนแปลงรหัสฉันคิดว่า ดังนั้นฉันจะใช้ออสเตรียและ GregL คำตอบสำหรับแอปพลิเคชันปัจจุบันของเราที่ไม่ซิงค์เซสชัน
Christophe Drevet-Droguet

หากรหัสของคุณไม่ได้ตั้งค่าตัวจัดการเซสชันที่กำหนดเองคุณไม่จำเป็นต้องเปลี่ยนรหัสใด ๆ สำหรับ PHP เพื่อใช้ memcache สำหรับเซสชัน มันถูกกำหนดค่าทั้งหมดใน php.ini ไม่ใช่ในรหัส
Cha0s

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