วิธีที่ดีที่สุดในการโหลดบาลานซ์ในหลาย ๆ ไฟล์เซิร์ฟเวอร์คงที่แม้กระทั่งการกระจายแบนด์วิดธ์?


12

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

ฉันพบผู้ให้บริการโฮสต์ที่ให้แบนด์วิดท์ที่ไม่มีมิเตอร์ราคาถูกที่ฉันใช้อยู่ปัญหามาเมื่อฉันเริ่มผลักแบนด์วิดท์ให้มากที่สุดเท่าที่การ์ดเครือข่าย 100mbs สามารถจัดการได้ดังนั้นจึงต้องมีเซิร์ฟเวอร์ที่สอง

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

ที่ต้องการ:

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

  • URL สั้น ๆ ฉันไม่ต้องการตั้งค่าโดเมนย่อยเช่น img.example.com เพื่อแสดงภาพของฉัน example.com/image.jpg คือตอนนี้เป็นอย่างไรและฉันต้องการให้อยู่อย่างไร แต่ถ้าไม่มีวิธีอื่นฉันก็เข้าใจ

  • เซิร์ฟเวอร์ clostest ที่จัดการการร้องขอจะดีจริง ๆ แต่ไม่จำเป็นต้อง สิ่งที่ต้องจำไว้

HAProxy ถึง loadbalance:

  • มันจะง่ายมากที่จะทำตั้งแต่ฉันใช้ HAProxy อยู่แล้ว อย่างไรก็ตามฉันคิดว่าปัญหาเกิดขึ้นเมื่อทำการกระจายแบนด์วิดท์ ฉันอาจจะผิดในเรื่องนี้ แต่ไม่ HAProxy ส่งคำขอไปยังเซิร์ฟเวอร์ที่เซิร์ฟเวอร์ประมวลผลแล้วส่งกลับผ่าน HAProxy ไปยังลูกค้าหรือไม่ ดังนั้นทราฟฟิกทั้งหมดจะย้อนกลับไปที่ load balancer ทำให้มันใช้แบนด์วิดท์เท่าที่เซิร์ฟเวอร์ทั้งหมดรวมกัน

DNS Round Robin:

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

ส่งคืนเซิร์ฟเวอร์โดยตรง:

  • ดูเหมือนซับซ้อนจริงๆ แต่อาจเป็นตัวเลือกที่ดี ฉันจะยังสามารถส่ง URL ไปยังเซิร์ฟเวอร์บางแห่งได้หรือไม่ เช่นเดียวกับตอนนี้ด้วย HAProxy ทุก URL ที่ลงท้ายด้วยนามสกุลไฟล์ที่ถูกต้องจะถูกส่งไปยัง Lighttpd ในขณะที่ส่วนขยายอื่น ๆ จะถูกส่งไปยัง Apache ดังนั้นฉันต้องการสิ่งที่คล้ายกัน เช่นเดียวกับคำขอ php ทั้งหมดได้รับการจัดการโดยเซิร์ฟเวอร์เดียวกันที่รันซอฟต์แวร์การปรับสมดุลในขณะที่คำขอ jpg ทั้งหมดถูกส่งไปยังเซิร์ฟเวอร์หลายเครื่อง

เป็นการดีถ้า HAProxy สนับสนุน Direct Server Return ปัญหาของฉันก็จะได้รับการแก้ไข ฉันไม่ต้องการใช้ CDN เพราะราคาแพงจริง ๆ และนี่เป็นเพียงโครงการด้านหลังเท่านั้น

คุณเข้าใจปัญหาของฉันหรือไม่ แจ้งให้เราทราบหากฉันไม่ได้อธิบายบางอย่างถูกต้องหรือหากคุณต้องการข้อมูลเพิ่มเติม


1
นี่คือ Imgur และเพิ่งยก 40 ล้านดอลลาร์ : O
L1th1um

คำตอบ:


3

