物聯網上行數據實現tcp 負載均衡和高可用架構 nginx + keepalived方案

需求介紹

之前有做過一個物聯網設備接入的項目,項目中會啓動一個數據接入服務(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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章