การแปลบทความจัดทำขึ้นในวันเริ่มต้นหลักสูตร
การปรับสมดุลโหลดเป็นโซลูชันทั่วไปสำหรับการปรับขนาดเว็บแอปพลิเคชันในแนวนอนข้ามโฮสต์หลายตัว ในขณะเดียวกันก็ให้ผู้ใช้เข้าถึงบริการได้จากจุดเดียว
HAProxy มุ่งมั่นที่จะเพิ่มประสิทธิภาพการใช้ทรัพยากร เพิ่มปริมาณงาน ลดเวลาตอบสนอง และหลีกเลี่ยงการโอเวอร์โหลดทรัพยากรแต่ละรายการ สามารถติดตั้งได้บน Linux หลากหลายรุ่น เช่น CentOS 8 ซึ่งเราจะเน้นในคู่มือนี้ รวมไปถึงระบบต่างๆ
HAProxy เหมาะอย่างยิ่งสำหรับเว็บไซต์ที่มีปริมาณการเข้าชมสูงมาก และดังนั้นจึงมักใช้เพื่อปรับปรุงความน่าเชื่อถือและประสิทธิภาพของการกำหนดค่าบริการเว็บแบบหลายเซิร์ฟเวอร์ คู่มือนี้สรุปขั้นตอนในการตั้งค่า HAProxy เป็นตัวโหลดบาลานเซอร์บนโฮสต์คลาวด์ CentOS 8 ซึ่งจะกำหนดเส้นทางการรับส่งข้อมูลไปยังเว็บเซิร์ฟเวอร์ของคุณ
ตามข้อกำหนดเบื้องต้นเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด คุณควรมีเว็บเซิร์ฟเวอร์อย่างน้อยสองตัวและเซิร์ฟเวอร์ปรับสมดุลโหลด เว็บเซิร์ฟเวอร์ต้องใช้งานบริการเว็บพื้นฐานเป็นอย่างน้อย เช่น nginx หรือ httpd เพื่อทดสอบการปรับสมดุลโหลดระหว่างเซิร์ฟเวอร์เหล่านั้น
การติดตั้ง HAProxy บน CentOS 8
เนื่องจาก HAProxy เป็นแอปพลิเคชันโอเพ่นซอร์สที่มีการพัฒนาอย่างรวดเร็ว การเผยแพร่ที่มีให้คุณในคลัง CentOS มาตรฐานจึงอาจไม่ใช่เวอร์ชันล่าสุด หากต้องการค้นหาเวอร์ชันปัจจุบัน ให้รันคำสั่งต่อไปนี้:
sudo yum info haproxy
HAProxy มีเวอร์ชันเสถียรให้เลือกสามเวอร์ชันเสมอ: สองเวอร์ชันล่าสุดที่ได้รับการสนับสนุน และเวอร์ชันที่สามซึ่งเป็นเวอร์ชันเก่าที่ยังคงได้รับการอัปเดตที่สำคัญ คุณสามารถตรวจสอบเวอร์ชันเสถียรล่าสุดที่แสดงอยู่ในเว็บไซต์ HAProxy ได้ตลอดเวลา แล้วตัดสินใจว่าคุณต้องการใช้งานเวอร์ชันใด
ในคู่มือนี้ เราจะติดตั้งเวอร์ชันเสถียรล่าสุด 2.0 ซึ่งยังไม่มีให้ใช้ในพื้นที่เก็บข้อมูลมาตรฐานในขณะที่เขียนคู่มือ คุณจะต้องติดตั้งจากแหล่งดั้งเดิม แต่ก่อนอื่น ตรวจสอบว่าคุณตรงตามเงื่อนไขที่จำเป็นในการดาวน์โหลดและคอมไพล์โปรแกรมหรือไม่
sudo yum install gcc pcre-devel tar make -y
ดาวน์โหลดซอร์สโค้ดโดยใช้คำสั่งด้านล่าง คุณสามารถตรวจสอบได้ว่ามีเวอร์ชันใหม่กว่านี้หรือไม่
wget http://www.haproxy.org/download/2.0/src/haproxy-2.0.7.tar.gz -O ~/haproxy.tar.gz
เมื่อการดาวน์โหลดเสร็จสิ้น ให้แตกไฟล์โดยใช้คำสั่งด้านล่าง:
tar xzvf ~/haproxy.tar.gz -C ~/
ไปที่ไดเร็กทอรีต้นทางที่คลายการแพ็ก:
cd ~/haproxy-2.0.7
จากนั้นรวบรวมโปรแกรมสำหรับระบบของคุณ:
make TARGET=linux-glibc
และสุดท้าย ติดตั้ง HAProxy เอง:
sudo make install
ตอนนี้ติดตั้ง HAProxy แล้ว แต่ต้องมีการปรับแต่งเพิ่มเติมเพื่อให้สามารถใช้งานได้ มาตั้งค่าซอฟต์แวร์และบริการด้านล่างนี้ต่อไป
การตั้งค่า HAProxy สำหรับเซิร์ฟเวอร์ของคุณ
ตอนนี้เพิ่มไดเร็กทอรีและไฟล์สถิติต่อไปนี้สำหรับรายการ HAProxy:
sudo mkdir -p /etc/haproxy
sudo mkdir -p /var/lib/haproxy
sudo touch /var/lib/haproxy/stats
สร้างลิงก์สัญลักษณ์สำหรับไบนารีเพื่อให้คุณสามารถรันคำสั่ง HAProxy ในฐานะผู้ใช้ทั่วไปได้:
sudo ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
หากคุณต้องการเพิ่มพร็อกซีให้กับระบบของคุณเป็นเซอร์วิส ให้คัดลอกไฟล์ haproxy.init จากตัวอย่างไปยังไดเร็กทอรี /etc/init.d ของคุณ แก้ไขการอนุญาตไฟล์เพื่อให้สคริปต์ทำงาน จากนั้นรีสตาร์ท systemd daemon:
sudo cp ~/haproxy-2.0.7/examples/haproxy.init /etc/init.d/haproxy
sudo chmod 755 /etc/init.d/haproxy
sudo systemctl daemon-reload
คุณต้องอนุญาตให้บริการรีสตาร์ทโดยอัตโนมัติเมื่อระบบเริ่มทำงาน:
sudo chkconfig haproxy on
เพื่อความสะดวก ขอแนะนำให้เพิ่มผู้ใช้ใหม่เพื่อรัน HAProxy:
sudo useradd -r haproxy
หลังจากนี้ คุณสามารถตรวจสอบหมายเลขเวอร์ชันที่ติดตั้งได้อีกครั้งโดยใช้คำสั่งต่อไปนี้:
haproxy -v
HA-Proxy version 2.0.7 2019/09/27 - https://haproxy.org/
ในกรณีของเรา เวอร์ชันควรเป็น 2.0.7 ดังที่แสดงในตัวอย่างเอาต์พุตด้านบน
สุดท้าย ไฟร์วอลล์เริ่มต้นใน CentOS 8 ค่อนข้างจำกัดสำหรับโปรเจ็กต์นี้ ใช้คำสั่งต่อไปนี้เพื่ออนุญาตบริการที่จำเป็นและรีเซ็ตไฟร์วอลล์:
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-port=8181/tcp
sudo firewall-cmd --reload
การตั้งค่าโหลดบาลานเซอร์
การตั้งค่า HAProxy เป็นกระบวนการที่ค่อนข้างง่าย โดยพื้นฐานแล้ว สิ่งที่คุณต้องทำคือบอก HAProxy ว่าควรรับฟังการเชื่อมต่อใดบ้าง และควรถ่ายทอดการเชื่อมต่อที่ใด
ซึ่งทำได้โดยการสร้างไฟล์คอนฟิกูเรชัน /etc/haproxy/haproxy.cfg พร้อมการกำหนดการตั้งค่า คุณสามารถอ่านเกี่ยวกับตัวเลือกการกำหนดค่า HAProxy ได้
โหลดบาลานซ์ที่เลเยอร์การขนส่ง (เลเยอร์ 4)
เริ่มจากการตั้งค่าพื้นฐานกันก่อน สร้างไฟล์ปรับแต่งใหม่ เช่น การใช้ vi ด้วยคำสั่งด้านล่าง:
sudo vi /etc/haproxy/haproxy.cfg
เพิ่มส่วนต่อไปนี้ลงในไฟล์ แทนที่ ชื่อเซิร์ฟเวอร์ สิ่งที่ควรเรียกเซิร์ฟเวอร์ของคุณในหน้าสถิติและ ส่วนตัว_ip — ที่อยู่ IP ส่วนตัวของเซิร์ฟเวอร์ที่คุณต้องการกำหนดเส้นทางการรับส่งข้อมูลเว็บ คุณสามารถตรวจสอบที่อยู่ IP ส่วนตัวได้
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http_front
bind *:80
stats uri /haproxy?stats
default_backend http_back
backend http_back
balance roundrobin
server server_name1 private_ip1:80 check
server server_name2 private_ip2:80 check
สิ่งนี้จะกำหนดโหลดบาลานเซอร์ของเลเยอร์การขนส่ง (เลเยอร์ 4) ที่ชื่อภายนอก http_front กำลังฟังบนพอร์ต 80 ซึ่งจะส่งต่อการรับส่งข้อมูลไปยังแบ็กเอนด์เริ่มต้นที่ชื่อ http_back สถิติเพิ่มเติม /haproxy?stats เชื่อมต่อหน้าสถิติกับที่อยู่ที่ระบุ
อัลกอริธึมการปรับสมดุลโหลดต่างๆ
การระบุเซิร์ฟเวอร์ในส่วนแบ็กเอนด์ทำให้ HAProxy สามารถใช้เซิร์ฟเวอร์เหล่านี้สำหรับการทำโหลดบาลานซ์ตามอัลกอริธึมแบบ Round-Robin เมื่อเป็นไปได้
อัลกอริธึมการปรับสมดุลใช้เพื่อกำหนดว่าเซิร์ฟเวอร์ใดในแบ็กเอนด์ที่แต่ละการเชื่อมต่อจะถูกส่งไป นี่คือตัวเลือกที่มีประโยชน์บางส่วน:
- ราวด์โรบิน: แต่ละเซิร์ฟเวอร์จะถูกใช้งานตามลำดับตามน้ำหนักของมัน นี่เป็นอัลกอริธึมที่ราบรื่นและยุติธรรมที่สุดเมื่อเวลาการประมวลผลของเซิร์ฟเวอร์ยังคงกระจายเท่าๆ กัน อัลกอริธึมนี้เป็นแบบไดนามิก ช่วยให้สามารถปรับน้ำหนักของเซิร์ฟเวอร์ได้ทันที
- อย่างน้อยที่สุด: เลือกเซิร์ฟเวอร์ที่มีการเชื่อมต่อน้อยที่สุด Round Robin จะดำเนินการระหว่างเซิร์ฟเวอร์ที่มีโหลดเท่ากัน ขอแนะนำให้ใช้อัลกอริทึมนี้สำหรับเซสชันยาว เช่น LDAP, SQL, TSE ฯลฯ แต่ไม่เหมาะมากสำหรับเซสชันสั้นๆ เช่น HTTP
- ครั้งแรก: เซิร์ฟเวอร์เครื่องแรกที่มีช่องการเชื่อมต่อที่ใช้ได้จะได้รับการเชื่อมต่อ เซิร์ฟเวอร์จะถูกเลือกจาก ID ตัวเลขต่ำสุดไปจนถึงสูงสุด ซึ่งเป็นค่าเริ่มต้นที่ตำแหน่งของเซิร์ฟเวอร์ในฟาร์ม เมื่อเซิร์ฟเวอร์ถึง maxconn เซิร์ฟเวอร์ถัดไปจะถูกนำมาใช้
- ที่มา: ที่อยู่ IP ต้นทางจะถูกแฮชและหารด้วยน้ำหนักรวมของเซิร์ฟเวอร์ที่ทำงานอยู่เพื่อกำหนดว่าเซิร์ฟเวอร์ใดจะได้รับคำขอ ด้วยวิธีนี้ ที่อยู่ IP ไคลเอนต์เดียวกันจะไปที่เซิร์ฟเวอร์เดียวกันเสมอ ในขณะที่เซิร์ฟเวอร์ยังคงเหมือนเดิม
การตั้งค่าสมดุลโหลดในระดับแอปพลิเคชัน (เลเยอร์ 7)
อีกทางเลือกหนึ่งที่ใช้ได้คือการกำหนดค่าโหลดบาลานเซอร์ให้ทำงานที่เลเยอร์แอปพลิเคชัน (เลเยอร์ 7) ซึ่งมีประโยชน์เมื่อบางส่วนของแอปพลิเคชันเว็บของคุณอยู่บนโฮสต์ที่แตกต่างกัน ซึ่งสามารถทำได้โดยการควบคุมปริมาณการส่งข้อมูลการเชื่อมต่อ เช่น โดย URL
เปิดไฟล์คอนฟิกูเรชัน HAProxy โดยใช้โปรแกรมแก้ไขข้อความ:
sudo vi /etc/haproxy/haproxy.cfg
จากนั้นกำหนดค่าส่วนหน้าและส่วนหลังตามตัวอย่างด้านล่าง:
frontend http_front
bind *:80
stats uri /haproxy?stats
acl url_blog path_beg /blog
use_backend blog_back if url_blog
default_backend http_back
backend http_back
balance roundrobin
server server_name1 private_ip1:80 check
server server_name2 private_ip2:80 check
backend blog_back
server server_name3 private_ip3:80 check
ส่วนหน้าจะประกาศกฎ ACL ที่เรียกว่า url_blog ซึ่งใช้กับการเชื่อมต่อทั้งหมดที่มีเส้นทางขึ้นต้นด้วย /blog Use_backend ระบุว่าการเชื่อมต่อที่ตรงกับเงื่อนไข url_blog ควรให้บริการโดยแบ็กเอนด์ชื่อ blog_back และคำขออื่นๆ ทั้งหมดได้รับการจัดการโดยแบ็กเอนด์เริ่มต้น
ที่ฝั่งแบ็คเอนด์ การกำหนดค่าจะตั้งค่าเซิร์ฟเวอร์สองกลุ่ม: http_back เหมือนเมื่อก่อน และกลุ่มใหม่ที่เรียกว่า blog_back ซึ่งจัดการการเชื่อมต่อกับ example.com/blog
หลังจากเปลี่ยนการตั้งค่า ให้บันทึกไฟล์และรีสตาร์ท HAProxy โดยใช้คำสั่งต่อไปนี้:
sudo systemctl restart haproxy
หากคุณได้รับคำเตือนหรือข้อความแสดงข้อผิดพลาดระหว่างการเริ่มต้นระบบ ให้ตรวจสอบการกำหนดค่าและตรวจสอบให้แน่ใจว่าคุณได้สร้างไฟล์และโฟลเดอร์ที่จำเป็นทั้งหมดแล้ว จากนั้นลองรีสตาร์ทอีกครั้ง
กำลังทดสอบการตั้งค่า
เมื่อกำหนดค่าและรัน HAProxy แล้ว ให้เปิดที่อยู่ IP สาธารณะของเซิร์ฟเวอร์โหลดบาลานเซอร์ในเบราว์เซอร์ และตรวจสอบว่าคุณเชื่อมต่อกับแบ็กเอนด์อย่างถูกต้องหรือไม่ พารามิเตอร์ stat uri ในการกำหนดค่าจะสร้างหน้าสถิติตามที่อยู่ที่ระบุ
http://load_balancer_public_ip/haproxy?stats
เมื่อคุณโหลดหน้าสถิติ หากเซิร์ฟเวอร์ทั้งหมดของคุณแสดงเป็นสีเขียว แสดงว่าการตั้งค่าสำเร็จ!
หน้าสถิติประกอบด้วยข้อมูลที่เป็นประโยชน์สำหรับการติดตามโฮสต์เว็บของคุณ รวมถึงเวลาขึ้น/ลง และจำนวนเซสชัน หากเซิร์ฟเวอร์มีเครื่องหมายสีแดง ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์เปิดอยู่ และคุณสามารถ ping ได้จากเครื่องโหลดบาลานเซอร์
หากตัวจัดสรรภาระงานของคุณไม่ตอบสนอง ตรวจสอบให้แน่ใจว่าการเชื่อมต่อ HTTP ไม่ได้ถูกบล็อกโดยไฟร์วอลล์ ตรวจสอบให้แน่ใจว่า HAProxy ทำงานโดยใช้คำสั่งด้านล่าง:
sudo systemctl status haproxy
การป้องกันหน้าสถิติด้วยรหัสผ่าน
อย่างไรก็ตาม หากหน้าสถิติแสดงไว้ที่ส่วนหน้า ก็เปิดให้ทุกคนเห็น ซึ่งอาจไม่ใช่ความคิดที่ดี แต่คุณสามารถกำหนดหมายเลขพอร์ตแบบกำหนดเองให้กับมันได้โดยเพิ่มตัวอย่างด้านล่างที่ส่วนท้ายของไฟล์ haproxy.cfg ของคุณ แทนที่ ชื่อผู้ใช้ и รหัสผ่าน เพื่อสิ่งที่ปลอดภัย:
listen stats
bind *:8181
stats enable
stats uri /
stats realm Haproxy Statistics
stats auth username:password
หลังจากเพิ่มกลุ่ม Listener ใหม่แล้ว ให้ลบลิงก์ uri สถิติเก่าออกจากกลุ่มส่วนหน้า เมื่อเสร็จแล้ว ให้บันทึกไฟล์และรีสตาร์ท HAProxy
sudo systemctl restart haproxy
จากนั้นเปิดโหลดบาลานเซอร์อีกครั้งด้วยหมายเลขพอร์ตใหม่ และเข้าสู่ระบบด้วยชื่อผู้ใช้และรหัสผ่านที่คุณระบุไว้ในไฟล์การกำหนดค่า
http://load_balancer_public_ip:8181
ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ทั้งหมดของคุณยังคงแสดงเป็นสีเขียว จากนั้นเปิดเพียง IP โหลดบาลานเซอร์โดยไม่มีหมายเลขพอร์ตในเบราว์เซอร์ของคุณ
http://load_balancer_public_ip/
หากคุณมีหน้า Landing Page ที่หลากหลายบนเซิร์ฟเวอร์แบ็คเอนด์ คุณจะสังเกตได้ว่าทุกครั้งที่คุณโหลดหน้าซ้ำ คุณจะได้รับการตอบกลับจากโฮสต์อื่น คุณสามารถลองใช้อัลกอริธึมการปรับสมดุลแบบต่างๆ ได้ในส่วนการกำหนดค่าหรือลองดู
สรุป: โหลดบาลานเซอร์ HAProxy
ขอแสดงความยินดีที่ตั้งค่าโหลดบาลานเซอร์ HAProxy สำเร็จแล้ว แม้ว่าจะมีการตั้งค่าโหลดบาลานซ์พื้นฐาน คุณก็สามารถปรับปรุงประสิทธิภาพและความพร้อมใช้งานของเว็บแอปพลิเคชันของคุณได้อย่างมาก คู่มือนี้เป็นเพียงการแนะนำเกี่ยวกับการปรับสมดุลโหลดด้วย HAProxy ซึ่งมีความสามารถมากกว่าที่จะกล่าวถึงในคู่มือการตั้งค่าฉบับย่อ เราขอแนะนำให้ทดลองใช้การกำหนดค่าที่แตกต่างกันโดยใช้
การใช้โฮสต์หลายตัวเพื่อปกป้องบริการเว็บของคุณด้วยพื้นที่ว่าง ตัวโหลดบาลานเซอร์เองอาจยังแสดงจุดเสียอยู่ คุณสามารถปรับปรุงความพร้อมใช้งานสูงเพิ่มเติมได้โดยการติดตั้ง IP แบบลอยระหว่างโหลดบาลานเซอร์หลายตัว คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในของเรา
ข้อมูลเพิ่มเติมเกี่ยวกับหลักสูตร
ที่มา: will.com