Sarayut Romsuk
4 min readJul 9, 2019

มาทำ Server Load balance ให้ Web Server กันเถอะ (LB EP.1)

สวัสดีครับ อันนี้จะเป็น Blog แรกของผมเอง
เลยจะขอเริ่มด้วยหัวข้อง่าย ๆ แม้องค์ความรู้อาจจะเก่าไปซักหน่อย แต่ยังมีประโยชน์ สำหรับระบบในองค์กรมาก ๆ นั่นก็คือ การทำ Load balance นั่นเอง

แต่ก่อนจะไปเริ่มทำกัน ผมจะขออธิบายก่อน ว่า Load balance คืออะไร เผื่อเป็นพื้นฐานให้กับหลาย ๆ ท่าน ที่ยังไม่เคยทำมาก่อนนะครับ

เมื่อก่อนนี้ หากเรามี Server มากกว่า 1 ตัวที่ให้บริการ Services เดียวกันเนี่ย มันก็จะมีความยุ่งยากในการเข้าใช้งานใช่ไหมล่ะ? ยกตัวอย่างง่าย ๆ จากเว็บลงทะเบียนสมัยมหาลัยของผมเลย 😂 เค้ามี Web servers สำหรับลงทะเบียนถึง 3 เครื่องด้วยกัน แต่ดันไม่มี Load balance ไว้ใช้งานซะงั้น เวลานักศึกษาจะลงทะเบียนจึงต้องเข้า Servers แต่ละเครื่องตรง ๆ ตัวอย่างเช่น
www.reg1.abc.ac.th , www.reg2.abc.ac.th , www.regX.abc.ac.th

แล้วเหล่านักศึกษาตาดำ ๆ แบบพวกเราก็ต้องเปิด Browser หลาย ๆ แท็บ เพื่อจะ Access Web servers เหล่านี้ด้วยตัวเอง ทุกคนคงพอจะเห็นภาพความวุ่นวายแล้วสินะ

การ Access Servers กรณีไม่มี LB

Load balance จึงเกิดมาเพื่อจัดการปัญหาตรงนี้ให้ คือการแบ่งโหลดการทำงาน ของ Servers(มากกว่า1ตัว) ที่ให้บริการ Services เดียวกัน ด้วยการเรียกใช้งานผ่าน IP VIP(Virtual ip) ตรงกลาง แล้วเจ้าอุปกรณ์ Load balance เนี่ยจะมี Method ในการ
กระจายโหลดไปยัง Server ที่อยู่ใน Pool Group ที่เราสร้างไว้นั่นเอง

มี Load balance มาช่วย

นอกจากนี้ เจ้า Load balance ยังช่วย Provide เรื่องของ High Availability สำหรับ Servers ได้ด้วย เพราะมันมีความสามารถในการทำ Health check ด้วยนะ คือมันสามารถ Monitor ได้ ว่า Servers ที่เรามี ยังพร้อมให้บริการหรือเปล่า ในกรณีที่บาง Servers Down ไปแล้ว ฝั่ง Users ก็ยังเข้าใช้งานผ่าน VIP ได้ตามปกติ ซึ่งแอดมินก็จะมีเวลาไปแก้ไข Servers ที่ปัญหาอยู่ได้ไงล่ะ 😉

Servers Down ไปบางตัว แต่ที่เหลือยังให้บริการได้

จริง ๆ นอกจากเรื่อง High availability ของฝั่ง Servers แล้ว ตัว Load balance ยังมีความสามารถอื่น ๆ ด้วยทั้ง Acceleration (Caching, TCP reuse, Compression) รวมถึง Security (WAF, DDOS) แต่จะขอแยกไว้เป็นบทความครั้งถัด ๆ ไปนะครับ เพราะน่าจะยาวมาก ๆ เดี๋ยวบทความหน้าไม่มีอะไรเขียนด้วย 😆
ทุกท่านคงพอเห็น Concept และประโยชน์คง Load Balance แล้วใช่ไหมครับ? งั้น Part ต่อไปเราจะไปเริ่มคอนฟิคกันเลย…

