Score:1

HAProxy 2.0 - ลองคำขอบางส่วนอีกครั้งตาม URL

ธง jp

ฉันติดตั้ง 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" ดังนั้นจึงไม่ควรยึดติดกับเซิร์ฟเวอร์แบ็กเอนด์ที่เลือก ) และสิ่งนี้ถูกส่งไปยังเซิร์ฟเวอร์อื่นแทน

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

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา