Load Balance Service เป็นบริการที่มีใน Rancher คุณสามารถสร้าง Web Application พร้อม Load Balance ได้ง่าย โดยไม่ต้องตั้งค่าให้ยุ่งยาก ไม่ต้องใช้ plugin เสริม ไม่ต้องติดตั้งอะไรเพิ่มเติม Load Balance Service มีให้ใช้งานในส่วน Stack มาลองสร้าง Load Balance ให้ Web Application เล็กๆ กันครับ อันดับแรกให้คุณเพิ่ม Docker Host เข้ามาใน Rancher ดังนี้

จากนั้นสร้าง App Stack ขึ้นมาใหม่

Continue reading

Nginx คือแพ็คเกจที่เใช้ติดตั้งเพื่อที่จำทำให้เครื่อง Server สามารถทำงานเป็นเว็บเซิร์ฟเวอร์ที่กำลังได้รับความนิยมอยู่ในขณะนี้เป็นคู๋แข่งของ Apache ที่หลายคนรู้จักดี ความสามารถของ Nginx สามารถอ่านเพิ่มเติมได้ที่ http://nginx.org/en/ ใน How-To ครั้งนี้จะมาทำการเปิดใช้งานความสามรถหนึ่งของ Nginx กันนั่นก็คือ Nginx Load Balancing
Nginx Load Balancing เป็นวิธีการกระจายภาระการทำงานของเครื่อง Server ที่มีอยู่หลายเครื่องให้ช่วยกันรับภาระการทำงานใน How-To ครั้งนี้จะเป็นการทำงานแบบ Round Robin ซึ่งกำหนดให้มีเครื่อง Server 3 เครื่อง ดังนี้

  • backend1.example.com
  • backend2.example.com
  • backend3.example.com

ติดตั้ง Nginx ด้วยคำสั่ง

sudo apt-get install nginx

ทำการแก้ไขไฟล์ default ใน /etc/nginx/sites-available เพื่อเพิ่มความสามารถ Upstream Module (Load Balancing) ให้กับ Nginx ด้วยคำสั่ง

sudo nano /etc/nginx/sites-available/default


Continue reading

เมื่อคราวที่แล้วเขียนเรื่อง Load Balance ให้ Apache Web Serverv ง่ายๆ โดยใช้ DNS Round Robin ซึ่งสามารถทำ Load Balance ได้ง่ายๆ แต่มีปัญหาที่มีโอกาสเกิดขึ้นได้ คือ เมื่อ Web Server ตัวใดตัวหนึ่งมีปัญหา ผู้เข้าเว็บที่โชคดีได้ IP Address เครื่องนั้นไปก็จะไม่สามารถเข้าถึงเว็บได้ DNS Round Robin ช่วยเรื่อง Load Balance ได้จริง แต่จัดการเรื่อง fail over ไม่ได้ :) ครั้งนี้จะมาแนะนำการทำ Load Balance ง่ายๆ อีกเช่นเคย โดยใช้ Pound

Pound ทำหน้าที่

  • reverse proxy : ส่ง request จากเว็บเบราเซอร์ไปยัง back-end server ที่มีอยู่
  • load balancer : ส่ง request จากเว็บเบราเซอร์ไปยัง back-end server ที่มีอยู่และจัดการข้อมูล session ด้วย
  • SSL Wrapper : ถอดรหัส HTTPS จากเว็บเบราเซอร์และส่งไปยัง back-end server ที่มีอยู่
  • กลั่นกรอง HTTP/HTTPS : ตรวจสอบ request เพื่อความถูกต้องและรับ reuest ที่มีรูปแบบถูกต้องเท่านั้น
  • fail over-server : หากมี back-end server ตาย Pound จะจำเครื่อง server นั้นและหยุดส่ง request จนกว่าจะมีการแก้ไข
  • request redirector : request จาก Pound สามารถกระจายไปยัง back-end server ทั้งหมดได้ขึ้นอยู่กับ request URL

    Pound เป็นโปรแกรมเล็กๆ ง่ายในการจัดการ คุณสามารถสั่งให้ Pound ทำงานแบบ chroot jail ได้โดยการกำหนด uid/gid ได้ :) ก่อนจะติดตั้งและใช้งาน Pound มาทำความเข้าใจโครงสร้างการเชื่อมต่อกันก่อน

จากภาพข้างต้นเราใช้ Pound เป็น Balancer เพื่อกระจาย request จาก Client ไปยังเครื่องเซิร์ฟเวอร์ที่ต่อกับ Pound อยู่ มาติดตั้ง Pound กันเลย สำหรับท่านที่ใช้ Debian, Ubuntu ติดตั้งดังนี้

sudo apt-get install pound

จากนั้นแก้ไข config ที่ /etc/default/pound ดูตรงบรรทัด startup=0 เปลี่ยนเป็น startup=1 จากนั้นมาแก้ไข /etc/pound/pound.cfg ดูในส่วน ListenHTTP ดังนี้

