Difference between revisions of "Loadbalance with Keepalived Nginx"

From CMU ITSC Network
 
(43 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
== Introduction ==
 
== Introduction ==
 
* การทำ High availbility จะต้องมีส่วนประกอบที่สามารถเปลี่ยนเส้นทางงานและจะต้องมีกลไกในการตรวจสอบความล้มเหลวและการเปลี่ยนระบบหากตรวจพบการหยุดชะงัก โดยจะใช้ระบบของ Keepalived
 
* การทำ High availbility จะต้องมีส่วนประกอบที่สามารถเปลี่ยนเส้นทางงานและจะต้องมีกลไกในการตรวจสอบความล้มเหลวและการเปลี่ยนระบบหากตรวจพบการหยุดชะงัก โดยจะใช้ระบบของ Keepalived
* Keepalived สามารถใช้ในการตรวจสอบบริการของระบบและการ Failover เปลี่ยนเส้นทางอัตโนมัติไปยังอีกระบบหนึ่งที่สแตนบายหากเกิดปัญหา โดยจะกำหนดค่าที่อยู่ Floating IP หรือ Virtual IP ที่สามารถย้ายระหว่างตัวโหลดบาลานซ์สองตัว แต่ละตัวจะถูกกำหนดค่าให้แยกทราฟฟิกระหว่างเว็บเซิร์ฟเวอร์แบ็กเอนด์สองตัว เมื่อตัวหลักหยุดทำงาน Floating IP จะย้ายไปยังตัวที่สองโดยอัตโนมัติเบื่อให้บริการต่อ
+
* Keepalived ทำหน้าที่ในการตรวจสอบสถานะของเครื่อง เมื่อเกิดการ Failover ระบบจะเปลี่ยนเส้นทางไปยังอีกระบบหนึ่งที่สแตนบายอยู่โดยอัตโนมัติ เมื่อตัวหลักหยุดทำงาน Floating IP จะย้ายไปยังตัวที่สองโดยอัตโนมัติเพื่อให้บริการต่อ โดยใช้โปรโตคอล VRRP (Virtual Router Redundancy Protocol)
** การตั้งค่า Priority เป็นตัวกำหนดว่าจะให้เครื่องไหนเป็น Master หรือ Backup
+
 
::- MASTER-MASTER คือ มีค่า Priority เท่ากัน เมื่อเครื่องที่ 1 พังจะย้ายไปเครื่องที่ 2 และเมื่อเครื่องที่ 1 ดีการทำงานก็จะยังคงอยู่ที่เครื่องที่ 2
+
:* การตั้งค่า Priority เป็นตัวกำหนดว่าจะให้เครื่องไหนเป็น Master หรือ Backup
::- MASTER-BACKUP คือ มีค่า Priority ต่างกัน เมื่อเครื่องที่ 1 พังจะย้ายไปเครื่องที่ 2 และเมื่อเครื่องที่ 1 ดีการทำงานก็จะย้ายไปเครื่องที่ 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=]]
  
Line 11: Line 12:
  
 
=== Network Scenario ===
 
=== Network Scenario ===
# Server 1 : 10.0.0.2
+
# Server 1 : 10.0.0.1
# Server 2 : 10.0.0.3
+
# 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 haproxy
 
 
$ 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 HAProxy ===
+
=== Step 2 - Setup Nginx TCP Balancing===
ทำการแก้ไขไฟล์ Haproxy configuration ใน /etc/haproxy/haproxy.conf ของเครื่อง server ทั้งสองให้เหมือนกัน
 
<syntaxhighlight>
 
$ sudo vi /etc/haproxy/haproxy.conf
 
</syntaxhighlight>
 
 
 
<syntaxhighlight>
 
listen stats
 
        bind *:8090
 
        mode http
 
        stats enable
 
        stats refresh 10s
 
        stats show-node
 
        stats auth admin:pass
 
        stats uri /haproxy-stats
 
 
 
frontend http-in
 
        bind *:8080
 
        default_backend server
 
 
 
