โรบินกลมถ่วงน้ำหนักผ่าน TTL - เป็นไปได้ไหม


9

ปัจจุบันฉันใช้ 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 แต่ฉันไม่มีวิธีตั้งค่าระบบดังกล่าว


เตรียมพร้อมที่จะถูกตีหัวด้วยสำเนา RFC 2181 § 5.2 โดยผู้ตอบแบบสอบถามที่หลากหลาย
JdeBP

ฉันรู้ว่า RR ไม่ได้ออกแบบมาสำหรับการทำโหลดบาลานซ์ แต่มันใช้งานได้ดี ... ดังนั้น ... ฉันยังไม่ได้ตระหนักถึงทางเลือกอื่น แน่นอนว่ามี แต่พวกเขาอาจเป็นไปไม่ได้ที่ฉันจะวางหรือแพงเกินไปหรือซับซ้อนเกินไป
The Shurrican

@JdeBP ใช่จุดที่ดี - TTL ใน RRset ต้องเหมือนกัน
Alnitak

คำตอบ:


2

ก่อนอื่นฉันเห็นด้วยอย่างสมบูรณ์กับ @Alnitak ว่า DNS ไม่ได้ออกแบบมาสำหรับสิ่งนี้และวิธีปฏิบัติที่ดีที่สุดคือไม่ใช้ (ab) ใช้ DNS เป็นตัวโหลดบาลานซ์ของคนยากจน

คำถามของฉันตอนนี้คือ ... มี prectices / methos / rules ที่ดีที่สุดในการกระจายน้ำหนัก robin โดยใช้แอตทริบิวต์ TTL ของระเบียน DNS หรือไม่

ในการตอบคำถามของคำถามวิธีการที่ใช้ในการทำ basix ถ่วงน้ำหนัก robin round โดยใช้ DNS คือ:

  • ปรับการเกิดขึ้นของระเบียนในการตอบสนอง DNS ที่มีสิทธิ์ คือถ้าServer Aมี 1/3 ของการรับส่งข้อมูลและServer Bจะมี 2/3 ดังนั้น 1/3 ของการตอบสนอง DNS ที่มีสิทธิ์ไปยังผู้รับมอบฉันทะ DNS จะมีเฉพาะ A IP ของและการตอบสนองของ 2/3 BIP เท่านั้น (หากเซิร์ฟเวอร์ 2 เครื่องขึ้นไปแบ่งปัน 'น้ำหนัก' เท่ากันก็สามารถรวมเป็นคำตอบเดียว)
  • ใช้ DNS TTL ต่ำเพื่อให้การโหลดที่ไม่สมดุลได้รับการแก้ไขอย่างรวดเร็ว เนื่องจากพร็อกซี DNS แบบดาวน์สตรีมมีจำนวนลูกค้าที่ไม่ได้อยู่เบื้องหลังพวกเขามากคุณจึงต้องสุ่มบันทึกซ้ำอีกครั้ง

บริการRoute 53 DNSของ Amazon ใช้วิธีนี้

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

ขวา. ดังนั้นเมื่อฉันเข้าใจสิ่งนี้คุณมีการดาวน์โหลด / กระจายวิดีโอ / บริการดาวน์โหลดไฟล์ขนาดใหญ่ที่ 'ถูก' / บางส่วนซึ่งอัตราบิตรวมของบริการเกินกว่า 1 GBit

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

  • DNS ปัด robin เป็นอินสแตนซ์ของ load balancer โหลด TCP / IP หรือ HTTP อย่างน้อยสองรายการ
  • อินสแตนซ์ของโหลดบาลานเซอร์แต่ละตัวจะพร้อมใช้งานสูง (2 ตัวโหลดบาลานเซอร์ที่เหมือนกันให้ความร่วมมือในการรักษาที่อยู่ IP หนึ่งไว้เสมอ)
  • แต่ละอินสแตนซ์ของ load balancer ที่ใช้ robin round ถ่วงน้ำหนักหรือการจัดการการเชื่อมต่อแบบสุ่มถ่วงน้ำหนักไปยังเซิร์ฟเวอร์ส่วนหลัง

การตั้งค่าประเภทนี้สามารถสร้างขึ้นด้วยซอฟต์แวร์โอเพนซอร์ซหรือด้วยเครื่องมือที่สร้างขึ้นจากผู้ขายหลายราย load balancing แท็กที่นี่เป็นจุดเริ่มต้นที่ดีหรือคุณอาจจะจ้าง sysadmins ที่ได้ทำแบบนี้มาก่อนเพื่อให้คำปรึกษาสำหรับคุณ ...