ก่อนที่เราจะเริ่มคอนฟิค เรามาดูกันก่อนว่าเราต้องใช้ Equipment อะไรในการทำ Test ครั้งนี้บ้าง

Equipment list- Client- A10 OVA for Load balance 
(https://glm.a10networks.com/downloads)
- Badstore ISO for Web servers * 2
(https://www.vulnhub.com/entry/badstore-123,41/)

Diagram

Network Diagram

ซึ่งที่ผมเลือก A10 มาทำก็เพราะ บ. ของผมเป็น Partner กับ A10 นั่นเอง ฮ่าๆๆ แต่จริง ๆ แล้ว ตัว A10 OVA ปล่อยให้คนทั่วไปได้ Download มาใช้งานได้เลยตาม Link ที่แนบไว้ด้านบน แม้จะไม่มี License ก็ยังสามารถใช้งานได้ครบทุก Feature แต่จะโดนจำกัด Throughput ไว้ที่ 5 Mbps

หลังจากเราลง Web server เสร็จแล้วก็มาคอนฟิค IP ให้มัน รวมถึงปรับแต่งหน้าเว็บ ให้เห็นง่าย ๆ ว่าเรากำลังเข้าใช้งาน Server เครื่องไหนอยู่

- Set IP for Web serverIfconfig eth0 up 10.2.7.X netmask 255.255.255.0 broadcast 10.2.7.255Route add default gw 10.2.7.1- Edit index.html for specific servervi /usr/local/apache/htdocs/index.html
Edit index.html ซะหน่อย จะได้เห็นง่ายๆ ว่ากำลังเข้า Server ตัวไหนอยู่

พอเราเตรียม Server เสร็จแล้ว เราก็มาคอนฟิคตัว Load balance กัน(ซักที!)
โดยในบทความนี้จะลงคอนฟิคเป็น CLI เพื่อที่จะให้ผู้อ่าน Copy ไปใช้งานได้ด้วย ซึ่งจริง ๆ แล้ว ตัว A10 มีหน้า GUI ให้ใช้คอนฟิคได้นะ ง่ายกว่าด้วย แต่ถ้าทำเสต็ปเป็น GUI ผมขี้เกียจทำรูปนั่นเอง เพราะมันจะเยอะมากเลย ฮ่าๆๆๆ

ซึ่งตัว A10 เวลาจะคอนฟิคผ่าน CLI
ให้ SSH เข้าไป (default mgt ip: 172.31.31.31 , user: admin / pass: a10)
เข้า Enable โดยการพิมพ์ “en”

vThunder(NOLICENSE)>

และเข้าสู่ Configure mode ด้วยคำสั่ง “configure”

vThunder(NOLICENSE)#

ขั้นตอนที่ 1 Configure Interface & Network

vThunder(NOLICENSE)# 
!
interface ethernet 1
enable
ip address 10.2.7.80 255.255.255.0
!
interface ethernet 2
enable
ip address 10.2.6.80 255.255.255.0
!
ip route 0.0.0.0 /0 10.2.6.1

ขั้นตอนที่ 2 Configure Real servers
เพื่อเป็นการระบุข้อมูลว่าเรามี Server กี่เครื่อง แต่ละเครื่องให้บริการ Services ที่ Port อะไรบ้าง โดยในบทความนี้เราจะใช้ Servers 2 เครื่อง ซึ่งให้บริการ Web port 80 ที่เราได้คอนฟิคมันก่อนหน้านี้

vThunder(NOLICENSE)#
!
slb server Web-V27-1 10.2.7.86
port 80 tcp
!
slb server Web-V27-2 10.2.7.87
port 80 tcp

ขั้นตอนที่ 3 Configure Services group (Pool)
พอเราได้ Server แล้ว เราก็จับ Services เดียวกัน มาอยู่ในกรุ๊บเดียวกัน เพื่อที่จะให้ A10 Load balance มาที่ member เหล่านี้

vThunder(NOLICENSE)#
!
slb service-group Web-V27-80 tcp
member Web-V27-1 80
member Web-V27-2 80

ขั้นตอนที่ 4 Configure Source NAT pool
ตรงนี้เราคอนฟิคไว้ให้ตัว Load balance ทำการแปลง Source IP client ให้ไปอยู่วงเดียวกับ Server เพื่อให้ A10 เป็นคน Control connection ระหว่าง Client กับ Server นั่นเอง
วิธีการคือเราจะหา IP ว่าง ๆ ซัก 1 IP ที่อยู่ในวงเดียวกับ Server มาใช้ทำ Nat
( ถ้าไม่ต้องการทำ NAT ก็มี Solution เช่นกัน แต่จะมีความแตกต่างระหว่าง 2 ท่านี้ อาจจะเขียนเปรียบเทียบครั้งต่อ ๆ ไปครับ)

vThunder(NOLICENSE)#
!
ip nat pool src-nat 10.2.7.84 10.2.7.84 netmask /24
!
ip nat pool-group grp-src-nat
member src-nat

ขั้นตอนที่ 5 Configure Virtual Server
ขั้นตอนสุดท้ายแล้ว! คือการคอนฟิค VIP ที่ Client จะมาเรียกนั่นเอง
คร่าว ๆ คือเราก็ระบุ Virtual IP และ Port ที่เราต้องการจะให้บริการ แล้วนำ Services group ในขั้นตอนที่ 3 มาผูกไว้ใน Virtual server นี้
หลังจากนั้นก็นำ Source NAT template ในขั้นตอนที่ 4 มาใช้งานใน Virtual server นี้ด้วย

vThunder(NOLICENSE)#
!
slb virtual-server Web-V27 10.2.7.85
port 80 http
source-nat pool grp-src-nat
service-group Web-V27-80

ถ้าเรา Config ผ่าน GUI ก็จะหน้าตาประมาณนี้ (Config ผ่าน CLI มาแล้ว มันก็มาขึ้นบน GUI ให้เหมือนกันจ้า)

หน้าตา Configure ผ่าน GUI

หลังจากเราคอนฟิคทั้งหมดเรียบร้อย ก็มา Verify ดู ว่า Virtual Server ของเรา อัพหรือยัง
โดยวิธี Verify สามารถทำได้ทั้งหน้า GUI ( Dashboard -> Services map )
หรือผ่าน CLI ด้วยคอมมานด์ “show slb virtual-server”

Virtual Server up already!

พอเราคอนฟิคเสร็จทั้งหมดแล้ว ก็มาลอง Test เรียกหน้าเว็บ ผ่าน VIP กัน
จะเห็นได้ว่า Servers มีการสลับไปมา เพื่อมาให้บริการ Client (Default method = Round robin)

Client using Web via VIP

ไหนลองมาดู Logs กันซักนิด ด้วยคำสั่ง “show session”
จะเห็นว่าเมื่อ Client เรียกมาที่ VIP แล้ว
ใน Column reverse source จะมีการเปลี่ยน IP real Servers สลับมาให้บริการ Client โดย IP Client จะถูก NAT มาด้วย IP ที่เราคอนฟิคไว้นั่นเอง

Logs Session

สำหรับบทความนี้ ก็คงพอทำให้ผู้อ่านได้เข้าใจ Concept และวิธีการ Config Load balance เบื้องต้นได้นะครับ
ในครั้งหน้าเราจะมาต่อยอดการคอนฟิค Acceleration(Caching, TCP optimize) รวมถึง Security (WAF, DDOS)
ซึ่งเป็น add on feature บน Load balance กันนะครับ
ถ้าใครสงสัยหรือมีคำถามเพิ่มเติม สามารถอีเมลมาหาผมได้เลยนะ

แล้วเจอกันใหม่ใน Blog หน้า ขอบคุณครับ 🤞

Te’ Sarayut
System Engineer