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

1303

High Available có 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 buổi công nghệ thông tin bùng phát như hiện nay, một dịch vụ có thể có đến hàng chục 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ố “luôn luôn sẵn sàng phục vụ” của dịch vụ mà mình cung cấp.

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ạn bè. Thế 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ạn bè của bạn và than phiền rằng mình không thể check được mail do bị làm sao ấy chả biết ! Bạn bè, khách hàng của bạn lập tức 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à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 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 có ty tỷ lý do khác khiến cho dịch vụ 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 áp dụng tối đa. Ở bài viết trước, mình đã 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ó thể tham khảo tại đây.

Trong mô hình mình triển khai ở bài viết trước như trên. Rất dễ nhận ra điểm yếu của 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 nảy sinh ra một vấn đề khác – đó là user sẽ truy cập vào đâu ?? Cùng một dịch vụ, chúng ta không thể nào đưa cho user 2 IP truy cập được. Để giải quyết bài toán đó, chúng ta có 1 giải pháp đó là sử dụng Virtual IP ( IP ảo) để user truy cập vào. Các Loadbalacer của chúng ta lúc này sẽ chỉ hoạt động với cùng một V-IP. Có khá nhiều giải pháp cung cấp tính năng Virtual IP như UCARP , Keepalived… Và trong khuôn khổ bài viết này, mình sẽ giới thiệu các bạn về Keepalived.

Giới thiệu 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 đích để cung cấp các tính năng Loadbalacing và High available cho các hệ thống Linux. Phiên bản đầu tiên được ra đời tháng 12-2000, đến nay đã trải qua 16 năm phát triển. Các bạn có thể xem thêm tại www.keepalived.org

Để dễ hiểu về tính năng cũng như cách hoạt động của keepalived, chúng ta sẽ đi thẳng vào phần cài đặt và config.

Install 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ẽ cài đặt cả 3 dịch vụ keepalived , HAproxy và Apache2. Mô hình như sau :

Cài đặt các máy chủ :

Trên mỗi máy chủ, chúng ta lần lượt cài đặt các dịch vụ sau :

Sau khi cài đặt , có thể kiểm tra các phiên bản đã cài bằng các câu lệnh :

Lần lượ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 để chuẩn bị cho bước test cho dễ 😀

Cụ thể mình làm như sau :

Trên máy test1

Trên máy test2

Lần lượ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ụ Keepalived sẽ giúp chúng ta tạo 1 Virtual IP để dùng cho máy chủ, nói một cách nôm na là máy chủ sẽ sử dụng IP do chúng ta tự định nghĩa bằng Keepalived chứ không phải dùng IP trên interface của máy chủ (được cấp bởi 1 DHCP nào đó hay do chúng ta tự gán.). Để làm việc này, chúng ta cần vào file /etc/sysctl.conf và thêm dòng sau vào file sysctl.conf :

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 cách restart server hoặc chạy câu lệnh sau :

test1@ubuntu:~$ sudo sysctl -p

Thực hiện việc này lần lượt trên cả 2 máy chủ nhé !

Tham gia ngay để biết thêm về cuộc chiến

Bước 2 : Config Keepalived

File config của Keepalived sẽ được lưu ở /etc/keepalived/keepalived.conf .Lưu ý nếu file chưa có sẵn thì tạo file mới nhé. Bạn có thể dùng bất cứ trình biên 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 :

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

Sau khi khai báo file keepalived.conf ở cả 2 máy thì nhớ sudo service keepalived start nhé.

Cần lưu ý ở 2 khai báo trên :

Với máy test1

và máy test2

Ta thấy khai báo với test1 stateMASTER , priority 100

Khác với test2 state BACKUPpriority 99

Khai báo trên có ý nghĩa khởi tạo ban đầ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

máy test2

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ả 2 máy. Vì hiện tại khởi tạo ban đầu máy test1 giữ vai trò MASTER

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

Trong file cấu hình Keepalived trên của 2 máy test1 và test2 đều có track_script – có nghĩa là cả 2 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 ban đầu với state MASTERpriotiry 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 ban đầu ở test2 , do đó Keepalived sẽ chuyển trạng thái của test2 từ BACKUP thành MASTER và test2 sẽ được giữ VIP đã khai báo.

Test config Keepalived

Để dễ hình dung, chúng ta sẽ cùng đi check trạng thái ban đầu của cả 2 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

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

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

Bây giờ mình sẽ tắt HAproxy trên máy test1

Và check lại nhé

test1

Check lại máy test2 nào

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

Chúng ta thấy ở trạng thái ban đầu, máy test1 sẽ là MASTER STATE trong khi máy test2 sẽ là BACKUP STATE. Sau khi 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.

Bây giờ chúng ta config nốt haproxy.

Config HAproxy

HAproxy ở bài viết này vì kiến thức hạn hẹp nên mình 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.

Lần lượt trên cả 2 máy chủ ta tiến hành chỉnh sửa file config của haproxy

nội dung file như sau :

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ả các 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 lần lượt trên cả 2 server . Edit cả 2 file sau trên mỗi server sudo nano /etc/apache2/ports.confsudo nano /etc/apache2/sites-available/000-default.conf

Ok, vậy là đã hoàn tất phần cấu hình, chúng ta cùng test thành quả bằng cách 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

Kết :

Chúng ta đã hoàn thành triển khai một hệ thống có khả năng chịu lỗi cao. Bây giờ 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 công cụ miễn phí với rất nhiều tính năng. Trên đây mình 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ó thể tham khảo thêm ở trang chủ của keepalivedhaproxy nhé.

Chúc các bạn ăn tết vui vẻ 🙂

Techtalk via viblo

CHIA SẺ