Difference between revisions of "Loadbalance with Keepalived Nginx"
(60 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== Introduction == | == Introduction == | ||
* การทำ High availbility จะต้องมีส่วนประกอบที่สามารถเปลี่ยนเส้นทางงานและจะต้องมีกลไกในการตรวจสอบความล้มเหลวและการเปลี่ยนระบบหากตรวจพบการหยุดชะงัก โดยจะใช้ระบบของ Keepalived | * การทำ High availbility จะต้องมีส่วนประกอบที่สามารถเปลี่ยนเส้นทางงานและจะต้องมีกลไกในการตรวจสอบความล้มเหลวและการเปลี่ยนระบบหากตรวจพบการหยุดชะงัก โดยจะใช้ระบบของ Keepalived | ||
− | * Keepalived | + | * Keepalived ทำหน้าที่ในการตรวจสอบสถานะของเครื่อง เมื่อเกิดการ Failover ระบบจะเปลี่ยนเส้นทางไปยังอีกระบบหนึ่งที่สแตนบายอยู่โดยอัตโนมัติ เมื่อตัวหลักหยุดทำงาน Floating IP จะย้ายไปยังตัวที่สองโดยอัตโนมัติเพื่อให้บริการต่อ โดยใช้โปรโตคอล VRRP (Virtual Router Redundancy Protocol) |
− | + | ||
− | ::- MASTER-MASTER คือ มีค่า Priority เท่ากัน เมื่อเครื่องที่ 1 | + | :* การตั้งค่า Priority เป็นตัวกำหนดว่าจะให้เครื่องไหนเป็น Master หรือ Backup |
− | ::- MASTER-BACKUP คือ มีค่า Priority ต่างกัน เมื่อเครื่องที่ 1 | + | ::- MASTER-MASTER คือ มีค่า Priority เท่ากัน เมื่อเครื่องที่ 1 พัง จะย้ายไปเครื่องที่ 2 และเมื่อเครื่องที่ 1 ดี การทำงานก็จะยังคงอยู่ที่เครื่องที่ 2 |
+ | ::- MASTER-BACKUP คือ มีค่า Priority ต่างกัน เมื่อเครื่องที่ 1 พัง จะย้ายไปเครื่องที่ 2 และเมื่อเครื่องที่ 1 ดี การทำงานก็จะย้ายไปเครื่องที่ 1 แทน | ||
[[File:Loadbalance 640-100.gif | link=]] | [[File:Loadbalance 640-100.gif | link=]] | ||
== Lab setup == | == Lab setup == | ||
+ | ในการทำแลปนี้จะเป็นการทำแบบ MASTER-MASTER และเมื่อเครื่องที่ 1 ขัดข้องระบบก็จะเปลี่ยนไปใช้เครื่องที่ 2 แทน โดยมีอีกส่วนทีให้เช็คค่าด้วยคือ เมื่อระบบยังดีแต่ nginx ล่มหรือขัดข้องให้ทำการเปลี่ยนเครื่องด้วยเหมือนนัน <br> | ||
+ | |||
=== Network Scenario === | === Network Scenario === | ||
− | # Server 1 : 10.0.0. | + | # Server 1 : 10.0.0.1 |
− | # Server 2 : 10.0.0. | + | # Server 2 : 10.0.0.2 |
− | # Virtual IP : 10.0.0.1 | + | # Virtual IP : 10.0.0.3 |
+ | # Web 1 : 10.0.0.10 | ||
+ | # Web 2 : 10.0.0.11 | ||
+ | <br> | ||
=== Step 1 - Install Packages === | === Step 1 - Install Packages === | ||
<syntaxhighlight lang=bash> | <syntaxhighlight lang=bash> | ||
− | |||
$ sudo apt-get install keepalived | $ sudo apt-get install keepalived | ||
$ sudo apt-get install nginx | $ sudo apt-get install nginx | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | <br> | ||
− | === Step 2 - Setup | + | === Step 2 - Setup Nginx TCP Balancing=== |
+ | ทำการแก้ไขไฟล์ nginx configuration ใน /etc/nginx/nginx.conf ของเครื่อง server ทั้งสองให้เหมือนกัน | ||
+ | <syntaxhighlight lang=bash> | ||
+ | $ sudo vi /etc/nginx/nginx.conf | ||
+ | </syntaxhighlight> | ||
− | === | + | <syntaxhighlight lang=Vim Script> |
+ | stream { | ||
+ | upstream ubuntu { | ||
+ | server 10.0.0.10:80; | ||
+ | server 10.0.0.11:80; | ||
+ | } | ||
+ | server { | ||
+ | listen 80; | ||
+ | proxy_pass ubuntu; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | * ubuntu คือ servername | ||
+ | กำหนดค่าให้เริ่มทำงานอัตโนมัติเมื่อระบบรีบูต <br> | ||
+ | <syntaxhighlight lang=bash> | ||
+ | $ sudo systemctl enable nginx | ||
+ | </syntaxhighlight> | ||
+ | ทำการรีสตาร์ท nginx เพื่อให้ค่า config ล่าสุดทำงาน <br> | ||
+ | <syntaxhighlight lang=bash> | ||
+ | $ sudo service nginx restart | ||
+ | </syntaxhighlight> | ||
+ | ทดสอบการทำงาน Loadbalance ของ Nginx โดยเข้าผ่าน Virtual IP (10.0.0.3) <br> | ||
+ | หรือใช้คำสั่ง (Shell) | ||
+ | <syntaxhighlight lang=shell> | ||
+ | $ while true; do (date +%r); curl 10.0.0.1; sleep 1; done <br> | ||
+ | </syntaxhighlight> | ||
+ | [[File:NginxBrowser.gif | link=]] [[File:NginxCURL.gif | link=]] <br> | ||
+ | <br> | ||
− | === Step | + | === Step 3 - Setup Keepalived === |
− | + | ทำการเพิ่มไฟล์ keepalived configuration ใน /etc/keepalived/keepalived.conf ของเครื่อง server | |
− | |||
− | |||
<syntaxhighlight> | <syntaxhighlight> | ||
$ sudo vi /etc/keepalived/keepalived.conf | $ sudo vi /etc/keepalived/keepalived.conf | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | *อัพเดทค่าที่ไฮไลท์ด้วยระบบของคุณ | ||
''' Server 1 ''' | ''' Server 1 ''' | ||
− | <syntaxhighlight lang= | + | <syntaxhighlight lang=Vim Script highlight="16,18,21"> |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
vrrp_script chk_nginx { | vrrp_script chk_nginx { | ||
script "/usr/bin/killall -0 nginx" | script "/usr/bin/killall -0 nginx" | ||
Line 57: | Line 87: | ||
auth_pass 1111 | auth_pass 1111 | ||
} | } | ||
− | unicast_src_ip 10.0.0. | + | unicast_src_ip 10.0.0.1 |
unicast_peer { | unicast_peer { | ||
+ | 10.0.0.2 | ||
+ | } | ||
+ | virtual_ipaddress { | ||
10.0.0.3 | 10.0.0.3 | ||
− | |||
− | |||
} | } | ||
track_script { | track_script { | ||
− | |||
chk_nginx | chk_nginx | ||
} | } | ||
Line 71: | Line 101: | ||
''' Server 2 ''' | ''' Server 2 ''' | ||
− | <syntaxhighlight lang= | + | <syntaxhighlight lang=Vim Script highlight="16,18,21> |
+ | vrrp_script chk_nginx { | ||
+ | script "/usr/bin/killall -0 nginx" | ||
+ | interval 2 | ||
+ | } | ||
+ | |||
vrrp_instance VI_1 { | vrrp_instance VI_1 { | ||
state MASTER | state MASTER | ||
interface ens3 | interface ens3 | ||
virtual_router_id 101 | virtual_router_id 101 | ||
− | priority 110 | + | priority 110 |
advert_int 1 | advert_int 1 | ||
authentication { | authentication { | ||
Line 82: | Line 117: | ||
auth_pass 1111 | auth_pass 1111 | ||
} | } | ||
− | unicast_src_ip 10.0.0. | + | unicast_src_ip 10.0.0.2 |
unicast_peer { | unicast_peer { | ||
− | 10.0.0. | + | 10.0.0.1 |
} | } | ||
virtual_ipaddress { | virtual_ipaddress { | ||
− | 10.0.0. | + | 10.0.0.3 |
} | } | ||
track_script { | track_script { | ||
− | |||
chk_nginx | chk_nginx | ||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | กำหนดค่าให้เริ่มทำงานอัตโนมัติเมื่อระบบรีบูต | ||
+ | <syntaxhighlight lang=bash> | ||
+ | $ sudo systemctl enable keepalived | ||
+ | </syntaxhighlight> | ||
+ | ทำการรีสตาร์ท keepalived เพื่อให้ค่า config ล่าสุดทำงาน | ||
+ | <syntaxhighlight lang=bash> | ||
+ | $ sudo service keepalived restart | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ''' เพิ่มเติม ''' : | ||
+ | ส่วนกำหนดเงื่อนไขเมื่อ nginx เกิดขัดข้องให้ทำการเปลี่ยนเส้นทางการทำงานไปยังอีกเครื่อง | ||
+ | <syntaxhighlight lang=bash> | ||
+ | vrrp_script chk_nginx { | ||
+ | script "/usr/bin/killall -0 nginx" | ||
+ | interval 2 | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | <syntaxhighlight lang=bash> | ||
+ | track_script { | ||
+ | chk_nginx | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | <br> | ||
+ | |||
+ | === อ้างอิง === | ||
+ | [https://www.nginx.com/blog/tcp-load-balancing-udp-load-balancing-nginx-tips-tricks/ https://www.nginx.com/blog/tcp-load-balancing-udp-load-balancing-nginx-tips-tricks/] <br> | ||
+ | [https://tecadmin.net/setup-ip-failover-on-ubuntu-with-keepalived/ https://tecadmin.net/setup-ip-failover-on-ubuntu-with-keepalived/] <br> | ||
+ | [https://medium.com/@xmikex83/how-to-setup-an-highly-available-load-balancer-with-keepalived-and-haproxy-on-ubuntu-18-04-8bab7b77f715 https://medium.com/@xmikex83/how-to-setup-an-highly-available-load-balancer-with-keepalived-and-haproxy-on-ubuntu-18-04-8bab7b77f715] <br> | ||
+ | [https://dasunhegoda.com/how-to-setup-haproxy-with-keepalived/833/ https://dasunhegoda.com/how-to-setup-haproxy-with-keepalived/833/] | ||
+ | |||
+ | == ผลการทดสอบ == | ||
+ | ตรวจสอบการทำงานจากคำสั่ง | ||
+ | <syntaxhighlight lang=shell> | ||
+ | $ tail -f /var/log/syslog | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 1. ทดสอบโดยการหยุดการใช้งาน Nginx เครื่องที่ 2 (ขณะนี้เครื่องที่ 2 เป็น MASTER State) <br> | ||
+ | เครื่องที่ 2 | ||
+ | <syntaxhighlight lang=shell> | ||
+ | $ sudo service nginx stop | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | [[File:NginxStop.gif | link=]] <br> | ||
+ | |||
+ | สังเกตุเห็นได้ว่าเมื่อ Nginx พังลง เครื่องที่ 1 ก็ทำการขึ้นเป็น MASTER แทน <br><br> | ||
+ | |||
+ | 2. ทดสอบปิดเครื่องที่ยังเป็น MASTER อยู่ <br> | ||
+ | เครื่องที่ 1 | ||
+ | <syntaxhighlight lang=shell> | ||
+ | & sudo poweroff | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | [[File:ServerPoweroff.gif | link=]] <br> | ||
+ | |||
+ | เมื่อทำการปิดเครื่องที่ 1 เครื่องที่ 2 ก็ทำการขึ้นเป็น MASTER แทน |
Latest revision as of 06:47, 8 June 2021
Introduction
- การทำ High availbility จะต้องมีส่วนประกอบที่สามารถเปลี่ยนเส้นทางงานและจะต้องมีกลไกในการตรวจสอบความล้มเหลวและการเปลี่ยนระบบหากตรวจพบการหยุดชะงัก โดยจะใช้ระบบของ Keepalived
- Keepalived ทำหน้าที่ในการตรวจสอบสถานะของเครื่อง เมื่อเกิดการ Failover ระบบจะเปลี่ยนเส้นทางไปยังอีกระบบหนึ่งที่สแตนบายอยู่โดยอัตโนมัติ เมื่อตัวหลักหยุดทำงาน Floating IP จะย้ายไปยังตัวที่สองโดยอัตโนมัติเพื่อให้บริการต่อ โดยใช้โปรโตคอล VRRP (Virtual Router Redundancy Protocol)
- การตั้งค่า Priority เป็นตัวกำหนดว่าจะให้เครื่องไหนเป็น Master หรือ Backup
- - MASTER-MASTER คือ มีค่า Priority เท่ากัน เมื่อเครื่องที่ 1 พัง จะย้ายไปเครื่องที่ 2 และเมื่อเครื่องที่ 1 ดี การทำงานก็จะยังคงอยู่ที่เครื่องที่ 2
- - MASTER-BACKUP คือ มีค่า Priority ต่างกัน เมื่อเครื่องที่ 1 พัง จะย้ายไปเครื่องที่ 2 และเมื่อเครื่องที่ 1 ดี การทำงานก็จะย้ายไปเครื่องที่ 1 แทน
Lab setup
ในการทำแลปนี้จะเป็นการทำแบบ MASTER-MASTER และเมื่อเครื่องที่ 1 ขัดข้องระบบก็จะเปลี่ยนไปใช้เครื่องที่ 2 แทน โดยมีอีกส่วนทีให้เช็คค่าด้วยคือ เมื่อระบบยังดีแต่ nginx ล่มหรือขัดข้องให้ทำการเปลี่ยนเครื่องด้วยเหมือนนัน
Network Scenario
- Server 1 : 10.0.0.1
- Server 2 : 10.0.0.2
- Virtual IP : 10.0.0.3
- Web 1 : 10.0.0.10
- Web 2 : 10.0.0.11
Step 1 - Install Packages
$ sudo apt-get install keepalived
$ sudo apt-get install nginx
Step 2 - Setup Nginx TCP Balancing
ทำการแก้ไขไฟล์ nginx configuration ใน /etc/nginx/nginx.conf ของเครื่อง server ทั้งสองให้เหมือนกัน
$ sudo vi /etc/nginx/nginx.conf
stream {
upstream ubuntu {
server 10.0.0.10:80;
server 10.0.0.11:80;
}
server {
listen 80;
proxy_pass ubuntu;
}
}
- ubuntu คือ servername
กำหนดค่าให้เริ่มทำงานอัตโนมัติเมื่อระบบรีบูต
$ sudo systemctl enable nginx
ทำการรีสตาร์ท nginx เพื่อให้ค่า config ล่าสุดทำงาน
$ sudo service nginx restart
ทดสอบการทำงาน Loadbalance ของ Nginx โดยเข้าผ่าน Virtual IP (10.0.0.3)
หรือใช้คำสั่ง (Shell)
$ while true; do (date +%r); curl 10.0.0.1; sleep 1; done <br>
Step 3 - Setup Keepalived
ทำการเพิ่มไฟล์ keepalived configuration ใน /etc/keepalived/keepalived.conf ของเครื่อง server
$ sudo vi /etc/keepalived/keepalived.conf
- อัพเดทค่าที่ไฮไลท์ด้วยระบบของคุณ
Server 1
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx"
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface ens3
virtual_router_id 101
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 10.0.0.1
unicast_peer {
10.0.0.2
}
virtual_ipaddress {
10.0.0.3
}
track_script {
chk_nginx
}
}
Server 2
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx"
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface ens3
virtual_router_id 101
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 10.0.0.2
unicast_peer {
10.0.0.1
}
virtual_ipaddress {
10.0.0.3
}
track_script {
chk_nginx
}
}
กำหนดค่าให้เริ่มทำงานอัตโนมัติเมื่อระบบรีบูต
$ sudo systemctl enable keepalived
ทำการรีสตาร์ท keepalived เพื่อให้ค่า config ล่าสุดทำงาน
$ sudo service keepalived restart
เพิ่มเติม : ส่วนกำหนดเงื่อนไขเมื่อ nginx เกิดขัดข้องให้ทำการเปลี่ยนเส้นทางการทำงานไปยังอีกเครื่อง
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx"
interval 2
}
track_script {
chk_nginx
}
อ้างอิง
https://www.nginx.com/blog/tcp-load-balancing-udp-load-balancing-nginx-tips-tricks/
https://tecadmin.net/setup-ip-failover-on-ubuntu-with-keepalived/
https://medium.com/@xmikex83/how-to-setup-an-highly-available-load-balancer-with-keepalived-and-haproxy-on-ubuntu-18-04-8bab7b77f715
https://dasunhegoda.com/how-to-setup-haproxy-with-keepalived/833/
ผลการทดสอบ
ตรวจสอบการทำงานจากคำสั่ง
$ tail -f /var/log/syslog
1. ทดสอบโดยการหยุดการใช้งาน Nginx เครื่องที่ 2 (ขณะนี้เครื่องที่ 2 เป็น MASTER State)
เครื่องที่ 2
$ sudo service nginx stop
สังเกตุเห็นได้ว่าเมื่อ Nginx พังลง เครื่องที่ 1 ก็ทำการขึ้นเป็น MASTER แทน
2. ทดสอบปิดเครื่องที่ยังเป็น MASTER อยู่
เครื่องที่ 1
& sudo poweroff
เมื่อทำการปิดเครื่องที่ 1 เครื่องที่ 2 ก็ทำการขึ้นเป็น MASTER แทน