4

คำถามของฉันตอนนี้คือ ... มี prectices / methos / rules ที่ดีที่สุดในการกระจายน้ำหนัก robin โดยใช้แอตทริบิวต์ TTL ของระเบียน DNS หรือไม่

ใช่แนวทางปฏิบัติที่ดีที่สุดไม่ได้ทำ !!

กรุณาทำซ้ำหลังจากฉัน

  • DNS ไม่ได้ใช้สำหรับการปรับสมดุลโหลด
  • DNS ไม่ได้ให้ความยืดหยุ่น
  • DNS ไม่ได้จัดให้มีสิ่งอำนวยความสะดวกที่ล้มเหลว

DNS สำหรับแมปชื่อการอย่างใดอย่างหนึ่งหรือที่อยู่ IP เพิ่มเติม การสร้างสมดุลในภายหลังที่คุณได้รับคือผ่านโชคไม่ใช่การออกแบบ


1
more IP addresses... นั่นเป็นวิธีที่ไม่สมดุล? นอกจากนี้นี่คือเหตุผลที่ฉันแนะนำคำถามของฉันอย่างเหมาะสม หากฉันไม่ได้ทำเช่นนั้นฉันจะใส่ข้อความของคุณเป็นความคิดเห็น แต่จะต้องลงคะแนนแบบนี้ maby มันไม่ใช่การออกแบบ แต่มันใช้งานได้ดีและมอบข้อได้เปรียบที่ยอดเยี่ยมเมื่อเทียบกับทางเลือกทั้งหมด และนั่นคือสิ่งที่เว็บไซต์เช่น google, facebook, amazon และอื่น ๆ คิดเช่นกันและใช้มัน อย่างไรก็ตามความคิดเห็นที่ระบุไว้ ฉันอัปเดตคำถามของฉันพร้อมข้อมูลเพิ่มเติมเกี่ยวกับสถานการณ์และขอให้คุณแนะนำโซลูชันสมดุลทางเลือก @Alnitak
The Shurrican

2
การทรงตัวในแบบนี้ไม่รับประกันความสมบูรณ์เนื่องจากปัญหาด้านลูกค้าจำนวนมากเกิดขึ้นนอกการควบคุมของคุณ นี่เป็นทวีคูณดังนั้นเมื่อคุณต้องการ 'น้ำหนัก' เพราะพื้นฐานคุณไม่สามารถรับประกันได้ว่าโรบินรอบแรก DNS เป็นบริการที่แนะนำเท่านั้นลูกค้าไม่จำเป็นต้องทำตามจดหมาย ฉันคิดว่านั่นเป็นจุดที่ @Alnitak ต้องการทำ
Matthew Ife

ฉันเข้าใจอย่างสมบูรณ์แบบ อ้างจากคำถามของฉัน: ฉันได้เรียนรู้ว่าไม่ใช่ทุก ISP / อุปกรณ์ที่ปฏิบัติต่อการตอบสนองในลักษณะเดียวกัน ตัวอย่างเช่นเซิร์ฟเวอร์ DNS บางตัวจะหมุนที่อยู่แบบสุ่มหรือหมุนเวียนไปเรื่อย ๆ บางคนเพียงแค่เผยแพร่รายการแรก แต่บางรายการก็พยายามตรวจสอบว่ารายการไหนดีที่สุด (ใกล้เคียงระดับภูมิภาค) โดยดูที่อยู่ IP อย่างไรก็ตามหากฐานผู้ใช้มีขนาดใหญ่พอ (กระจายไปตาม ISP หลาย ๆ เครื่อง) ยอดคงเหลือก็ค่อนข้างดี ความแตกต่างจากเซิร์ฟเวอร์ที่โหลดสูงสุดไปต่ำสุดแทบจะไม่เกิน 15%
The Shurrican

@JoeHopfgartner วิธีเดียวที่เข้าใจผิดได้ในการให้ความยืดหยุ่นการจ่ายซ้ำและการทรงตัวอยู่ที่เลเยอร์ IP - เช่นการกำหนดเส้นทาง BGP และการโหลดบาลานซ์เลเยอร์ 4 ฉันไม่ได้พูดในคำตอบนี้เพราะฉันได้พูดไปแล้วหลายสิบครั้งในคำตอบอื่น ๆ
Alnitak

