ฉันติดตั้ง HAProxy เวอร์ชัน 2.0.14 แล้ว และฉันกำลังมองหากรณีการใช้งานเฉพาะที่ฉันยังไม่สามารถกำหนดค่าได้อย่างถูกต้อง
โดยทั่วไปฉันมีฟรอนท์เอนด์ที่รับฟังพอร์ตและเซิร์ฟเวอร์แบ็กเอนด์สองตัว เมื่อเซสชันเริ่มขึ้น คุกกี้จะถูกใช้ ดังนั้นเซสชันจึงเชื่อมโยงกับเซิร์ฟเวอร์แบ็กเอนด์เฉพาะ และไม่สามารถแชร์กับเซิร์ฟเวอร์อื่นได้ เพื่อให้บรรลุสิ่งนี้ฉันใช้ โต๊ะติด
และ ติดอยู่
คำหลักและสคริปต์ LUA เพื่อรับค่าที่ต้องการจากคำขอ
อย่างไรก็ตาม เมื่อคำขอแรกมาถึง หากเซิร์ฟเวอร์แบ็กเอนด์ที่เลือกไม่สามารถตอบสนองได้ทันเวลา เราควรเฟลโอเวอร์ไปยังเซิร์ฟเวอร์อื่น เนื่องจาก ณ จุดนั้น คุกกี้ยังไม่ได้ตั้งค่า
จนถึงตอนนี้ฉันมีการกำหนดค่าต่อไปนี้:
ทั่วโลก
บันทึก 127.0.0.1 len 10,000 local2 ดีบัก
chroot /var/lib/haproxy
ผู้ใช้แฮพร็อกซี
กลุ่ม haproxy
ภูต
lua-โหลด /opt/LUA/myparser.lua
ซ็อกเก็ตสถิติ /etc/haproxy/haproxysock ผู้ดูแลระบบระดับ
ค่าเริ่มต้น
เข้าสู่ระบบทั่วโลก
ตัวเลือก httplog
ตัวเลือก dontlognull
โหมด http
หมดเวลาเชื่อมต่อ 5,000
ลูกค้าหมดเวลา 50,000
หมดเวลาเซิร์ฟเวอร์ 50,000
รูปแบบบันทึก "Client IP:port = [%ci:%cp], เวลาเริ่มต้น = [%tr], ชื่อส่วนหน้า = [%ft], ชื่อส่วนหลัง = [%b], เซิร์ฟเวอร์ส่วนหลัง = [%s], เวลา เพื่อรับคำขอทั้งหมด = [%TR ms], เวลาตอบกลับ = [%Tr ms], รหัสสถานะ = [%ST], ไบต์ที่อ่าน = [%B]"
ส่วนหน้า chatgw_front
ผูก *:8776
ตัวเลือก http-buffer-request
ประกาศคำขอจับภาพ len 40000
http-request จับภาพ req.body id 0
http-คำขอจับภาพ req.hdrs len 2048
http-request track-sc0 ตาราง src my_back
use_backend my_back
แบ็กเอนด์ my_back
วงเวียนสมดุล
สตริงแบบติดโต๊ะ len 32 size 30k หมดอายุ 30m
ติดตาราง "lua.parseId" my_back
ตรวจสอบเซิร์ฟเวอร์ server1 x.x.x.1:8080
ตรวจสอบเซิร์ฟเวอร์ server2 x.x.x.2.8080
สิ่งนี้จะเกิดขึ้นหากเซิร์ฟเวอร์แบ็กเอนด์ที่เลือกไม่ตอบสนองภายใน 50 วินาที ระบบจะส่ง HTTP 504 Gateway Timeout ไปยังไคลเอนต์ สิ่งที่ฉันต้องการแทนคือ หากนี่เป็นคำขอแรกในเซสชัน ดังนั้น (และหลังจากนั้นเท่านั้น) จึงจะเฟลโอเวอร์ไปยังเซิร์ฟเวอร์แบ็กเอนด์อื่น เราสามารถบอกได้ว่านี่เป็นคำขอแรกตาม URL
ฉันพยายามเปลี่ยนแบ็กเอนด์ดังนี้:
แบ็กเอนด์ my_back
วงเวียนสมดุล
สตริงแบบติดโต๊ะ len 32 size 30k หมดอายุ 30m
ติดตาราง "lua.parseId" my_back
# ตรวจสอบว่านี่คือคำขอ "init" หรือไม่: ในกรณีนี้ URL มี "/init"
acl is_init เส้นทาง_sub /init
# ในกรณีของคำขอ "init" ให้เปิดใช้งานการส่งซ้ำไปยังเซิร์ฟเวอร์ส่วนหลังอื่นในกรณีที่ล้มเหลว
ตัวเลือกส่งซ้ำถ้า is_init
# ในกรณีของคำขออื่นๆ (ไม่ใช่ "init") เราเชื่อมโยงกับเซิร์ฟเวอร์แบ็กเอนด์ที่เลือกแล้วเนื่องจากคุกกี้เซสชัน ดังนั้นปิดใช้งานการส่งซ้ำ
ไม่มีตัวเลือกส่งซ้ำถ้า !is_init
ตรวจสอบเซิร์ฟเวอร์ server1 x.x.x.1:8080
ตรวจสอบเซิร์ฟเวอร์ server2 x.x.x.2.8080
อย่างไรก็ตามฉันมีพฤติกรรมเดียวกันทุกประการ ดังนั้นฉันจึงพยายามเพิ่ม "ลองใหม่":
แบ็กเอนด์ my_back
วงเวียนสมดุล
สตริงแบบติดโต๊ะ len 32 size 30k หมดอายุ 30m
ติดตาราง "lua.parseId" my_back
acl is_init เส้นทาง_sub /init
ตัวเลือกส่งซ้ำถ้า is_init
ไม่มีตัวเลือกส่งซ้ำถ้า !is_init
ลองอีกครั้งเมื่อ conn-failure ว่างเปล่า-response-หมดเวลาการตอบสนอง
ตรวจสอบเซิร์ฟเวอร์ server1 x.x.x.1:8080
ตรวจสอบเซิร์ฟเวอร์ server2 x.x.x.2.8080
ตอนนี้แตกต่างออกไป: ลองใช้คำขอเริ่มต้น 4 ครั้งบนเซิร์ฟเวอร์เดียวกัน จากนั้นส่งคืน HTTP 504 จากนั้นได้รับคำขอถัดไป (ซึ่งไม่ใช่ "init" ดังนั้นจึงไม่ควรยึดติดกับเซิร์ฟเวอร์แบ็กเอนด์ที่เลือก ) และสิ่งนี้ถูกส่งไปยังเซิร์ฟเวอร์อื่นแทน
โดยพื้นฐานแล้ว ปัญหาของฉันคือ: จะใช้การเฟลโอเวอร์ในคำขอแรกเท่านั้นได้อย่างไร คำขออื่นใดจะต้องติดอยู่กับเซิร์ฟเวอร์ส่วนหลังที่เลือกเสมอ