บล็อก‎ > ‎

Docker คลัสเตอร์ขนาด 2,000 โหนด

โพสต์2 ส.ค. 2559 08:19โดยChanwit Kaewkasi   [ อัปเดต 2 ส.ค. 2559 08:26 ]
ช่วงที่เขียนโพสต์นี้งานยุ่งมากผมเลยตกข่าวไปหลาย ๆ เรื่อง
เพิ่งรู้ว่ามีระบบจองตั๋วล่มอีกแล้ว

ผมเคยเขียนสถาปัตยกรรมของการจองตั๋วไว้แบบนึง คงไม่มีอะไรจะเล่าเพิ่มเติมอีก เพราะแต่ละคนน่าจะต้องเจอปัญหาหน้างานจริง ๆ ก่อนถึงจะเริ่มแก้ไขกัน

ส่วนเรื่องที่จะเล่าในโพสต์นี้คือบทวิเคราะห์ของการสร้างและรัน Docker คลัสเตอร์ที่ใหญ่ที่สุดตัวนึงของโลก เป็นคลัสเตอร์ในรูปแบบ Swarm mode ตัวแรกและตัวเดียวที่มีลักษณะเป็น Crowd-sourcing สร้างขึ้นจากความร่วมมือของหลาย ๆ บริษัท และจากหลาย ๆ คนในชุมชนนักพัฒนารวมถึงผู้ใช้ Docker ซึ่งเรื่องนี้ต่อเนื่องจากที่ผมเคยเกริ่นไว้ในโพสต์ช่วงปีใหม่ และ ปลายเดือน พ.ค. ว่าปีนี้เราจะมีระบบจัดการคลัสเตอร์ในระดับหลายพัน (multi-thousand) โหนดให้ได้ใช้กัน และสร้างคลัสเตอร์แบบนั้นขึ้นมาได้จริง จับต้องได้

รอบนี้ผมโชคดีที่ได้รับเกียรติให้เป็นคนบังคับมังกรยักษ์ขนาด 2,385 โหนดตัวนี้

โครงการที่เราตั้งกันขึ้นมาชื่อว่า Swarm2K สามารถไล่ดูย้อนหลังได้ที่ Twitter แท็ก #DockerSwarm2000 และ #DockerSwarm2K หรือบนหน้า Github ของโครงการ ตอนนี้จะเห็นรายชื่อโหนดที่ ฮีโร่ Swarm2K ของเราทุกคนบริจาคเข้ามา สำหรับบทสนทนาระหว่างการสร้างและทดสอบดูได้ที่ห้องแชท

Swarm2K เป็นโครงการที่ Sebastian และ ผม คุยกันบน Twitter ในวันอาทิตย์ที่ 17 ก.ค. 2559 ว่าเราจะสร้าง Swarm คลัสเตอร์ขนาด 2,000 โหนดเพื่อทดสอบ Swarm mode ระบบใหม่ของ Docker ได้อย่างไร ก็เลยได้แนวคิดว่าจะขอรับบริจาคโหนดจากผู้ที่สนใจบน Twitter และผมก็ไปตั้งโครงการไว้บน Github เพื่อใช้ตามความก้าวหน้าของการบริจาค

ผ่านไป 3-4 วัน เหลือเชื่อมาก เราได้ตัวเลขที่เกิน 3,000+ โหนด
ทะลุเป้า 2,000 โหนดที่วางไว้ แต่ตอนสร้างจริงในวันที่ 22 ก.ค. ก็เกิดปัญหาไว้ตามคาด จำนวนเลยหายไปร่วม ๆ พัน อย่างไรก็ตามเราโชคดีที่ได้จำนวนโหนดจริงรันอยู่ในระดับเกิน 2,000 ทำให้ยังสามารถเริ่มการทดลองได้

ทีม Scaleway จากฝรั่งเศส บริจาคมา 1,200 โหนด มากที่สุดในกลุ่มผู้ร่วมทดสอบทั้งหมด สำหรับในประเทศไทย มี 3 ทีมใหญ่ที่เข้าร่วมโครงการครั้งนี้ก็คือ (ขออนุญาตเรียงชื่อตามลำดับตัวอักษร) AR-BRO/CAT Telecom, Internet Thailand และ NIPA Technology 

ขอขอบคุณบริษัทไทยทั้ง 3 บริษัทมาก ๆ ครับ -/\-

ผมกับทีม Scaleway เซตอัพกันก่อนเวลาจริง 5 ชั่วโมง ผมเริ่มสร้าง Swarm manager ที่ Digital Ocean นิวยอร์ค ส่วนวิศวกรของ Scaleway เริ่ม provision เครื่องที่ฝรั่งเศส

เราทดสอบเพิ่มโหนดกันไปเรื่อง ๆ จนถึง 500 โหนด ก็พบว่าระบบเบื้องต้นทำงานได้ราบรื่น

ทำการ Live Upgrade ตัว Manager

พอเริ่มมีคน join เข้าคลัสเตอร์มากขึ้น ผมเริ่มกังวลว่า CPU ของ manager ทั้ง 3 ตัวจะไม่พอ จึงตัดสินใจ upgrade เครื่อง manager ทั้ง 3 โหนด และเป็นโอกาสพอเหมาะพอดีที่จะได้ทำ Live Upgrade เลยเริ่มจาก ปิด manager และ upgrade ทีละตัว ๆ ในจังหวะนี้เจอเรื่องที่น่าสนใจคือ CPU ของ manager ขึ้นสูงมากเพราะมีกลไกการ recovery log เกิดขึ้น ช่วง CPU สูงนี้เกิดขึ้นตลอดช่วงจนกระทั่ง upgrade ตัว manager ทั้ง 3 ตัวเสร็จ



