Triển khai dịch vụ High Available với Keepalived + HAproxy trên server Ubuntu

Chúng tôi rất vui mừng chia sẻ kiến thức về từ khóa Keepalived la gi để tối ưu hóa nội dung trang web và tiếp thị trực tuyến. Bài viết cung cấp phương pháp tìm kiếm, phân tích từ khóa và chiến lược hiệu quả. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi để cập nhật kiến thức mới.

High Available mang tên tiếng Việt thân thiện là ” tính sẵn sàng cao” – ám chỉ các dịch vụ, ứng dụng hoặc một thứ gì đó luôn sẵn sàng hoạt động phục vụ người dùng. Trong thời đại công nghệ thông tin bùng phát như hiện nay, một dịch vụ có thể có tới hàng trăm nghìn nhà cung cấp khác nhau. Do vậy, để tăng năng lực cạnh tranh cũng như hiệu quả kinh doanh thì ngoài dịch vụ tốt ra, các nhà cung cấp còn phải đảm bảo yếu tố “xoành xoạch sẵn sàng phục vụ” của dịch vụ mà mình cung cấp.

Bạn Đang Xem: Triển khai dịch vụ High Available với Keepalived + HAproxy trên server Ubuntu

Bạn cứ thử tưởng tượng, với một dịch vụ mail chẳng hạn. Bạn vốn là user ruột của dịch vụ abc@mail gì gì đó ,bỗng dưng 1 ngày đẹp trời sáng trăng nọ, bạn đang cần nhận một email từ khách hàng hoặc bè bạn. Vậy mà cái dịch vụ mail kia bỗng dưng dở chứng 404 với 505 các kiểu con đà điểu ! Bạn không thể nào check được cái mail mà mình cần. Rồi bạn liên lạc với khách hàng, bè bạn của bạn và than phiền rằng mình không thể check được mail do bị làm thế nào ấy chả biết ! Bè bạn, khách hàng của bạn tức thì cho bạn lời khuyên rằng ” Sao ông không dùng cái mail xyz ấy, nó tốt hơn nhiều, chả bao giờ bị thế đâu !! “. Và thế là a-lê-hấp , anh dịch vụ mail abc@mail bỗng dưng mất một user trung thành với chủ vào tay anh xyz@mail vì lý do mail server bị chuột cắn mất dây =)).

Để phòng tránh các sự cố làm gián đoạn dịch vụ như trên, tất nhiên tất cả chúng ta phải tiến hành diệt chuột tận gốc trong khu vực đặt server =)). Ngoài chuột ra thì còn tồn tại ty tỷ lý do khác khiến cho dịch vụ tất cả chúng ta bị gián đoạn. Lúc này nguyên tắc bất hủ “không bao giờ để trứng trong cùng một rổ” được vận dụng tối đa. Ở nội dung bài viết trước, tôi đã hướng dẫn các bạn cách tách riêng các server ra và cân bằng tải cũng như fail-over với HAproxy . Các bạn cũng có thể tham khảo tại đây.

😄

Trong mô hình mình triển khai ở nội dung bài viết trước như trên. Rất dễ nhận ra điểm yếu của khối hệ thống nằm ở anh Loadbalancer HAproxy ! Nếu chẳng may anh ấy đột tử thì xem như việc tăng số lượng webserver phía sau gần như không còn ý nghĩa gì trong việc tăng khả năng chịu lỗi(fail-over) của dịch vụ. Vậy, giải pháp nâng cấp cho mô hình trên tất nhiên sẽ là xây dựng thêm nhiều anh HAproxy nữa. Khi xây dựng thêm các Loadbalancer cùng chạy song song thì lại phát sinh ra một vấn đề khác – đó là user sẽ truy cập vào đâu ?? Cùng một dịch vụ, tất cả chúng ta không thể nào đưa cho user 2 IP truy cập được. Để giải quyết và xử lý bài toán đó, tất cả chúng ta có một giải pháp đó là sử dụng Virtual IP ( IP ảo) để user truy cập vào. Các Loadbalacer của tất cả chúng ta lúc này sẽ chỉ hoạt động với cùng một V-IP. Có nhiều giải pháp cung cấp tính năng Virtual IP như UCARP , Keepalived… Và trong phạm vi nội dung bài viết này, mình sẽ giới thiệu các bạn về Keepalived.

Keepalived (Nghe như lời 1 bài hát của nhóm Scorpions =))) là một dạnh định tuyến “mềm” được viết bằng C. Mục tiêu để cung cấp các tính năng Loadbalacing và High available cho những khối hệ thống Linux. Phiên bản trước hết được ra đời tháng 12-2000, đến nay đã trải qua 16 năm phát triển. Các bạn cũng có thể xem thêm tại www.keepalived.org Để dễ hiểu về tính chất năng cũng như cách hoạt động của keepalived, tất cả chúng ta sẽ đi thẳng vào phần tùy chỉnh cấu hình và config.

