Cách thiết lập web server khả dụng cao với IP giữ và nổi trên Ubuntu 14.04
Tính sẵn sàng cao là một chức năng của thiết kế hệ thống cho phép ứng dụng tự động khởi động lại hoặc định tuyến lại công việc sang một hệ thống có khả năng khác trong trường hợp có sự cố. Về server , cần có một số công nghệ khác nhau để cài đặt một hệ thống có tính khả dụng cao. Phải có một thành phần có thể chuyển hướng công việc và phải có một cơ chế giám sát sự cố và chuyển đổi hệ thống nếu phát hiện ra sự cố gián đoạn. Daemon keepalived
được dùng để giám sát các dịch vụ hoặc hệ thống và tự động chuyển đổi dự phòng sang chế độ chờ nếu sự cố xảy ra. Trong hướng dẫn này, ta sẽ trình bày cách sử dụng keepalived
để cài đặt một dịch vụ web có tính khả dụng cao. Ta sẽ cấu hình một địa chỉ IP nổi có thể được di chuyển giữa hai web server có khả năng. Nếu server chính gặp sự cố, IP nổi sẽ tự động được chuyển đến server thứ hai, cho phép dịch vụ tiếp tục.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần tạo hai server Ubuntu 14.04 trên account DigitalOcean của bạn . Cả hai server phải được đặt trong cùng một trung tâm dữ liệu và phải được bật mạng riêng.
Trên mỗi server này, bạn cần một user không phải root được cấu hình với quyền truy cập sudo
. Bạn có thể làm theo hướng dẫn cài đặt server ban đầu Ubuntu 14.04 của ta để tìm hiểu cách cài đặt những user này.
Khi đã sẵn sàng bắt đầu, hãy đăng nhập vào cả hai server của bạn bằng user không phải root của bạn.
Cài đặt và cấu hình Nginx
Mặc dù keepalived
thường được sử dụng để theo dõi và chuyển đổi dự phòng các bộ cân bằng tải, để giảm độ phức tạp trong hoạt động của ta , ta sẽ sử dụng Nginx làm web server đơn giản trong hướng dẫn này.
Bắt đầu bằng cách cập nhật index gói local trên mỗi server của bạn. Sau đó, ta có thể cài đặt Nginx:
- sudo apt-get update
- sudo apt-get install nginx
Trong hầu hết các trường hợp, đối với một cài đặt có tính khả dụng cao, bạn cần cả hai server phân phối chính xác cùng một nội dung. Tuy nhiên, để rõ ràng, trong hướng dẫn này, ta sẽ sử dụng Nginx để cho biết server nào trong hai server đang phục vụ các yêu cầu của ta tại bất kỳ thời điểm nào. Để thực hiện việc này, ta sẽ thay đổi trang index.html
mặc định trên mỗi server của ta . Mở file ngay bây giờ:
- sudo nano /usr/share/nginx/html/index.html
Trên server đầu tiên của bạn, hãy thay thế nội dung của file bằng:
<h1>Primary</h1>
Trên server thứ hai của bạn, thay thế nội dung của file bằng:
<h1>Secondary</h1>
Lưu và đóng các file khi bạn hoàn tất.
Xây dựng và cài đặt Keepalived
Tiếp theo, ta sẽ cài đặt trình keepalived
trên server của bạn . Có một version keepalived
trong repository lưu trữ mặc định của Ubuntu, nhưng nó đã lỗi thời và mắc phải một số lỗi khiến cấu hình của ta không thể hoạt động. Thay vào đó, ta sẽ cài đặt version mới nhất của keepalived
từ nguồn.
Trước khi bắt đầu, ta nên nắm bắt các phụ thuộc mà ta cần để xây dựng phần mềm. Các build-essential
meta-package sẽ cung cấp các công cụ biên dịch ta cần, trong khi libssl-dev
gói chứa các thư viện SSL keepalived
nhu cầu để xây dựng đối với:
- sudo apt-get install build-essential libssl-dev
Khi các phụ thuộc đã sẵn sàng, ta có thể download tarball cho keepalived
. Truy cập trang này để tìm version mới nhất của phần mềm. Nhấp chuột phải vào version mới nhất và sao chép địa chỉ liên kết. Quay lại server của bạn, di chuyển đến folder chính của bạn và sử dụng wget
để lấy liên kết bạn đã sao chép:
- cd ~
- wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
Sử dụng lệnh tar
để mở rộng repository và sau đó chuyển vào folder kết quả:
- tar xzvf keepalived*
- cd keepalived*
Xây dựng và cài đặt daemon bằng lệnh :
- ./configure
- make
- sudo make install
Daemon bây giờ sẽ được cài đặt trên hệ thống.
Tạo tập lệnh khởi động Keepalived
Bản cài đặt keepalived
đã di chuyển tất cả các file binary và file hỗ trợ vào vị trí trên hệ thống của ta . Tuy nhiên, một phần không được bao gồm là tập lệnh Khởi động cho hệ thống Ubuntu 14.04 của ta .
Ta có thể tạo ra một kịch bản Upstart rất đơn giản mà có thể xử lý ta keepalived
dịch vụ. Mở một file có tên keepalived.conf
trong folder /etc/init
để bắt đầu:
- sudo nano /etc/init/keepalived.conf
Bên trong, ta có thể bắt đầu với một mô tả đơn giản về chức năng mà keepalived
cung cấp. Ta sẽ sử dụng mô tả từ trang man
bao gồm. Tiếp theo, ta sẽ chỉ định các runlevel mà dịch vụ sẽ được bắt đầu và dừng lại. Ta muốn dịch vụ này hoạt động trong mọi điều kiện bình thường (cấp độ 2-5) và bị dừng đối với tất cả các cấp độ chạy khác (ví dụ: khi khởi động lại, khởi động máy hoặc chế độ một user ):
description "load-balancing and high-availability service" start on runlevel [2345] stop on runlevel [!2345]
Vì dịch vụ này không thể thiếu đảm bảo dịch vụ web của ta vẫn khả dụng, ta muốn khởi động lại dịch vụ này trong trường hợp không thành công. Sau đó ta có thể xác định thực tế exec
dòng đó sẽ bắt đầu dịch vụ. Ta cần thêm tùy chọn --dont-fork
để Upstart có thể theo dõi pid
một cách chính xác:
description "load-balancing and high-availability service" start on runlevel [2345] stop on runlevel [!2345] respawn exec /usr/local/sbin/keepalived --dont-fork
Lưu và đóng các file khi bạn hoàn tất.
Tạo file cấu hình Keepalived
Với file Upstart của ta tại chỗ, bây giờ ta có thể chuyển sang cấu hình keepalived
.
Dịch vụ tìm kiếm các file cấu hình của nó trong folder /etc/keepalived
. Tạo folder đó ngay bây giờ trên cả hai server của bạn:
- sudo mkdir -p /etc/keepalived
Thu thập địa chỉ IP riêng của Server của bạn
Trước khi tạo file cấu hình, ta cần tìm địa chỉ IP riêng của cả hai server của ta . Trên server DigitalOcean, bạn có thể lấy địa chỉ IP riêng của ta thông qua dịch vụ metadata bằng lệnh :
- curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo
Output10.132.7.107
Điều này cũng có thể được tìm thấy với các công cụ iproute2
bằng lệnh :
- ip -4 addr show dev eth1
Giá trị bạn đang tìm kiếm sẽ được tìm thấy ở đây:
Output3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 10.132.7.107/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever
Sao chép giá trị này từ cả hai hệ thống của bạn. Ta cần tham chiếu các địa chỉ này bên trong file cấu hình của ta bên dưới.
Tạo cấu hình server chính
Tiếp theo, trên server chính của bạn, hãy tạo file cấu hình keepalived
chính. Daemon tìm kiếm một file có tên keepalived.conf
bên trong folder /etc/keepalived
:
- sudo nano /etc/keepalived/keepalived.conf
Bên trong, ta sẽ bắt đầu bằng cách xác định kiểm tra sức khỏe cho dịch vụ Nginx của ta bằng cách mở khối vrrp_script
. Điều này sẽ cho phép keepalived
giám sát web server của ta xem có lỗi gì không để nó có thể báo hiệu rằng quá trình đang gặp sự cố và bắt đầu các biện pháp khôi phục.
Kiểm tra của ta sẽ rất đơn giản. Cứ sau hai giây, ta sẽ kiểm tra xem quá trình có tên nginx
vẫn đang xác nhận pid
:
vrrp_script chk_nginx { script "pidof nginx" interval 2 }
Tiếp theo, ta sẽ mở một khối có tên vrrp_instance
. Đây là phần cấu hình chính xác định cách thức mà keepalived
sẽ triển khai tính khả dụng cao.
Ta sẽ bắt đầu bằng cách yêu cầu keepalived
giao tiếp với các đồng nghiệp của nó qua eth1
, giao diện riêng tư của ta . Vì ta đang cấu hình server chính của bạn , ta sẽ đặt cấu hình state
thành “MASTER”. Đây là giá trị ban đầu mà keepalived
sẽ sử dụng cho đến khi daemon có thể liên hệ với đồng nghiệp của nó và tổ chức một cuộc bầu cử.
Trong cuộc bầu cử, tùy chọn priority
được sử dụng để quyết định thành viên nào được bầu. Quyết định chỉ đơn giản dựa trên server nào có số lượng cao nhất cho cài đặt này. Ta sẽ sử dụng “200” cho server chính của bạn :
vrrp_script chk_nginx { script "pidof nginx" interval 2 } vrrp_instance VI_1 { interface eth1 state MASTER priority 200 }
Tiếp theo, ta sẽ chỉ định một ID cho group cụm này sẽ được chia sẻ bởi cả hai nút. Ta sẽ sử dụng “33” cho ví dụ này. Ta cần đặt unicast_src_ip
thành địa chỉ IP riêng của server chính mà ta đã truy xuất trước đó. Ta sẽ đặt unicast_peer
thành địa chỉ IP riêng của server phụ của ta :
vrrp_script chk_nginx { script "pidof nginx" interval 2 } vrrp_instance VI_1 { interface eth1 state MASTER priority 200 virtual_router_id 33 unicast_src_ip primary_private_IP unicast_peer { secondary_private_IP } }
Tiếp theo, ta có thể cài đặt một số chứng thực đơn giản cho ta keepalived
daemon để giao tiếp với nhau. Đây chỉ là một biện pháp cơ bản đảm bảo rằng các server được đề cập là hợp lệ . Tạo một khối phụ authentication
. Bên trong, chỉ định xác thực password bằng cách đặt auth_type
. Đối với thông số auth_pass
, hãy đặt bí mật được chia sẻ sẽ được cả hai nút sử dụng. Thật không may, chỉ có tám ký tự đầu tiên là quan trọng:
vrrp_script chk_nginx { script "pidof nginx" interval 2 } vrrp_instance VI_1 { interface eth1 state MASTER priority 200 virtual_router_id 33 unicast_src_ip primary_private_IP unicast_peer { secondary_private_IP } authentication { auth_type PASS auth_pass password } }
Tiếp theo, ta sẽ yêu cầu keepalived
sử dụng quy trình mà ta đã tạo ở đầu file , có nhãn chk_nginx
, để xác định tình trạng của hệ thống local . Cuối cùng, ta sẽ cài đặt một tập notify_master
, được thực thi khi nào nút này trở thành "chủ" của cặp. Tập lệnh này sẽ chịu trách nhiệm kích hoạt việc gán lại địa chỉ IP nổi. Ta sẽ tạo tập lệnh này trong giây lát:
vrrp_script chk_nginx { script "pidof nginx" interval 2 } vrrp_instance VI_1 { interface eth1 state MASTER priority 200 virtual_router_id 33 unicast_src_ip primary_private_IP unicast_peer { secondary_private_IP } authentication { auth_type PASS auth_pass password } track_script { chk_nginx } notify_master /etc/keepalived/master.sh }
Khi bạn đã cài đặt thông tin ở trên, hãy lưu file .
Tạo cấu hình của server phụ
Tiếp theo, ta sẽ tạo tập lệnh đồng hành trên server phụ của ta . Mở file tại /etc/keepalived/keepalived.conf
trên server phụ của bạn:
- sudo nano /etc/keepalived/keepalived.conf
Bên trong, tập lệnh mà ta sẽ sử dụng phần lớn sẽ tương đương với tập lệnh của server chính. Các mục mà ta cần thay đổi là:
-
state
: Điều này sẽ được thay đổi thành “DỰ PHÒNG” trên server phụ để nút khởi tạo sang trạng thái dự phòng trước khi cuộc bầu cử diễn ra. -
priority
: Giá trị này phải được đặt thành giá trị thấp hơn server chính. Ta sẽ sử dụng giá trị “100” trong hướng dẫn này. -
unicast_src_ip
: Đây phải là địa chỉ IP riêng của server phụ . -
unicast_peer
: Cái này phải chứa địa chỉ IP riêng của server chính .
Khi bạn thay đổi các giá trị đó, tập lệnh cho server phụ sẽ giống như sau:
vrrp_script chk_nginx { script "pidof nginx" interval 2 } vrrp_instance VI_1 { interface eth1 state BACKUP priority 100 virtual_router_id 33 unicast_src_ip secondary_private_IP unicast_peer { primary_private_IP } authentication { auth_type PASS auth_pass password } track_script { chk_nginx } notify_master /etc/keepalived/master.sh }
Khi bạn đã nhập tập lệnh và thay đổi các giá trị thích hợp, hãy lưu file .
Tạo Tập lệnh chuyển đổi IP nổi
Tiếp theo, ta cần tạo một cặp script mà ta có thể sử dụng để gán lại địa chỉ IP nổi cho Server hiện tại khi nào cá thể keepalived
local trở thành server chính.
Download Tập lệnh gán IP nổi
Đầu tiên, ta sẽ download một tập lệnh Python chung (do người quản lý cộng đồng DigitalOcean viết ) được dùng để gán lại địa chỉ IP nổi cho Server bằng cách sử dụng API DigitalOcean. Ta nên tải file này xuống folder /usr/local/bin
:
- cd /usr/local/bin
- sudo curl -LO http://do.co/assign-ip
Tập lệnh này cho phép bạn gán lại một IP nổi hiện có bằng lệnh:
- python /usr/local/bin/assign-ip floating_ip server_ID
Điều này sẽ chỉ hoạt động nếu bạn đã đặt biến môi trường có tên DO_TOKEN
thành mã thông báo API DigitalOcean hợp lệ cho account của bạn .
Tạo mã thông báo API DigitalOcean
Để sử dụng tập lệnh ở trên, ta cần tạo mã thông báo API DigitalOcean trong account của bạn .
Trong console , nhấp vào liên kết "API" ở trên cùng. Ở phía bên phải của trang API, hãy nhấp vào “Tạo mã thông báo mới”:
Trên trang tiếp theo, chọn tên cho mã thông báo của bạn và nhấp vào nút “Tạo mã thông báo”:
Trên trang API, mã thông báo mới của bạn sẽ được hiển thị:
Sao chép mã thông báo ngay bây giờ . Vì mục đích bảo mật, không có cách nào để hiển thị lại mã thông báo này sau đó. Nếu bạn mất mã thông báo này, bạn sẽ phải xóa nó và tạo một mã khác.
Cấu hình IP nổi cho Cơ sở hạ tầng của bạn
Tiếp theo, ta sẽ tạo và gán một địa chỉ IP nổi để sử dụng cho các server của bạn .
Trong console DigitalOcean, nhấp vào tab “Mạng” và chọn mục chuyển “IP nổi”. Chọn Server từ danh sách mà bạn đã chỉ định làm server “chính” của bạn :
Một địa chỉ IP nổi mới sẽ được tạo trong account của bạn và được gán cho Server được chỉ định:
Nếu bạn truy cập IP nổi trong trình duyệt web của bạn , bạn sẽ thấy trang index.html
server "chính":
Sao chép địa chỉ IP nổi xuống. Bạn cần giá trị này trong script bên dưới.
Tạo tập lệnh gói
Bây giờ, ta có các mục ta cần để tạo tập lệnh shell bọc sẽ gọi tập lệnh /usr/local/bin/assign-ip
của ta với thông tin xác thực chính xác.
Tạo file ngay bây giờ trên cả hai server bằng lệnh :
- sudo nano /etc/keepalived/master.sh
Bên trong, hãy bắt đầu bằng cách gán và xuất một biến có tên DO_TOKEN
chứa mã thông báo API bạn vừa tạo. Dưới đó, ta có thể chỉ định một biến có tên IP
giữ địa chỉ IP nổi của bạn:
export DO_TOKEN='digitalocean_api_token' IP='floating_ip_addr'
Tiếp theo, ta sẽ sử dụng curl
để yêu cầu dịch vụ metadata cho ID server của server mà ta hiện đang sử dụng. Điều này sẽ được gán cho một biến được gọi là ID
. Ta cũng sẽ hỏi liệu Server này hiện có địa chỉ IP nổi được gán cho nó hay không. Ta sẽ lưu trữ kết quả của yêu cầu đó trong một biến có tên HAS_FLOATING_IP
:
export DO_TOKEN='digitalocean_api_token' IP='floating_ip_addr' ID=$(curl -s http://169.254.169.254/metadata/v1/id) HAS_FLOATING_IP=$(curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/active)
Bây giờ, ta có thể sử dụng các biến ở trên để gọi tập lệnh assign-ip
. Ta sẽ chỉ gọi tập lệnh nếu IP nổi chưa được liên kết với Server của ta . Điều này sẽ giúp giảm thiểu các lệnh gọi API và sẽ giúp ngăn chặn các yêu cầu xung đột đối với API trong trường hợp trạng thái chính chuyển đổi nhanh chóng giữa các server của bạn.
Để xử lý các trường hợp IP nổi đã có một sự kiện đang diễn ra, ta sẽ thử lại tập lệnh assign-ip
một vài lần. Dưới đây, ta cố gắng chạy tập lệnh 10 lần, với khoảng cách 3 giây giữa mỗi lần gọi. Vòng lặp sẽ kết thúc ngay lập tức nếu di chuyển IP nổi thành công:
export DO_TOKEN='digitalocean_api_token' IP='floating_ip_addr' ID=$(curl -s http://169.254.169.254/metadata/v1/id) HAS_FLOATING_IP=$(curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/active) if [ $HAS_FLOATING_IP = "false" ]; then n=0 while [ $n -lt 10 ] do python /usr/local/bin/assign-ip $IP $ID && break n=$((n+1)) sleep 3 done fi
Lưu file khi bạn hoàn tất.
Bây giờ, ta chỉ cần làm cho tập lệnh có thể thực thi để keepalived
có thể gọi nó:
- sudo chmod +x /etc/keepalived/master.sh
Khởi động dịch vụ Keepalived và thử nghiệm chuyển đổi dự phòng
Daemon keepalived
và tất cả các tập lệnh đồng hành của nó bây giờ sẽ được cấu hình hoàn chỉnh. Ta có thể bắt đầu dịch vụ trên cả hai máy của bạn bằng lệnh :
- sudo start keepalived
Dịch vụ sẽ khởi động trên mỗi server và liên hệ với đồng đẳng của nó, xác thực bằng bí mật được chia sẻ mà ta đã cấu hình . Mỗi daemon sẽ giám sát quá trình Nginx local , và sẽ lắng nghe tín hiệu từ điều khiển từ xa keepalived
quá trình.
Khi cả hai server đều hoạt động tốt, nếu bạn truy cập IP nổi của bạn trong trình duyệt web, bạn sẽ được đưa đến trang Nginx của server chính:
Bây giờ, ta đã sẵn sàng để kiểm tra khả năng chuyển đổi dự phòng của cấu hình của ta .
Chuyển đổi dự phòng sẽ xảy ra khi một trong các điều kiện sau xảy ra:
- Khi kiểm tra tình trạng Nginx trên server chính cho biết rằng Nginx không còn chạy nữa. Trong trường hợp này, server chính của
keepalived
daemon sẽ bước vào “lỗi” nhà nước. Nó sẽ thông báo cho server phụ rằng nó sẽ chuyển sang trạng thái chính và xác nhận IP nổi. - Khi server thứ cấp mất nó
keepalived
kết nối với server chính. Nếu server phụ không thể truy cập server chính vì bất kỳ lý do gì, nó sẽ chuyển sang trạng thái “chính” và cố gắng xác nhận IP nổi.
Nếu sau đó server chính phục hồi, nó sẽ chuyển trở lại trạng thái chính và lấy lại IP nổi vì nó sẽ bắt đầu một cuộc bầu cử mới (nó vẫn sẽ có số ưu tiên cao nhất).
Thử nghiệm Nginx thất bại
Ta có thể kiểm tra điều kiện đầu tiên bằng cách dừng dịch vụ Nginx trên server chính:
- sudo service nginx stop
Nếu bạn làm mới trình duyệt web của bạn , ban đầu bạn có thể nhận được phản hồi cho biết rằng trang không khả dụng:
Tuy nhiên, chỉ sau vài giây, nếu bạn làm mới trang một vài lần, bạn sẽ thấy rằng server phụ đã xác nhận địa chỉ IP nổi:
Ta có thể khôi phục sau lỗi bằng cách khởi động lại daemon Nginx trên server chính:
- sudo service nginx start
Sau một vài giây, nếu bạn làm mới trang, bạn sẽ thấy rằng server chính đã đòi lại quyền sở hữu IP nổi :
Đang kiểm tra lỗi server
Tình huống khác mà ta nên kiểm tra là liệu máy phụ có chuyển đổi chính xác sang trạng thái chính hay không nếu nó không thể kết nối với server chính. Ta có thể khởi động lại server chính để kiểm tra điều này:
- sudo reboot
, trước tiên, ta sẽ thấy sự gián đoạn dịch vụ ở địa chỉ IP nổi:
Một vài giây sau, server phụ sẽ nhận các yêu cầu:
Một lúc sau, khi server chính khởi động lại xong, nó sẽ lấy lại địa chỉ IP:
Điều này xác minh kịch bản thất bại thứ hai của ta .
Kết luận
Trong hướng dẫn này, ta đã cấu hình môi trường web server có tính khả dụng cao bằng cách sử dụng keepalived
, API DigitalOcean và địa chỉ IP nổi. Cơ sở hạ tầng thực tế khá đơn giản, nhưng các khái niệm này có thể được áp dụng cho bất kỳ loại cơ sở hạ tầng nào mà tính khả dụng của dịch vụ và thời gian hoạt động là quan trọng.
Các tin liên quan
Xây dựng cho Sản xuất: Ứng dụng Web - Tổng quan2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Giám sát
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - backup
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Triển khai
2015-06-01
Xây dựng cho sản xuất: Ứng dụng web - Ghi log tập trung
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Lập kế hoạch khôi phục
2015-06-01
Cách cài đặt control panel lưu trữ web Sentora trên Ubuntu 14.04
2015-04-27
Cách cài đặt web server OpenLiteSpeed trên CentOS 7
2015-04-16
Cách cài đặt web server OpenLiteSpeed trên Ubuntu 14.04
2015-04-15
Cách cài đặt Bacula-Web trên Ubuntu 14.04
2015-04-03