需求介紹
之前有做過一個物聯網設備接入的項目,項目中會啓動一個數據接入服務(TCP server)用來接收傳感器設備上傳的數據。
數據接入服務需要分佈式部署,且要實現設備上行連接能夠負載均衡到各臺服務節點,且需要保證數據接入服務的高可用性。
架構設計
keepalived 的功能:暴露一個虛擬IP 即VIP, 檢測nginx 進程狀態,映射VIP 到一個可用的nginx 服務上。
用nginx 來實現負載均衡,將上行數據連接均衡到三個數據接入服務上。
具體配置
nginx 配置
三臺機器nginx 配置文件一樣,如下:
#user nobody;
worker_processes 1;
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
stream{
upstream iot{
# 輪詢規則
server 172.18.100.86:10000 weight=1;
server 172.18.100.87:10000 weight=1;
server 172.18.100.88:10000 weight=1;
}
server{
listen 10000;
proxy_pass iot;
}
}
keepalived 配置
主機172.18.100.86 配置:
global_defs {
router_id lb01 # 設置nginx master 的id, 每臺機器上的不一樣
}
vrrp_script check_nginx {
script "/usr/local/soft/check_nginx_pid.sh"
interval 2 #(檢測腳本執行的間隔,單位是秒)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived 的角色,MASTER 爲主,BACKUP 爲備
interface ens192 # 當前進行通訊的網卡
virtual_router_id 51 # 虛擬路由編號,主從要一致
priority 150 # 優先級,數值越大,獲取請求的優先級越高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 調用檢測腳本
track_script{
check_nginx
}
virtual_ipaddress {
172.18.100.89
}
}
從機配置:
global_defs {
router_id lb02 # 設置nginx master 的id, 每臺機器上的不一樣
}
vrrp_script check_nginx {
script "/usr/local/soft/check_nginx_pid.sh"
interval 2 #(檢測腳本執行的間隔,單位是秒)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 指定keepalived 的角色,MASTER 爲主,BACKUP 爲備
interface ens192 # 當前進行通訊的網卡
virtual_router_id 51 # 虛擬路由編號,主從要一致
priority 100 # 優先級,數值越大,獲取請求的優先級越高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 調用檢測腳本
track_script{
check_nginx
}
virtual_ipaddress {
172.18.100.89
}
}
檢查nginx 進程的腳本check_nginx_pid.sh:
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #重啓nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重啓失敗
exit 1
else
exit 0
fi
else
exit 0
fi