backend server
 
        balance roundrobin
 
        option  tcp-check
 
        option  log-health-checks
 
        server  sirapat-lb1 10.0.0.2:80 check port 80
 
        server  sirapat-lb2 10.0.0.3:80 check port 80
 
</syntaxhighlight>
 
 
 
กำหนดค่าให้เริ่มทำงานอัตโนมัติเมื่อระบบถูกรีบูต
 
<syntaxhighlight>
 
$ sudo service haproxy start
 
</syntaxhighlight>
 
ทำการรีสตาร์ท keepalived เพื่อให้ค่า config ล่าสุดทำงาน
 
<syntaxhighlight>
 
$ sudo service haproxy restart
 
</syntaxhighlight>
 
 
 
ตรวจสอบการทำงานโดนเข้าไปที่ http://10.0.0.1:8090/haproxy-stats โดยจะมีตัว login เด้งออกมาทำการใส่ username และ password ตามที่ได้ตั้งไว้ใน config (stats auth) ในที่นี้เป็น username: admin, password: pass <br>
 
เมื่อถูกต้องจะได้หน้าต่างดังนี้ <br>
 
[[File:HAProxy.jpg]]
 
 
 
=== Step 3 - Setup Nginx ===
 
 
ทำการแก้ไขไฟล์ nginx configuration ใน /etc/nginx/nginx.conf ของเครื่อง server ทั้งสองให้เหมือนกัน
 
ทำการแก้ไขไฟล์ nginx configuration ใน /etc/nginx/nginx.conf ของเครื่อง server ทั้งสองให้เหมือนกัน
  
Line 82: Line 45:
 
}
 
}
 
</syntaxhighlight>
 
</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 4 - Setup Keepalived ===
+
=== Step 3 - Setup Keepalived ===
ทำการแก้ไขไฟล์ keepalived configuration ใน /etc/keepalived/keepalived.conf ของเครื่อง server
+
ทำการเพิ่มไฟล์ keepalived configuration ใน /etc/keepalived/keepalived.conf ของเครื่อง server
 
<syntaxhighlight>
 
<syntaxhighlight>
 
$ sudo vi /etc/keepalived/keepalived.conf
 
$ sudo vi /etc/keepalived/keepalived.conf
Line 91: Line 71:
 
*อัพเดทค่าที่ไฮไลท์ด้วยระบบของคุณ
 
*อัพเดทค่าที่ไฮไลท์ด้วยระบบของคุณ
 
''' Server 1 '''
 
''' Server 1 '''
<syntaxhighlight lang=Vim Script highlight="14,22,24,26">
+
<syntaxhighlight lang=Vim Script highlight="16,18,21">
vrrp_script chk_haproxy {
 
    script "killall -0 haproxy"
 
    interval 2
 
    weight 2
 
}
 
 
 
 
vrrp_script chk_nginx {
 
vrrp_script chk_nginx {
 
     script "/usr/bin/killall -0 nginx"
 
     script "/usr/bin/killall -0 nginx"
Line 113: Line 87:
 
         auth_pass 1111
 
         auth_pass 1111
 
     }
 
     }
     unicast_src_ip 10.0.0.2
+
     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
    virtual_ipaddress {
 
        10.0.0.1
 
 
     }
 
     }
 
     track_script {
 
     track_script {
        chk_haproxy
 
 
         chk_nginx
 
         chk_nginx
 
     }
 
     }
Line 127: Line 101:
  
 
''' Server 2 '''
 
''' Server 2 '''
<syntaxhighlight lang=Vim Script highlight="14,22,24,26>
+
<syntaxhighlight lang=Vim Script highlight="16,18,21>
vrrp_script chk_haproxy {
 
    script "killall -0 haproxy"
 
    interval 2
 
    weight 2
 
}
 
 
 
 
vrrp_script chk_nginx {
 
vrrp_script chk_nginx {
 
     script "/usr/bin/killall -0 nginx"
 
     script "/usr/bin/killall -0 nginx"
Line 149: Line 117:
 
         auth_pass 1111
 
         auth_pass 1111
 
     }
 
     }
     unicast_src_ip 10.0.0.3
