最原始的服務部署,為單點部署,即直接把服務部署在一個伺服器上。如果伺服器出現故障,或者服務因為某個異常而掛掉,則服務就會發生中斷。單點部署出現故障的概率最高。 後來,出現了網關,比如 nginx kong 等。如下圖所示: 這樣,所有客戶請求都會經過網關,再由網關轉發到各個服務。如果由服務出現故障, ...
最原始的服務部署,為單點部署,即直接把服務部署在一個伺服器上。如果伺服器出現故障,或者服務因為某個異常而掛掉,則服務就會發生中斷。單點部署出現故障的概率最高。
後來,出現了網關,比如 nginx kong 等。如下圖所示:
這樣,所有客戶請求都會經過網關,再由網關轉發到各個服務。如果由服務出現故障,則網關會自動跳過故障服務,把請求分發到可用服務。因為網關只是起到服務轉發的功能,所以網關出現故障的概率比應用出現故障的概率低很多。
http
{
upstream myserver {
server 192.168.12.181:80 weight=3 max_fails=3 fail_timeout=20s;
server 192.168.12.182:80 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.12.183:80 weight=4 max_fails=3 fail_timeout=20s;
}
server
{
listen 80;
server_name www.domain.com 192.168.12.189;
index index.htm index.html;
root /ixdba/web/wwwroot;
location / {
proxy_pass http://myserver;
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
include /opt/nginx/conf/proxy.conf;
}
}
}
但是,網關並非會永遠不宕機,如果遭遇入侵,或者機房斷電。網關服務出現故障,則不管下麵的應用服務部署了多少個都沒用。
於是就出現了第三種集群。如下圖所示,藉助keeplived部署2個以上的nginx 網關。這樣網關出現故障導致服務中斷的機率將大大降低。
這裡主從nginx服務的配置是一樣的。
3.keepalive的配置:/etc/keepalived/keepalivec.conf
主節點(Master節點配置)
(1)修改/etc/keepalived/keepalivec.conf 配置文件
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
#當前主機ip
smtp_server 192.168.17.129
smtp_connect_timeout 30
# 重點1:通過它,可以訪問到主機,在hosts文件中,要做映射關係,類似於 127.0.0.1 LVS_DEVEL,host文件路徑:/etc/hosts
router_id LVS_DEVEL
}
#重點2:檢測腳本,目的是定時執行,檢測nginx的狀態,如果掛了嘗試重啟,如果啟動失敗,則停止該節點的nginx和keepaive
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 執行腳本所在的位置,自定義腳本後面會提及
interval 2 #檢測腳本執行的間隔,單位秒,每個2秒執行一次腳本
weight 2 #腳本執行滿足,權重加2,這裡其實沒搞明白..
}
#重點3:主備節點的區別配置
vrrp_instance VI_1 {
state MASTER # 備份伺服器上將 MASTER 改為 BACKUP
interface ens33 # 綁定的網卡,通過ipconfig查看
virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同
priority 100 # 主、備機取不同的優先順序,主機值較大,備份機值較小(比如主機100,備機90)
advert_int 1 #每隔一秒發送一次心跳,確保從伺服器(keepalive)是否還活著
authentication { # 心跳檢測需要的密碼
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 # VRRP H 虛擬地址(重點:虛擬ip配置,客戶端通過該ip進行訪問,主節點和備用節點誰占有這個ip,誰提供反向代理服務)
}
}
(2)在/usr/local/src 添加檢測腳本nginx_check.sh,檢查Nginx是否還活著
#!/bin/bash
#查看ningx的進程號,並統計數量
A=`ps -C nginx –no-header |wc -l`
#等於0時,即nginx掛了,嘗試重啟
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #Nginx啟動命令的位置
sleep 2
#啟動失敗,殺掉keepalive
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi