ว่ากันด้วยเรื่อง Scaling, Scale Up — Scale Out
สวัสดีมิตรรักนักอ่านทุกท่านครับ วันก่อนได้มีโอกาสเห็นปรากฎการณ์กู้ระบบ ที่ดังระดับนึงในไทย “เราไม่ทิ้งกันดอทคอม” นั่นเอง มีผู้ใช้เข้ามาสมัครอย่างล้นหลามจนถึงขั้น Server เดี้ยงกันเลย ต้องขอชื่นชมคนทำงานมาก ๆ ครับ เท่าที่อ่านมาคือ มีเวลาแค่ สัปดาห์เดียวในการทำ (ถ้าเป็นผม แค่เซทระบบ Monitoring ก็ล่อไปอาทิตย์กว่าแล้ว ฮ่า ๆ) ตอนที่ระบบล่มไป ก็แปปเดียวแล้วนำกลับมาได้ (ตรงนี้จะไม่พูดถึงว่ามันเกิดจากอะไรนะครับ เนื่องจากไม่รู้จริง ไม่ใช่คนทำ) แต่ว่าก็เป็น Talk of the town กันในเรื่องของการ Scale ระบบ ให้รองรับคนปริมาณมหาศาลในเวลาพร้อม ๆ กันนั้นต้องทำอย่างไร โดยที่จริงแล้วมันก็มีกันหลายปัจจัยมาก ในการทำระบบให้รองรับขนาดนั้น แต่… วันนี้ผมจะมาพูดถึงการ Scaling แล้วก็ Scale Up กับ Scale Out มันคืออะไร
Scaling
เรามารู้จัก Scaling กันก่อน การทำ Scaling หรือ ที่เรามักได้ยินคำว่า Scale นั่นมันคืออะไร Scaling เป็นการขยายโครงสร้างพื้นฐาน (Infrastructure) ทั้ง Compute, Stograge หรือ Network ให้ใหญ่ขึ้น เพื่อให้รองรับผู้คนที่เข้ามาใช้งานได้มากขึ้นนั่นเอง… สมัยก่อนที่เรายังไม่มี Cloud ทีม Infra มักจะมีเครื่องเอาไว้ทั้งเครื่องเผื่อสำรองในการที่ต้องรับ Load เยอะ ๆ จับยัดเข้า Load balance จะได้ Scale ได้ทันท่วงที บ้างที่มีเครื่อง แต่มีไม่พอ หรือ ทำไม่ทัน ก็บึ้มกันไป และ วิธีนี้ก็เป็นวิธีที่สิ้นเปลืองอย่างมากเลยทั้ง Cost การ Maintanance ทั้งเครื่องตกยุค บลา ๆ แล้วเครื่อง Server เครื่องนึงไม่ใช่ถูก ๆ จนกระทั่งมีสิ่งที่เรียกว่า Cloud, Docker, Container, Microservice หลาย ๆ อย่างก็เปลี่ยนไป การ Scale ไม่ใช่เรื่องวุ่นวายอีกต่อไปแล้วแล้วไม่ต้องมานั่ง Set physical แค่เลือกว่าจะขยายเท่าไหร่ ขยายยังไง เท่านั้นเอง ทั้งนี้สามารถเลือกได้ด้วยนะ ว่าอยากจะให้ Auto scale เมื่อปริมาณ User วิ่งเข้ามาเท่าไหร่ โดยในการ Scale นั้นก็แบ่งออกเป็น 2 อย่างหลัก ๆ คือ Scale Up และ Scale Out…
Scale แล้วไม่ได้หมายความว่าระบบจะไม่ล่มนะครับ มันยังมีปัจจัยอื่น ๆ อีกมากมาย ยกตัวอย่างง่าย ๆ เช่น เครื่องเราตั้ง Auto Scale เอาไว้จาก 10 เป็น 15-20 เครื่องเลย ตามที่ Set cateria เอาไว้ แต่สุดท้ายมาคอขวดกันที่ Database ซึ่งต้องรอการ Insert คล้าย ๆ น้ำกำลังรอการระบาย อะไรแบบนี้ การ Scale ไม่ถูกจุดมันก็ไม่ได้ช่วยนะครับ
Scale Up
Scale Up เป็นการเพิ่มขนาดของเครื่อง Server โดยที่ยังใช้เครื่องเดิมอยู่ เช่น จากเดิมเครื่องนี้เรา Set ram เอาไว้ที่ 1gb ซึ่งตรง Ram 1gb มันไม่พอ ทำให้เกิดคอขวด (Bottleneck) เปลี่ยนให้มันขึ้นมาเป็น 4gb โดยที่ไม่มีการเปลี่ยนไปใช้เครื่องใหม่ หรือ เพิ่มเครื่องใหม่แต่อย่างใด เอาง่าย ๆ ถ้าเป็น Physical ก็คือ ไปซื้อ Ram มาเพิ่มนั่นเอง ถ้าเป็น Cloud อย่าง AWS ก็คือ Up spec จาก t2.micro
เป็น t2.large
อะไรแบบนี้เป็นต้น
ข้อดีของการ Scale up ก็คือไม่ต้องเพิ่มเครื่องใหม่ แค่ Upgrade ของเดิมให้รองรับการใช้งานให้มากขึ้นนั่นเอง ไม่ต้องเสียค่า License ค่า Network เพิ่ม
ข้อเสียคือ มันอาจจะไม่ใช่ Long term solution เมื่อ Upgrade ไปซักพักอาจจะเต็ม หรือ ถ้าเรามั่นใจจัดแล้วอาศัยแค่ Scale Up แต่เกิดข้อผิดผลาดบางประการทำให้เครื่องดับ อาจจะซวยได้ ทางที่ดียังไงก็ควรมี Server run คู่กันไปอย่างน้อยที่สุดก็ สองตัวบน Production
Scale Out
Scale out เป็นการขยายโครงสร้างของเดิมที่มี เพื่อการทำงานแบบขนาน หรือ ควบคู่ไปนั่นเอง เอาให้ง่ายก็คือ Duplicate service นั่นอะ มาอีกเครื่องนึง ปัจจุบันมันจะมีสิ่งที่เรียกว่า Pods, Nodes, Container และ Cluster ให้คุณต้องไปรู้จักมันอีก ซึ่งมันจะช่วยคุณได้ในการ Spin up application ในการทำ Scale out ได้รวดเร็วยิ่งขึ้น
ข้อดีของการ Scale out ก็คือ การที่ทำให้ระบบรองรับผู้ใช้งานได้มากขึ้น ด้วยสภาพแวดล้อมของเครื่องเดิม ลด Downtime ลงไปได้ด้วย สามารถ Up spec ในจังหวะที่ Scale out ได้อีกด้วย
ข้อเสียคือ โดยมากเพิ่มเครื่องมักเสียตังมากกว่า แค่ Up size เครื่อง รวมถึงค่า License ค่า Network อีกต่างหากที่ต้องเสียเพิ่ม ยิ่งถ้าเกิดไม่ใช่ Cloud คือเสียเงินหนักมากในการซื้อเครื่องเพิ่ม พอถึงเวลาจะลดเครื่อง ก็เสียดายอีก…
Conclusion
Scaling — มันคือการขยายโครงสร้างของระบบ ทำให้ระบบของเรารองรับปริมาณ User ที่เข้ามาใช้งานให้ได้มากขึ้น โดยการจะเลือกว่าจะ Scale up หรือ Scale out นั้น ก็ขึ้นอยู่กับงานตรงนั้นว่าแท้จริงแล้วมีความต้องการที่จะต้องทำแบบไหนกันแน่ แค่เลือกให้เหมาะกับงาน
อ่านมาถึงตรงนี้ ผมจะบอกว่าทำ Scale up หรือ Scale out แล้วก็อย่าลืม Scale down กันด้วยนะครับ จะได้ไม่ใช้ Resource ให้เปลืองโดยใช่เหตุ อย่างเช่น Service ของเราปกติจะมีคนใช้ราว ๆ 100 tps ในทุกช่วงเวลา แต่จะมีเวลานึง ที่มีคนใช้เยอะกว่านั้น เช่น ทุกวันตอน 9 – 10 โมงเช้า จะมี User วิ่งเข้ามาหาเราตก 1000 tps เราอาจจะ Set scale ระบบรอไว้เลยว่า 9 โมง ถึง 10 โมง จะให้ระบบ Scale ขึ้นไปเท่าไหร่ แบบไหน แล้วหลังจากนั้นค่อย Scale down จะได้เป็นการประหยัดพลังงานได้ ประหยัดงบได้ด้วย
จากตัวอย่างข้างบน เป็นการ Set auto scale แบบตั้งเวลา มันยังมีอีกแบบนึงคือการ Set auto scale แบบที่ ถ้าหากมี Throughput มากขึ้นเท่าไหร่ Latancy มากขึ้นเท่าไหร่ CPU หรือ Ram มากขึ้นเท่าไหร่ ให้ทำการ Auto scale ขึ้นเลย อันนี้ก็ต้องพึ่งพาระบบ Monitoring ที่ดีด้วย
Scaling ไม่ใช่เรื่องใหม่ เป็นเรื่องที่เค้าทำกันมานานแล้ว เพียงแต่ในยุคของ Cloud มันทำให้การ Scale เป็นเรื่องที่ง่ายขึ้น และ ประหยัดเวลา ประหยัดเงินลงไปได้มาก การจะทำ Scale ให้มีประสิทธิภาพนั้น ก็ขึ้นอยู่กับหลายปัจจัย แต่สิ่งนึงที่เราควรจะมี ในการทำให้การ Scale มีประสิทธิภาพนั่นก็คือ การทำระบบ Monitoring ที่ดี ถ้าอยากอ่านต่อ ผมเรียนเชิญ อ่านต่อได้ที่ 3 Pillars of Observability นอกจากนี้ยังแนำนำต่อเรื่อง Circuit Breaker ในการตัดปัญหาก่อนจะบานปลายด้วย แล้วก็สุดท้ายเรื่อง Rate Limit
ปล. ช่วงนี้ Covid-19 รุนแรง รักษาเนื้อรักษาตัวกันด้วยนะครับ