ListenHTTP
Address 10.11.12.10
Port 80
Service
BackEnd
Address 10.11.12.11
Port 80
End
BackEnd
Address 10.11.12.12
Port 80
End
BackEnd
Address 10.11.12.13
Port 80
End
End
End

หากต้องการกำหนด Priority เพื่อกระจายโหลดไปยังเครื่องใดเครื่องหนึ่งมากกว่าเครื่องอื่นๆ ในกรณีที่มีเครื่องใดเครื่องหนึ่งมี Resource มากกว่าเครื่องอื่นๆ และสามารถรับโหลดได้มากกว่าเครื่องอื่นๆ เราสามารถกำหนด Priority เพื่อกระจายโหลดไปยังเครื่องนั้นๆ ได้ ยกตัวอย่าง เช่น เครื่อง Web Server 1 เพียงเพิ่ม Config เข้าไปอีก 1 บรรทัดเพื่อกำหนด Priority ดังนี้

ListenHTTP
Address 10.11.12.10
Port 80
Service
BackEnd
Address 10.11.12.11
Port 80
Priority 7
End
BackEnd
Address 10.11.12.12
Port 80
End
BackEnd
Address 10.11.12.13
Port 80
End
End
End

เพียงเท่านี้คุณก็สามารถจัดการ Load Balance ให้กับ Web Server ของคุณได้แล้วครับ ;)

บังเอิญมีปัญหาเรื่องเซิร์ฟเวอร์ตายบ่อยๆ เพราะคนเข้าเว็บเยอะจนล้น แก้ปัญหาโดยการบีบโดนการใช้ mod_cband ไม่ได้ผลเพราะจะไม่มีใครเข้าเว็บได้เลย ซึ่งอาการหนักพอสมควร กรณีนี้แก้ไขได้โดยใช้ load balancing แต่ขึ้นอยู่ว่าจะ load balance ที่ไหน มาทำความเข้าใจปัญหากันก่อนครับ ตอนนี้ Web Server มีตัวเดียว เครื่องเซิร์ฟเวอร์รองรับ load ไม่ได้มากนัก CPU/RAM เต็มบ่อยๆ จนนิ่ง ปรับแก้ไข Config แล้วก็ตายเช่นเดิม ดังนั้นแก้ไขโดนการเพิ่มเซิร์ฟเวอร์เข้าไปอีก ในกรณีนี้เลือกวิธี load balancing ที่ง่ายสุดคือใช้ DNS load balancing คือ เป็นเว็บเดียวกันแต่มีหลายเครื่องและบอก DNS ว่ามีเซิร์ฟเวอร์หลายเครื่อง หมุน IP Address เอา ลองดูตัวอย่าง Google กัน

# host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 64.233.181.105
www.l.google.com has address 64.233.181.106
www.l.google.com has address 64.233.181.147
www.l.google.com has address 64.233.181.99
www.l.google.com has address 64.233.181.103
www.l.google.com has address 64.233.181.104

จากข้อมูลข้างต้น www.google.com มี aliase อยู่ 6 ตัว ถ้าคุณเข้า www.google.com มันก็จะหมุน IP Address ให้เราใหม่ให้ลองใช้คำสั่ง host www.google.com อีกครั้งคุณจะได้ข้อมูลดังนี้

#host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 64.233.181.106
www.l.google.com has address 64.233.181.105
www.l.google.com has address 64.233.181.104
www.l.google.com has address 64.233.181.103
www.l.google.com has address 64.233.181.99
www.l.google.com has address 64.233.181.147

# host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 64.233.181.103
www.l.google.com has address 64.233.181.99
www.l.google.com has address 64.233.181.147
www.l.google.com has address 64.233.181.106
www.l.google.com has address 64.233.181.105
www.l.google.com has address 64.233.181.104

จะเห็นว่า IP Address จะหมุนเป็น Round Robin ซึ่งเครื่อง client ก็จะเลือก IP Address ที่อยู่อันดับแรกเสมอ นั่นคือเวลาเราเข้าเว็บ www.google.com ในแต่ละครั้งเรียกเว็บเซิร์ฟเวอร์คนละตัวกันแต่หน้าเว็บเหมือนกัน ซึ่งเป็นการกระจาย load ให้เว็บเซิร์ฟเวอร์อย่างง่ายๆ ไม่ต้องคิดมาก :) วิธีการตั้งค่า DNS Load balancing มีดังนี้

www 60 IN 10.1.1.111
www 60 IN 10.1.1.112
www 60 IN 10.1.1.113
www 60 IN 10.1.1.114
www 60 IN 10.1.1.115
www 60 IN 10.1.1.116

หรือตั้งค่าแบบนี้ก็ได้ผลเช่นเดียวกัน

www 60 IN 10.1.1.111
60 IN 10.1.1.112
60 IN 10.1.1.113
60 IN 10.1.1.114
60 IN 10.1.1.115
60 IN 10.1.1.116

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