Vì vấn đề con lap cùi không thể chạy nhiều máy ảo được , và chủ yếu là ….. lười nên mình sẽ chỉ dựng lên 2 server, với mỗi server mình sẽ tùy chỉnh cấu hình cả 3 dịch vụ keepalived , HAproxy và Apache2. Mô hình như sau :

– Test1 Hostname: test1 OS: Ubuntu server 16.04 Service : Keepalived + HAproxy + Apahce2 Private IP: 172.17.3.98 – Test2 Hostname: test2 OS: Ubuntu server 16.04 Service : Keepalived + HAproxy + Apache2 Private IP: 172.17.3.99

😄

Thiết lập cấu hình các sever :

Trên mỗi sever, tất cả chúng ta tuần tự tùy chỉnh cấu hình các dịch vụ sau :

sudo apt-get update sudo apt-get install apache2 sudo apt-get keepalived sudo apt-get install haproxy #hoặc lười gì gõ luôn sudo apt-get install apache2 keepalived haproxy

Sau thời điểm tùy chỉnh cấu hình , có thể kiểm tra các phiên bản đã cài bằng các câu lệnh :

apache2 -v haproxy -v keepalived -v

Tuần tự trên từng máy test1 và test2, các bạn thay đổi nội dung trang index.html mặc định trong /var/www/html/index.html để sẵn sàng cho bước test cho dễ Cụ thể mình làm như sau : Trên máy test1

sudo sh -c “test1 : 172.17.3.98 >> /var/www/index.html”

Trên máy test2

sudo sh -c “test2 : 172.17.3.99 >> /var/www/index.html”

Tuần tự truy cập vào 2 địa chỉ trên bằng web browser để xem kết quả nhé .

Config Keepalived :

Bước 1 :

Dịch Vụ Thương Mại Keepalived sẽ giúp tất cả chúng ta tạo 1 Virtual IP để dùng cho sever, nói một cách nôm na là sever sẽ sử dụng IP do tất cả chúng ta tự khái niệm bằng Keepalived chứ không phải dùng IP trên interface của sever (được cấp bởi 1 DHCP nào đó hay do tất cả chúng ta tự gán.). Để thao tác làm việc này, tất cả chúng ta cần vào file /etc/sysctl.conf và thêm dòng sau vào file sysctl.conf :

net.ipv4.ip_nonlocal_bind=1

Sau đó các bạn lưu lại và thoát ra. Tiếp tục thực thi câu lệnh được gán vào bằng phương pháp restart server hoặc chạy câu lệnh sau :

test1@ubuntu:~$ sudo sysctl -p

Thực hiện việc này tuần tự trên cả hai sever nhé !

Bước 2 : Config Keepalived

Xem Thêm : Doodle Art (Phần 1): Doodle Art là gì? Những sự thật thú vị về Doodle Art

File config của Keepalived sẽ tiến hành lưu ở /etc/keepalived/keepalived.conf .Lưu ý nếu file chưa xuất hiện sẵn thì tạo file mới nhé. Chúng ta cũng có thể dùng bất kể trình soạn text nào trên Linux đều được. Ở đây mình sẽ dùng nano.

Trên server test1

test1@ubuntu:~$ sudo nano /etc/keepalived/keepalived.conf

Điền vào file nội dung sau :

