一、什么是高可用?
nginx做負載均衡,能達到分發請求的目的,但是不能很好的避免單點故障。
1、nginx集群單點問題
- 分發器宕機怎么處理?
假如nginx服務器掛掉了,那么所有的服務也會跟着癱瘓 。
一種方法是人為監控,發現主分發器宕機后,立馬登錄備分發器,並給它分配虛ip。
另一種辦法是用軟件來替代人來監控,自動登錄備分發器,分配虛ip。 - 數據服務器宕機怎么處理?
分發器可以自動判斷數據服務器的存活狀態,不對宕機服務器要數據。
2、Keepalived介紹
Keepalived的作用是檢測服務器的狀態,如果有一台web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使 其他服務器代替該服務器的工作,當服務器工作正常后Keepalived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。
總結來說:Keepalived軟件是一個監控+自愈的軟件。
運行協議是VRRP,主分發器的keepalived會向網絡中發組播,宣告自己還活着,組播地址:224.0.0.18。
$ tcpdump -nn -vvv -i ens33 vrrp #查看組播的包
192.168.31.40 > 224.0.0.18: vrrp 192.168.31.40 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20, addrs: 192.168.31.213 auth "1111^¥##"
輸出解析:192.168.31.40是master,目標地址是224.0.0.18,使用的協議是VRRPv2版本,虛擬id是51,優先級是100,簡單驗證類型,一秒發一次,長度20字節,虛Ip是192.168.31.213, 驗證的密碼是111#$Z%#
二、keepalived安裝管理
1、keepalived下載
keepalived官網下載地址
linux下載keepalived軟件:
$ wget http://www.keepalived.org/software/keepalived-2.0.8.tar.gz
2、keepalived安裝
使用如下shell腳本keepalived_instll.sh安裝keepalived軟件。
$ sh keepalived_install.sh
#keepalived安裝腳本
#!/bin/bash
pkg=keepalived-2.0.8.tar.gz tar xf $pkg
yum -y install kernel-devel
ln -s /usr/src/kernels/3.10.0-862.14.4.el7.x86_64/ /usr/src/linux
cd keepalived-2.0.8/
yum install openssl-* -y
./configure --prefix=/usr/local/keepalived
make
make install
mkdir -pv /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
3、啟動keepalived
$ systemctl start keepalived
三、構建高可用集群
1、試驗環境准備
主機名 | IP | 角色 | 系統 | 配置 | 軟件 |
---|---|---|---|---|---|
Master.ayitula.com | 192.168.31.40 | 主分發器 | centos7.5 | 2核4G | Nginx+keepalived |
Backup.ayitula.com | 192.168.31.41 | 備分發器 | centos7.5 | 2核4G | Nginx+keepalived |
Web01.ayitula.com | 192.168.31.42 | 數據服務器1 | centos7.5 | 2核4G | Nginx |
Web02.ayitula.com | 192.168.31.43 | 數據服務器2 | centos7.5 | 2核4G | Nginx |
2、軟件環境部署步驟
1)分發器:nginx+keepalived
2)數據服務器:Nginx
3)配置Nginx分發器
4)配置數據服務器頁面(web01 web02)
5)配置keepalived.conf
6)測試
3、配置Nginx集群
upstream web {
server 192.168.31.42 max_fails=2 fail_timeout=3; # 超時時間3秒內失敗2次認為服務器死了
server 192.168.31.43 max_fails=2 fail_timeout=3;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
4、配置keepalived
(1)主分發器keepalived
! Configuration File for keepalived
global_defs {
router_id NGINX_DEVEL
}
vrrp_script check_nginx { # 定義一個腳本
script "/etc/keepalived/nginx_pid.sh" # 腳本路徑
interval 2 # 探針,此處是每兩秒執行一次腳本
fall 1 # 失敗次數 1
}
vrrp_instance nginx { # 定義名為nginx實例
state MASTER # 主機狀態
interface ens33 # 網卡
mcast_src_ip 192.168.31.40 # 發組播
virtual_router_id 51 # 虛擬id
priority 100 # 優先級
advert_int 1 # 探針,一秒發一次組播
authentication {
auth_type PASS
auth_pass 1111 # 密碼
}
track_script {
check_nginx
}
virtual_ipaddress { # 虛ip
192.168.31.213/24
}
}
(2)備分發器keepalived
#cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id NGINX_DEVEL
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_pid.sh"
interval 2
fall 1
}
vrrp_instance nginx {
state BACKUP
interface ens33
mcast_src_ip 192.168.31.41
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.31.213/24
}
}
5、編寫關聯腳本nginx_pid.sh
#!/bin/bash
nginx_kp_check () {
nginxpid=`ps -C nginx --no-header |wc -l`
if [ $nginxpid -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 1
nginxpid=`ps -C nginx --no-header |wc -l`
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
}
nginx_kp_check
腳本原理:該腳本檢查nginx進程是否存在,如果進程沒了,說明分發器掛了,嘗試啟動分發器,1秒后檢查分發器啟動沒有,如果沒有啟動直接關閉keepalived,停止發組播,備就自動開始工作了。
四、故障測試
1、分發器宕機測試
分發器由keepalived來管理
$ watch -n1 killall nginx # 每隔一秒殺死一次所有nginx
2、數據服務器宕機測試
數據服務器則由nginx來管理。使用如下兩個參數就可實現對數據服務器管理:
- max_fails
允許請求失敗的次數默認為1,當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤; - fail_timeout
失敗超時時間,在連接Server時,如果在超時時間之內超過max_fails指定的失敗次數,會認為在fail_timeout時間內Server不可用,默認為10s
upstream web {
server 192.168.31.42 max_fails=2 fail_timeout=3; # 超時時間3秒內失敗2次認為服務器死了
server 192.168.31.43 max_fails=2 fail_timeout=3;
}