ปัญหาเกิดขึ้นเยอะมากเพราะระหว่างที่ manager ตัวหลักตายไป คนที่เข้าร่วมทดสอบจะไม่สามารถ join เข้าระบบได้เพราะ IP ที่ต้อง join เป็น IP ของเครื่องที่ down ไป หลังจากอาการขลุกขลักนี้เกิดขึ้น เราก็ผ่านมันไปได้ ระบบกลับมาปกติ และเราจำนวนโหนดก็ค่อย ๆ เพิ่มขึ้น

ทะลุ 2000 โหนด

สุดท้าย จำนวนโหนดก็ทะลุ 2,000 โหนดพอดี ใกล้เคียงกับเวลาที่วางแผนไว้

จากนั้นผมก็เริ่มเอา container (ที่เล็กและเบาที่สุดเท่าที่จะคิดออก) สร้างเป็น task ไปวางในแต่ละโหนด เริ่มจาก 1,000 task ขยับเป็น 10,000 และสุดท้ายพยายามดันให้จำนวน running containers แตะ 100,000

ตัวเลขสุดท้ายที่เราทำได้ คือประมาณ 96,000 container


มาถึงตอนนี้ผมเริ่มสังเกตว่าการวาง container ลงไปในคลัสเตอร์ประวัติศาสตร์ของเรานั้นเริ่มมี failure rate ที่สูงขึ้น เลยสรุปว่าจำนวน container ขนาดนี้น่าจะเป็น limit ของ Swarm แล้ว เพราะสังเกตเพิ่มเติมว่าเวลาในการ query ข้อมูลออกมาดูจากคลัสเตอร์เริ่มช้าลง (~12s เพื่อดูจำนวน container ที่รันอยู่ทั้งหมด) จึงหยุดการทดลอง

ในวันนั้นจึงสรุปเบื้องต้นไปว่า Swarm mode ระบบใหม่ของ Docker สามารถรับจำนวนโหนดได้เกิน 2,300 โหนด และคาดเดาว่าจะไปถึง 2,500 โหนดได้อย่างสบาย ๆ เพราะระบบ manager ในส่วนของการจัดการโหนดยังทำงานได้ดีไม่มีปัญหาเลย

ส่วนจำนวน container ก็สรุปไว้ว่าอยู่ที่ 96,000 container ซึ่งในเบื้องต้นผมสรุปไปว่าเป็นข้อจำกัดของ Swarm ซึ่งเป็นตัวซอฟต์แวร์จัดการคลัสเตอร์อย่างเดียว

แต่เมื่อทั้ง Docker Core Team และผมเอากล่องดำมาวิเคราะห์



ก็เจอว่าเหตุที่ container ไม่ได้เพิ่มขึ้นไปอีกแล้วนั้น ส่วนนึงเกิดจากมีโหนดบางกลุ่มเริ่มล่ม ทำให้ไม่สามารถ schedule container ไปลงที่โหนดนั้น ๆ ได้ และผลลัพท์ก็คือ Swarm พยายามที่จะ schedule ตัว container ให้ได้ปริมาณตามที่กำหนดอีกเรื่อย ๆ ตัวเลข failure ก็เลยเพิ่มขึ้น

ขัอสรุปใหม่สำหรับวันนี้ก็คือ เราไปได้ที่ 96,000 running task เพราะเป็นข้อจำกัดของ cluster เป็นหลัก เราควบคุมสภาพการเข้าออกของแต่ละโหนดไม่ได้เลยเพราะขึ้นกับเจ้าของโหนด และอีกส่วนนึงก็คือ Swarm ยังไม่มีวิธีรับมือในกรณีที่มีอัตราการ failure ของ task สูง

บทสรุป

ในโครงการ Swarm2K เราได้ร่วมกันสร้างปรากฏการณ์ใหม่ขึ้นมาในโลกของ Software Container ด้วย Crowdsourcing Cluster ขนาด 2,000 โหนดที่จะยังไม่มีระบบ Container แบบไหนนอกจาก Docker ที่จะทำได้ เป็นความร่วมมือระดับ Global-scale โหนดที่เข้าร่วมมาจากหลาย ๆ ทวีปทั่วโลกไล่มาตั้งแต่ อเมริกาเหนือ ยุโรป และเอเซีย ที่สำคัญบ้านเราก็ตื่นตัวกันมาก ผมเชื่อว่าโครงการนี้เป็นแรงกระตุ้นให้วงการ Cloud Computing เมืองไทยก้าวกระโดดไปหลายขั้น

หลายคนก็อาจจะสงสัยว่าสิ่งที่เราทำขึ้นมามันเจ๋งแค่ไหน? คงมองไม่เห็นภาพถ้าไม่ได้เปรียบเทียบกับระบบใหญ่ ๆ อย่าง Google Kubernetes
Kubernetes บอกว่าเขาทำได้ 2,000 ที่ 60,000 PODs ถ้าเฉพาะเรื่องจำนวนแบบดิบ ๆ เราได้ ~2,300 โหนด ที่ ~96,000 running container ครับ
Comments