+
     unicast_src_ip 10.0.0.2
 
     unicast_peer {
 
     unicast_peer {
         10.0.0.2
+
         10.0.0.1
 
     }
 
     }
 
     virtual_ipaddress {
 
     virtual_ipaddress {
         10.0.0.1
+
         10.0.0.3
 
     }
 
     }
 
     track_script {
 
     track_script {
        chk_haproxy
 
 
         chk_nginx
 
         chk_nginx
 
     }
 
     }
Line 163: Line 130:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
กำหนดค่าให้เริ่มอัตโนมัติเมื่อบูตระบบ
+
กำหนดค่าให้เริ่มทำงานอัตโนมัติเมื่อระบบรีบูต
<syntaxhighlight>
+
<syntaxhighlight lang=bash>
$ sudo service keepalived start
+
$ sudo systemctl enable keepalived
 
</syntaxhighlight>
 
</syntaxhighlight>
 
ทำการรีสตาร์ท keepalived เพื่อให้ค่า config ล่าสุดทำงาน
 
ทำการรีสตาร์ท keepalived เพื่อให้ค่า config ล่าสุดทำงาน
<syntaxhighlight>
+
<syntaxhighlight lang=bash>
 
$ sudo service keepalived restart
 
$ sudo service keepalived restart
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
''' เพิ่มเติม ''' :
 
''' เพิ่มเติม ''' :
ส่วนกำหนดเงื่อนไขเมื่อ nginx หรือ haproxy เกิดขัดข้องให้ทำการเปลี่ยนเส้นทางการทำงานไปยังอีกเครื่อง
+
ส่วนกำหนดเงื่อนไขเมื่อ nginx เกิดขัดข้องให้ทำการเปลี่ยนเส้นทางการทำงานไปยังอีกเครื่อง
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
vrrp_script chk_haproxy {
 
    script "killall -0 haproxy"
 
    interval 2
 
    weight 2
 
}
 
 
 
vrrp_script chk_nginx {
 
vrrp_script chk_nginx {
 
     script "/usr/bin/killall -0 nginx"
 
     script "/usr/bin/killall -0 nginx"
Line 189: Line 150:
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
 
     track_script {
 
     track_script {
        chk_haproxy
 
 
         chk_nginx
 
         chk_nginx
 
     }
 
     }
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
<br>
  
 
=== อ้างอิง ===
 
=== อ้างอิง ===
Line 199: Line 160:
 
[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://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/]
 
[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 แทน

Loadbalance 640-100.gif

Lab setup

ในการทำแลปนี้จะเป็นการทำแบบ MASTER-MASTER และเมื่อเครื่องที่ 1 ขัดข้องระบบก็จะเปลี่ยนไปใช้เครื่องที่ 2 แทน โดยมีอีกส่วนทีให้เช็คค่าด้วยคือ เมื่อระบบยังดีแต่ nginx ล่มหรือขัดข้องให้ทำการเปลี่ยนเครื่องด้วยเหมือนนัน

Network Scenario

  1. Server 1 : 10.0.0.1
  2. Server 2 : 10.0.0.2
  3. Virtual IP : 10.0.0.3
  4. Web 1 : 10.0.0.10
  5. 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>

NginxBrowser.gif NginxCURL.gif

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

NginxStop.gif

สังเกตุเห็นได้ว่าเมื่อ Nginx พังลง เครื่องที่ 1 ก็ทำการขึ้นเป็น MASTER แทน

2. ทดสอบปิดเครื่องที่ยังเป็น MASTER อยู่
เครื่องที่ 1

& sudo poweroff

ServerPoweroff.gif

เมื่อทำการปิดเครื่องที่ 1 เครื่องที่ 2 ก็ทำการขึ้นเป็น MASTER แทน