วาดภาพคำขอ / ตอบกลับของคุณสำหรับแอปพลิเคชันและแยกคอขวด คุณถูกต้องที่พร็อกซีเดียวที่กระจายโหลดไปยังแอปพลิเคชันเซิร์ฟเวอร์จำนวนมากจะต้องการแบนด์วิดธ์รวมของแอปพลิเคชันเซิร์ฟเวอร์ทั้งหมด วิธีการแก้ปัญหาแบบดั้งเดิมคือ RR DNS Google, Yahoo และ Amazon ใช้เทคนิคนี้พร้อม TTL สั้น ๆ ฉันไม่ได้สอบสวนบางส่วนในขณะที่กลับและเอกสารผลของฉัน

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


ขอบคุณมาก. ผลสำรวจของคุณมีประโยชน์มาก ฉันคิดว่านี่เป็นทางออกที่ฉันจะมาในที่สุด อย่างไรก็ตาม "เช่นเดียวกับนักวิจัยที่ดีฉันไม่ทำอะไรจนกว่าฉันจะมีข้อมูลเพียงพอ" :)
อลัน

ขอบคุณสำหรับความเข้าใจ น่าเสียดายที่ลิงก์แดกดันไปยังสิ่งที่คุณค้นพบไม่สามารถแก้ไขได้ไหม
TCB13

3

บางคำตอบ:

  • ใช่ทราฟฟิกทั้งหมดส่งผ่าน HAProxy เนื่องจากทำงานเป็นพร็อกซีระดับ HTTP สิ่งนี้จะเหมือนกันแม้ว่า HAProxy จะถูกติดตั้งบนเซิร์ฟเวอร์แยกต่างหากที่โหลดยอดเซิร์ฟเวอร์หลายหลัง ดังนั้นหากผู้ให้บริการโฮสต์ของคุณจ่ายเฉพาะพอร์ตเครือข่าย 100MBit และคุณได้เพิ่ม 100MBit แล้วแสดงว่าคุณมีปัญหา
  • เกี่ยวกับโดเมนสิ่งที่ดีที่สุดคือการแสดงรูปภาพจากโดเมนอื่นที่ไม่ใช่ webapp ของคุณไม่ใช่โดเมนย่อยเป็นโดเมนอื่นเพื่อไม่ให้ส่งคุกกี้ตามคำขอรูปภาพ ดูสตีฟ Souders งานเดิมหรือการดำเนินการที่นี่ในกองมากเกิน หาก URL สั้น ๆ มีความสำคัญต่อคุณอาจเป็นสิ่งที่ดีที่สุดที่จะย้าย webapp ออกจาก URL หลักนั่นคือย้ายแอปพลิเคชันการจัดการไฟล์ไปที่ login.sitename.com หรือไม่

คุณต้องการการรับรองความถูกต้องในคำขอภาพหรือไม่? ถ้าไม่อย่างนั้นแล้วการใช้บางอย่างเช่น Amazon S3 ล่ะ? สามารถปรับขนาดได้อย่างหนาแน่นและค่าใช้จ่ายในการถ่ายโอนข้อมูลค่อนข้างถูก ในกรณีนี้ผมจะใช้ Somthing เช่น i.sitename.com เป็น DNS CNAME สำหรับถังชื่อโฮสต์ Amazon S3, ดูเอกสารแอมะซอน AFAIK คุณไม่สามารถมีชื่อโดเมนรูท (sitename.com) เป็น CNAME ดังนั้นคุณต้องใช้โดเมนย่อยเช่น i.sitename.com สำหรับสิ่งนี้

คุณสามารถแฮชอิมเมจของคุณในหลาย ๆ เซิร์ฟเวอร์ คือคุณสร้างโครงสร้าง DNS เช่น login.sitename.com และ a.sitename.com b.sitename.com; c.sitename.com และอื่น ๆ "a." และ "b." เซิร์ฟเวอร์อื่น ๆ มีระบบไฟล์ที่มีรูปภาพและเซิร์ฟเวอร์ HTTP น้ำหนักเบา (คุณใช้ Lighttpd อยู่แล้วดังนั้นให้ใช้งานต่อไปสำหรับโครงการในอนาคตฉันจะเสนอให้ดู nginx เพื่อทดแทนที่ดีกว่า) เมื่อผู้ใช้อัปโหลด ภาพคุณสร้างกัญชาของตัวระบุเฉพาะบางทีชื่อของเขาอาจจะเป็นชื่อไฟล์หรือการรวมกันของตัวระบุหลาย จากแฮชนี้คุณจะพิจารณาว่าเซิร์ฟเวอร์ใดที่จะเก็บภาพไว้