ความซ้ำซ้อนเป็นสิ่งสำคัญสำหรับโซลูชันของคุณหรือไม่ IE ถ้าเซิร์ฟเวอร์ทำงานล้มเหลวจะจัดการอย่างเหมาะสมหรือไม่ เพราะถ้ามันเป็นการเปิดตัวของคุณเวิร์มกับ RR-DNS
Matthew Ife

2

ลองดูที่PowerDNS ช่วยให้คุณสร้างแบ็กเอนด์ไปป์ที่กำหนดเอง ฉันได้แก้ไขแบ็กเอนด์ตัวโหลดบาลานเซอร์ DNS ตัวอย่างที่เขียนในภาษา Perl เพื่อใช้โมดูลAlgorithm :: ConsistentHash :: Ketama สิ่งนี้ช่วยให้ฉันกำหนดน้ำหนักตามใจชอบ:

my $ketamahe = Algorithm::ConsistentHash::Ketama->new();

# Configure servers and weights
$ketamahe->add_bucket("192.168.1.2", 50);
$ketamahe->add_bucket("192.168.1.25", 50);

และอีกหนึ่ง:

# multi-colo hash
my $ketamamc = Algorithm::ConsistentHash::Ketama->new();

# Configure servers and weights
$ketamamc->add_bucket("192.168.1.2", 33);
$ketamamc->add_bucket("192.168.1.25", 33);
$ketamamc->add_bucket("192.168.2.2", 17);
$ketamamc->add_bucket("192.168.2.2", 17);

ฉันได้เพิ่ม cname จากโดเมนระดับบนสุดที่ต้องการไปยัง subdoman ฉันเรียก gslb หรือ Global Server Load Balancing จากตรงนั้นฉันเรียกใช้เซิร์ฟเวอร์ DNS ที่กำหนดเองนี้และส่งระเบียน A ตามน้ำหนักที่ฉันต้องการ

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

ฉันแนะนำให้อ่านเซิร์ฟเวอร์ DNS ทางเลือกโดย Jan-Piet Mens เขามีความคิดที่ดีมากมายรวมถึงโค้ดตัวอย่าง

ฉันขอแนะนำให้ละทิ้งการปรับ TTL คุณได้รับไกลแล้วการเพิ่ม kludge ด้านบนจะทำให้การแก้ไขปัญหาและเอกสารยากมาก


1

คุณสามารถใช้ PowerDNS เพื่อถ่วงน้ำหนักรอบโรบินแม้ว่าการกระจายโหลดในลักษณะที่ไม่สมดุลย์ (100: 1?) อาจน่าสนใจมากอย่างน้อยก็อัลกอริธึมที่ฉันใช้ในโซลูชันของฉันซึ่งรายการ RR แต่ละรายการมีน้ำหนักที่เกี่ยวข้อง ระหว่าง 1-100 และมีการใช้ค่าสุ่มเพื่อรวมหรือไม่รวมระเบียน

นี่คือบทความที่ฉันเขียนเกี่ยวกับการใช้แบ็กเอนด์ MySQL ใน PowerDNS เพื่อทำ RR DNS แบบถ่วงน้ำหนัก: http://www.mccartney.ie/wordpress/2008/08/wrr-dns-with-powerdns/

RIPienaar ยังมีตัวอย่างจาก Ruby (ใช้แบ็กเอนด์ของ PowerDNS): http://code.google.com/p/ruby-pdns/wiki/RecipeWeightedRoundRobin


1

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


ปัญหาที่เกิดขึ้นคือฉันมีปัญหากับแบนด์วิดท์และไม่ใช่ปัญหาของจำนวนคำขอที่เซิร์ฟเวอร์เดียวสามารถจัดการได้ ดังนั้นทางออกที่ฉันต้องควบคุมปริมาณการใช้งานทั้งหมดผ่านหนึ่งโหนดไม่ใช่วิธีแก้ปัญหาสำหรับฉัน สิ่งเดียวที่ฉันนึกถึงข้างโซลูชัน DNS คือที่อยู่ IP แบบหลายผู้รับ ฉันแก้ไขคำถามของฉันตามนั้น
The Shurrican

ขอโทษฉันหมายถึง anycast ไม่ใช่ multicast (ฉันคิดว่า)
The Shurrican

1
หากแบนด์วิดท์เป็นปัญหาคุณควรดู + LACP นี้ในสวิตช์ของคุณ จากนั้นคุณสามารถผูกการ์ด 10G หลายใบในอุปกรณ์โหลดบาลานซ์
Mark Harrigan

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