ปัจจุบันฉันใช้ DNS round robin เพื่อทำ load balance ซึ่งใช้งานได้ดี บันทึกมีลักษณะเช่นนี้ (ฉันมี TTL 120 วินาที)
;; ANSWER SECTION:
orion.2x.to. 116 IN A 80.237.201.41
orion.2x.to. 116 IN A 87.230.54.12
orion.2x.to. 116 IN A 87.230.100.10
orion.2x.to. 116 IN A 87.230.51.65
ฉันได้เรียนรู้ว่าไม่ใช่ว่า ISP / อุปกรณ์ทุกเครื่องใช้วิธีการตอบสนองแบบเดียวกัน ตัวอย่างเช่นเซิร์ฟเวอร์ DNS บางตัวจะหมุนที่อยู่แบบสุ่มหรือหมุนเวียนไปเรื่อย ๆ บางคนเพิ่งเผยแพร่รายการแรกบางคนพยายามที่จะตรวจสอบว่าที่ดีที่สุด (ใกล้ภูมิภาค) โดยดูที่อยู่ IP
อย่างไรก็ตามหากฐานผู้ใช้มีขนาดใหญ่พอ (กระจายไปตาม ISP หลายรายเป็นต้น) จะทำให้ยอดคงเหลือค่อนข้างดี ความแตกต่างจากเซิร์ฟเวอร์ที่โหลดสูงสุดไปต่ำสุดแทบจะไม่เกิน 15%
อย่างไรก็ตามตอนนี้ฉันมีปัญหาที่ฉันแนะนำเซิร์ฟเวอร์เพิ่มเติมเข้าสู่ระบบและนั่นไม่ใช่ทั้งหมดมีความจุเท่ากัน
ปัจจุบันฉันมีเซิร์ฟเวอร์ 1 Gbps เท่านั้น แต่ฉันต้องการทำงานกับ 100 Mbps และเซิร์ฟเวอร์ 10 Gbps ด้วย
ดังนั้นสิ่งที่ฉันต้องการคือฉันต้องการแนะนำเซิร์ฟเวอร์ที่มี 10 Gbps ที่มีน้ำหนัก 100, เซิร์ฟเวอร์ 1 Gbps ที่มีน้ำหนัก 10 และเซิร์ฟเวอร์ 100 Mbps ที่มีน้ำหนัก 1
ก่อนหน้านี้ฉันได้เพิ่มเซิร์ฟเวอร์สองครั้งเพื่อให้ปริมาณการใช้งานเพิ่มขึ้น (ซึ่งใช้งานได้ดี - แบนด์วิดท์เกือบสองเท่า) แต่การเพิ่มเซิร์ฟเวอร์ 10 Gbps 100 เท่าให้กับ DNS นั้นค่อนข้างไร้สาระ
ดังนั้นฉันจึงคิดถึงการใช้ TTL
ถ้าฉันให้เซิร์ฟเวอร์ 240 วินาที TTL และเซิร์ฟเวอร์ B เพียง 120 วินาที (ซึ่งเป็นเรื่องเกี่ยวกับขั้นต่ำที่จะใช้สำหรับการปัดเศษรอบเนื่องจากเซิร์ฟเวอร์ DNS จำนวนมากตั้งค่าเป็น 120 หากระบุ TTL ต่ำ (ดังนั้นฉันจึงเคยได้ยิน)) ฉันคิดว่าสิ่งนี้ควรเกิดขึ้นในสถานการณ์ที่เหมาะสม
First 120 seconds
50% of requests get server A -> keep it for 240 seconds.
50% of requests get server B -> keep it for 120 seconds
Second 120 seconds
50% of requests still have server A cached -> keep it for another 120 seconds.
25% of requests get server A -> keep it for 240 seconds
25% of requests get server B -> keep it for 120 seconds
Third 120 seconds
25% will get server A (from the 50% of Server A that now expired) -> cache 240 sec
25% will get server B (from the 50% of Server A that now expired) -> cache 120 sec
25% will have server A cached for another 120 seconds
12.5% will get server B (from the 25% of server B that now expired) -> cache 120sec
12.5% will get server A (from the 25% of server B that now expired) -> cache 240 sec
Fourth 120 seconds
25% will have server A cached -> cache for another 120 secs
12.5% will get server A (from the 25% of b that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of b that now expired) -> cache 120 secs
12.5% will get server A (from the 25% of a that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of a that now expired) -> cache 120 secs
6.25% will get server A (from the 12.5% of b that now expired) -> cache 240 secs
6.25% will get server B (from the 12.5% of b that now expired) -> cache 120 secs
12.5% will have server A cached -> cache another 120 secs
... I think I lost something at this point, but I think you get the idea...
อย่างที่คุณเห็นสิ่งนี้ค่อนข้างซับซ้อนในการทำนายและแน่นอนว่าจะไม่ได้ผลเช่นนี้ในทางปฏิบัติ แต่มันควรจะมีผลต่อการกระจายอย่างแน่นอน!
ฉันรู้ว่าโรบินปัดถ่วงน้ำหนักนั้นมีอยู่และควบคุมโดยเซิร์ฟเวอร์รูทเท่านั้น มันวนไปรอบ ๆ ระเบียน DNS เมื่อตอบสนองและส่งกลับระเบียน DNS ด้วยชุดความน่าจะเป็นที่สอดคล้องกับน้ำหนัก เซิร์ฟเวอร์ DNS ของฉันไม่รองรับสิ่งนี้และข้อกำหนดของฉันนั้นไม่แม่นยำ ถ้ามันไม่ได้น้ำหนักอย่างสมบูรณ์มันก็โอเค แต่มันควรจะไปในทิศทางที่ถูกต้อง
ฉันคิดว่าการใช้ฟิลด์ TTL อาจเป็นโซลูชันที่หรูหราและง่ายกว่าและไม่จำเป็นต้องใช้เซิร์ฟเวอร์ DNS ที่ควบคุมสิ่งนี้แบบไดนามิกซึ่งช่วยประหยัดทรัพยากร
คำถามของฉันตอนนี้คือ: มีวิธีปฏิบัติที่ดีที่สุด / วิธี / กฎของหัวแม่มือเพื่อกระจายน้ำหนักรอบ robin โดยใช้คุณลักษณะ TTL ของระเบียน DNS หรือไม่
แก้ไข:
ระบบนี้เป็นระบบพร็อกซีเซิร์ฟเวอร์ไปข้างหน้า จำนวนแบนด์วิดท์ (ไม่ใช่การร้องขอ) เกินกว่าเซิร์ฟเวอร์ตัวเดียวที่สามารถรองรับ Ethernet ได้ ดังนั้นฉันจึงต้องการโซลูชันสมดุลที่กระจายแบนด์วิดท์ไปยังเซิร์ฟเวอร์หลายแห่ง มีวิธีอื่นนอกเหนือจากการใช้ DNS หรือไม่ แน่นอนฉันสามารถใช้ load balancer พร้อมไฟเบอร์แชนเนลเป็นต้น แต่ค่าใช้จ่ายมันไร้สาระและมันยังเพิ่มความกว้างของคอขวดเท่านั้นและไม่ได้กำจัด สิ่งเดียวที่ฉันคิดได้คือ anycast (มันคือ anycast หรือ multicast?) ที่อยู่ IP แต่ฉันไม่มีวิธีตั้งค่าระบบดังกล่าว