แก้ไขฉันควรเห็นว่า hashing ได้ถูกกล่าวถึงแล้ว โดยพื้นฐานแล้วสิ่งที่ฉันเสนอที่นี่คือเพียงใช้ hashing บนชื่อโฮสต์เช่นกันเพื่อกระจายการรับส่งข้อมูลเครือข่ายอย่างสม่ำเสมอในหลายโฮสต์

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


1

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

คุณพูดว่า URL สั้น ๆ มีความสำคัญ ทำไม? เป็นเรื่องใหญ่โตไหมที่จะเปลี่ยนภาพจาก "example.com" เป็น "i.example.com"? คุณสามารถตั้งค่า "i" เป็น IP ของตัวเองบนเซิร์ฟเวอร์ของตัวเองด้วย Lighttpd และเลี่ยงผ่าน HAProxy ทั้งหมดแก้ปัญหาปริมาณงานของคุณ คุณจะได้รับประโยชน์จากเว็บเบราว์เซอร์ที่อนุญาตให้เปิดคำขอได้มากขึ้นในครั้งเดียวเนื่องจากมันจะถือว่าพวกเขาเป็นชื่อโดเมนที่ต่างกันและสามารถเปิดการเชื่อมต่อพร้อมกันได้มากขึ้น หากเซิร์ฟเวอร์ "i" ตัวเดียวคุณอิ่มตัวคุณสามารถใช้ DNS round-robin เพื่อเพิ่มอีกหนึ่งตัว หวังว่าในเวลานั้นคุณจะสร้างรายได้เพียงพอที่จะใช้ทางออกที่ดีกว่า


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

1

ผู้ให้บริการโฮสต์ของคุณมีบริการสร้างความสมดุลภาระงานหรือไม่? ฉันคิดว่าเป็นทางออกที่ดีที่สุด

อีกวิธีในการดำเนินการ แต่จำเป็นต้องมีการทดสอบคือเขียนใหม่ (เป็นเบาหรือ apache) คำขอ ตัวอย่างเช่น: example.com/file.html อยู่ใน apache และ example.com/image.jpg จะเปลี่ยนเส้นทางไปยัง i.example.com/image.jpg คำขอทั้งหมดจะได้รับการจัดการผ่าน apache แต่ reponses (แบนด์วิดธ์ upstream) กำลังไปยังเซิร์ฟเวอร์ lighttpd โดเมนมีความโปร่งใสต่อผู้ใช้ คุณยังคงต้องทดสอบว่า apache สามารถจัดการการร้องขอทั้งหมดหรืออาจปล่อยให้ lighttpd ทำงานนี้

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

UPDATE

มองหาเอกสาร HAproxyฉันพบพารามิเตอร์ "redir" ฉันไม่ทราบว่าสามารถใช้งานได้เหมือน apache rewrite หรือไม่ แต่ก็มีประโยชน์ เอกสารกล่าวว่า:

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

อาจจะเหมาะกับกรณีของคุณ


เฮ้ขอบคุณสำหรับการตอบกลับ ฉันเคยลองทำแบบนี้มาแล้วจริง ๆ แล้วมันไม่ได้ผลดีในทางปฏิบัติในทางทฤษฎี เหตุผลก็คือ Apache จัดการกับการร้องขอทั้งหมดดังนั้นทุกครั้งที่ผู้ใช้ชมรูปภาพ Apache จะกลับกลายเป็นดูที่ URL แล้วส่งไปที่มันเบา ซึ่งไม่แตกต่างกันเพียงแค่ให้ Apache จัดการภาพตั้งแต่แรก ฉันยอมรับว่า load balancer ของโฮสต์ของฉันเป็นตัวเลือกที่ดีที่สุด แต่ก็เป็นหนึ่งในราคาที่แพงที่สุด พวกเขาคิดค่าบริการต่อการเชื่อมต่อพร้อมกันและฉันได้รับหลายร้อยคน
อลัน

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