global_defs { router_id test1 #khai báo route_id của keepalived } vrrp_script chk_haproxy { script “killall -0 haproxy” interval 2 weight 2 } vrrp_instance VI_1 { virtual_router_id 51 advert_int 1 priority 100 state MASTER interface ens33 #thông tin tên interface của server, bạn dùng lệnh `ifconfig` để xem và điền cho đúng virtual_ipaddress { 172.17.3.222 dev ens33 #Khai báo Virtual IP cho interface tương ứng } authentication { auth_type PASS auth_pass 123456 #Password này phải khai báo giống nhau giữa các server keepalived } track_script { chk_haproxy } }

Tương tự trên máy test2

global_defs { router_id test2 } vrrp_script chk_haproxy { script “killall -0 haproxy” interval 2 weight 2 } vrrp_instance VI_1 { virtual_router_id 51 advert_int 1 priority 99 state BACKUP interface ens33 virtual_ipaddress { 172.17.3.222 dev ens33 } authentication { auth_type PASS auth_pass 123456 } track_script { chk_haproxy } }

Sau thời điểm khai báo file keepalived.conf ở cả hai máy thì nhớ sudo service keepalived start nhé.

Cần lưu ý ở cả 2 khai báo trên : Với máy test1

vrrp_instance VI_1 { virtual_router_id 51 advert_int 1 priority 100 state MASTER interface ens33

và máy test2

vrrp_instance VI_1 { virtual_router_id 51 advert_int 1 priority 99 state BACKUP interface ens33

Ta thấy khai báo với test1 state là MASTER , priority 100 Khác với test2 state BACKUP và priority 99

Khai báo trên có ý nghĩa khởi tạo lúc đầu máy test1 sẽ là MASTER và được quyền giữ VIP 172.17.3.222 được gán vào interface ens33. Ta có thể kiểm tra với câu lệnh ip addr sh sẽ thấy như sau : máy test1

test1@ubuntu:/var/log$ ip addr sh 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UPvàgt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:f5:30:5b brd ff:ff:ff:ff:ff:ff inet 172.17.3.98/24 brd 172.17.3.255 scope global ens33 valid_lft forever preferred_lft forever inet 172.17.3.222/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fef5:305b/64 scope link valid_lft forever preferred_lft forever

máy test2

test2@ubuntu:/var/log$ ip addr sh 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UPvàgt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:21:87:40 brd ff:ff:ff:ff:ff:ff inet 172.17.3.99/24 brd 172.17.3.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe21:8740/64 scope link valid_lft forever preferred_lft forever

Virtual IP chỉ được gán vào interface ens33 của máy test1 chứ không được gán vào máy test2 dù ta đã khai báo trên cả hai máy. Vì ngày nay khởi tạo lúc đầu máy test1 giữ vai trò MASTER

Tiếp theo, với những khai báo vrrp_script trên cả hai máy

vrrp_script chk_haproxy { script “killall -0 haproxy” #check pid của dịch vụ haproxy có tồn tại hay là không interval 2 #thời kì tái diễn đoạn script đơn vị là second weight 2 #trọng số khấu trừ priority 2 } track_script { chk_haproxy #khai báo tên đoạn script }

Trong file cấu hình Keepalived trên của 2 máy test1 và test2 đều phải có track_script – có tức thị cả hai server đều sẽ tiến hành chạy đoạn script check trạng thái của dịch vụ process ID (PID) được khai báo trong script ( ở đây mình khai báo check service haproxy). Giả sử service haproxy trên test1 (được khởi tạo lúc đầu với state MASTER và priotiry 100) vì một lý do nào đó không hoạt động, Keepalived sẽ trừ trọng số (priority 100-2=98) trên máy test1. Lúc này priority của test1 sẽ là 98 và nhỏ hơn priority=99 được khai báo lúc đầu ở test2 , do đó Keepalived sẽ chuyển trạng thái của test2 từ BACKUP thành MASTER và test2 sẽ tiến hành giữ VIP đã khai báo.

Test config Keepalived

Để dễ hình dung, tất cả chúng ta sẽ cùng đi check trạng thái lúc đầu của cả hai máy, và thử tắt dịch vụ haproxy trên máy test1 xem chuyện gì sẽ xẩy ra nhé.

Trên máy test1

test1@ubuntu:~$ sudo tail /var/log/syslog -n 100

Xem Thêm : Phiên mã là gì? Quá trình phiên mã ở sinh vật nhân thực?

Cùng xem kết quả trả về

Jan 24 21:58:28 ubuntu Keepalived_vrrp[21757]: VRRP_Script(chk_haproxy) succeeded Jan 24 21:58:29 ubuntu Keepalived_vrrp[21757]: VRRP_Instance(VI_1) Transition to MASTER STATE Jan 24 21:58:29 ubuntu Keepalived_vrrp[21757]: VRRP_Instance(VI_1) Received higher prio advert Jan 24 21:58:29 ubuntu Keepalived_vrrp[21757]: VRRP_Instance(VI_1) Entering BACKUP STATE Jan 24 21:58:30 ubuntu Keepalived_vrrp[21757]: VRRP_Instance(VI_1) forcing a new MASTER election Jan 24 21:58:30 ubuntu Keepalived_vrrp[21757]: VRRP_Instance(VI_1) forcing a new MASTER election Jan 24 21:58:31 ubuntu Keepalived_vrrp[21757]: VRRP_Instance(VI_1) Transition to MASTER STATE Jan 24 21:58:32 ubuntu Keepalived_vrrp[21757]: VRRP_Instance(VI_1) Entering MASTER STATE

Tương tự trên máy test2

test2@ubuntu:~$ sudo tail /var/log/syslog -n 100 Jan 24 21:58:07 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Dropping received VRRP packet… Jan 24 21:58:28 ubuntu Keepalived_vrrp[11335]: receive a 0 auth, expecting 1! Jan 24 21:58:28 ubuntu Keepalived_vrrp[11335]: bogus VRRP packet received on ens33 !!! Jan 24 21:58:28 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Dropping received VRRP packet… Jan 24 21:58:29 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election Jan 24 21:58:29 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election Jan 24 21:58:30 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Received higher prio advert Jan 24 21:58:30 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Entering BACKUP STATE

Hiện tại mình sẽ tắt HAproxy trên máy test1

test1@ubuntu:~$ sudo service haproxy stop

Và check lại nhé test1

test1@ubuntu:~$ sudo tail /var/log/syslog -n 100 Jan 24 22:46:13 ubuntu systemd[1]: Stopping HAProxy Load Balancer… Jan 24 22:46:13 ubuntu systemd[1]: Stopped HAProxy Load Balancer. Jan 24 22:46:14 ubuntu Keepalived_vrrp[21757]: VRRP_Script(chk_haproxy) failed

Check lại máy test2 nào

test2@ubuntu:~$ sudo tail /var/log/syslog -n 100 Jan 24 21:58:28 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Dropping received VRRP packet… Jan 24 21:58:29 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election Jan 24 21:58:29 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election Jan 24 21:58:30 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Received higher prio advert Jan 24 21:58:30 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Entering BACKUP STATE Jan 24 22:17:01 ubuntu CRON[19914]: (root) CMD ( cd / && run-parts -report /etc/cron.hourly) Jan 24 22:46:15 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) forcing a new MASTER election Jan 24 22:46:15 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) forcing a new MASTER election Jan 24 22:46:17 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Transition to MASTER STATE Jan 24 22:46:18 ubuntu Keepalived_vrrp[11335]: VRRP_Instance(VI_1) Entering MASTER STATE

Check luôn interface của máy test2

test2@ubuntu:~$ ip addr sh 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UPvàgt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:21:87:40 brd ff:ff:ff:ff:ff:ff inet 172.17.3.99/24 brd 172.17.3.255 scope global ens33 valid_lft forever preferred_lft forever inet 172.17.3.222/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe21:8740/64 scope link valid_lft forever preferred_lft forever

Tất cả chúng ta thấy ở trạng thái lúc đầu, máy test1 sẽ là MASTER STATE trong những lúc máy test2 sẽ là BACKUP STATE. Sau thời điểm tắt service HAproxy trên máy test1 thì test2 đã trở thành MASTER và được gán Virtual IP trên interface của máy test2 , config keepalived đã hoàn thành.

Hiện tại tất cả chúng ta config nốt haproxy.

Config HAproxy

HAproxy ở nội dung bài viết này vì tri thức hạn hẹp nên tôi cũng xin phép được config basic vừa đủ dùng thôi nhá ^^. Nhìn chung config cũng không khác gì bài trước bao nhiêu. Tuần tự trên cả hai sever ta tiến hành chỉnh sửa file config của haproxy

sudo nano /etc/haproxy/haproxy.cfg

nội dung file như sau :

global daemon maxconn 256 defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend http-in bind *:80 default_backend app backend static balance roundrobin server static 172.17.3.222:80 backend app balance roundrobin server test1 172.17.3.98:8080 check server test2 172.17.3.99:8080 check

Lưu ý : Các bạn nhớ chuyển listen port của apache2 thành port khác nhé. Vì mình cài tất cả những dịch vụ haproxy và http đều sử dụng port 80 trên cùng 1 máy nên sẽ conflict đó. Cụ thể ở đây mình sẽ chuyển default listen port của apache thành 8080 Mình sẽ chỉnh sửa tuần tự trên cả hai server . Edit cả hai file sau trên mỗi server sudo nano /etc/apache2/ports.conf và sudo nano /etc/apache2/sites-available/000-default.conf

Ok, vậy là đã hoàn thành phần cấu hình, tất cả chúng ta cùng test thành tựu bằng phương pháp truy cập vào V_IP nhé. Mở trình duyệt và gõ vào 172.17.3.222

F5 để thấy sự khác biệt

Tất cả chúng ta đã hoàn thành triển khai một khối hệ thống có khả năng chịu lỗi cao. Hiện tại thì tha hồ đi nhậu mà không sợ dịch vụ bị down giữa chừng nữa nhé . Keepalived cũng như HAproxy là những phương tiện miễn phí với rất nhiều tính năng. Trên đây tôi chỉ thực hiện những config cơ bản của chúng thôi. Muôn chuyên sâu hơn thì chắc mình còn phải nghiên cứu thêm nhiều. Các bạn cũng có thể tham khảo thêm ở trang chủ của keepalived và haproxy nhé. Chúc các bạn ăn tết vui vẻ

You May Also Like

About the Author: v1000