1

ฉันสมมติว่าด้วยชุดภาพขนาดใหญ่คุณจะไม่เก็บภาพตามชื่อไฟล์ดั้งเดิมเนื่องจากคุณจะพบความขัดแย้งของชื่ออย่างรวดเร็ว

แอปพลิเคชั่นจำนวนมากที่จัดการกับปัญหาประเภทนี้ใช้แฮชของไฟล์และโครงสร้างไดเรกทอรีตามแฮชนั้น โครงสร้างไดเรกทอรีมีลักษณะดังต่อไปนี้โดยที่เส้นทางไดเรกทอรีคือสองอักขระแรกของแฮชจากนั้นไดเรกทอรีระดับที่ 2 คืออักขระสองตัวถัดไปในแฮช

/image root/AA/AA/images  
/image root/AA/AB/images

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

ข้อเสียคือแฮ็ชไม่สมบูรณ์แบบและอาจมีการชนกัน ฉันไม่แน่ใจว่าสิ่งนี้เกี่ยวข้องกับอะไร ดังนั้นอาจใช้เวลาศึกษาค้นคว้าในส่วนของคุณ ฉันคิดว่าเขียนกฎในหนังสือมอบฉันทะที่ควรจะสามารถที่จะใช้ A3A8BBC83261.jpg กัญชาพูดและเขียนมันhttp://img3.domain.com/A3/A8/BBC83261.jpg คุณอาจไม่คิดว่าเป็น URL สั้น ๆ


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

แต่ถ้าคุณเก็บ AA ถึง 33 บนเซิร์ฟเวอร์หนึ่งและ 34 ถึง 99 บนเซิร์ฟเวอร์อื่นคุณจะไม่เพียง แต่ปรับสมดุลปัญหาหน่วยเก็บข้อมูล แต่ยังรวมถึงการกระจายแบนด์วิดท์ด้วย
3dinfluence

0

ในโพสต์ของคุณคุณกล่าวว่าคุณรู้สึกว่า DNS round robbin อาจเป็นตัวเลือกที่ดีที่สุดของคุณ แต่คุณกังวลเกี่ยวกับเซิร์ฟเวอร์เดียวที่ล้มเหลว ...

หากเป็นกรณีนี้ให้ดูที่ Simple Failover จาก JH Software ฉันเคยใช้มันในอดีตและใช้งานได้ดีมาก

http://www.simplefailover.com

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

นี่คือตัวอย่างจากเว็บไซต์ของพวกเขา:

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

มันทำงานร่วมกับเว็บเซิร์ฟเวอร์ (HTTP), เมลเซิร์ฟเวอร์ (SMTP, IMAP, POP3), เซิร์ฟเวอร์ FTP และประเภทเซิร์ฟเวอร์อื่น ๆ ที่ใช้ TCP / IP

ดังที่ได้กล่าวไปแล้วก่อนหน้านี้ฉันเคยใช้กับทั้งเว็บไซต์และเซิร์ฟเวอร์อีเมลมาก่อน มันทำงานได้ค่อนข้างดี ในกรณีส่วนใหญ่ Failover ค่อนข้างเร็ว (คาดเดา 2-5 นาที) และฉันจะบอกว่าเกือบทุกคนล้มเหลวในเวลาน้อยกว่า 15 นาที

ไม่จำเป็นต้องสมบูรณ์แบบ ... แต่แน่นอนง่ายและรวดเร็ว

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

ในกรณีของเราเราเพิ่งโยนมันลงบนเครื่อง XP บอกให้เครื่องรีบูตหนึ่งครั้งต่อคืนและมันก็ทำงานได้ดีเป็นเวลาหลายปี

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