使用keepalive+nginx實現高併發高可靠性的企業級日誌採集架構

nginx+keepalive實現企業級日誌採集架構多采集端共用vip

實現技術:

  • nginx
  • keepalive

組織架構邏輯:

通過nginx代理轉發實現單點任務分發給多臺日誌採集器,但是爲防止nginx宕機導致所有采集任務終止,需要架設兩臺或者兩臺以上的nginx服務器實現nginx主副架構,通過keepalive實現nginx主副架構之間共用虛擬ip。具體如下圖所示:
在這裏插入圖片描述

安裝nginx和keepalived

安裝nginx需要配置yum源,或者可以在測試環境中下載好對應的rpm包後再拷貝安裝

rpm包下載命令如下:

# yum install -y --downloadonly --downloaddir=/<path> <package-name>

nginx

# yum install -y nginx

啓動nginx可能需要關閉selinux

編輯/etc/selinux/config,將SELINUX=enforcing改爲SELINUX=disabled,並重啓系統。

keepalive

# yum install -y keepalived

配置

配置keepalive

編輯/etc/keepalived/keepalived.conf,內容如下:

! Configuration File for keepalived
vrrp_instance VI_1 {
	state BACKUP    #(主機爲MASTER,備用機爲BACKUP)
	interface ens33  #(HA監測網絡接口)
	virtual_router_id 61 #(主、備機的virtual_router_id必須相同)
	priority 80 #(主、備機取不同的優先級,主機值較大,備份機值較小,值越大優
先級越高)
	advert_int 1 #(VRRP Multicast廣播週期秒數)
	authentication {
		auth_type PASS #(VRRP認證方式)
		auth_pass 1234 #(密碼)
	}
	track_script {
		Monitor_Nginx #(調用nginx進程檢測腳本)
	}
	virtual_ipaddress {
		172.16.2.100 #(VRRP HA虛擬地址)
	}
}

# 監控nginx進程的80端口,若端口down掉,則運行/etc/keepalived/notifydown.sh腳本
virtual_server 172.16.2.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 172.16.2.45 80 {
        weight 1
        notify_down /etc/keepalived/notifydown.sh
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

/etc/keepalived/notifydown.sh腳本內容爲:

systemctl stop keepalived

以上的172.16.2.100爲虛擬ip,重啓keepalive

# systemctl restart keepalived

配置nginx

編輯/etc/nginx/nginx.conf,部分內容如下:

stream{
	upstream hello {
		server 172.16.2.45:8888;
		server 172.16.2.46:8888;
	}
	server {
		listen 0.0.0.0:8888 udp;
		#proxy_responses 1;
		#proxy_timeout 20s;
		proxy_pass hello;
	}

}

以上172.16.2.45172.16.2.46分別爲兩臺日誌採集器,重啓nginx

以上nginx安裝和配置無法實現真正的負載均衡,即如果有一個採集端down掉,nginx沒有辦法發現,依舊會將信息轉發給該採集端,查了下官網,需要在upstream中添加check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;用於檢測nginx轉發端的tcp存活性。但是對於udp協議,nginx無法監控其存活性。那麼如果我們要做udp的負載均衡轉發,需要怎麼做呢?
查了下資料發現,需要安裝nginx-plus,可點擊這裏查看官網,但是nginx-plus是收費的,而且一年的費用也不低。如果想免費使用nginx實現udp負載均衡轉發,可參考我的另一篇博客《nginx高級用法——nginx實現udp負載均衡》查看具體的解決方法。

# systemctl restart nginx

測試

日誌採集端

編寫python腳本server.py放置在172.16.2.45172.16.2.46用於模擬兩臺日誌採集器,代碼如下:

import socket

listen_host = '0.0.0.0'
listen_port = 8888
address = (listen_host, listen_port)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(address)

while True:
    data, addr = s.recvfrom(2048)
    if not data:
        print "there is a none data"
        break
    print "received content: ", data

s.close()

日誌發送端

編寫python腳本client.py放置在172.16.2.43172.16.2.44用於模擬兩臺日誌發送設備,代碼如下:

import socket
import time
import threadpool

send_host = '172.16.2.100'
send_port = 8888
sleep_sec = 1

hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
address = (send_host, send_port)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

def hello(num):
	print num
	msg = local_ip + ' %s ' % num + str(time.localtime())
	s.sendto(msg, address)

pool = threadpool.ThreadPool(40)
func_var = [x for x in range(100000)]
requests = threadpool.makeRequests(hello, func_var)
[pool.putRequest(req) for req in requests]
pool.wait()

s.close()

run測試腳本

在日誌採集端運行server.py腳本

# python server.py

在日誌發送端運行client.py腳本

# python client.py

client.py運行過程中,將nginx的主副架構中的master斷開連接或者down掉,檢查server.py端是否能夠繼續監聽日誌。

測試效果

client.py運行的過程中,down掉nginx的master,發現兩臺server.py均能夠繼續監聽日誌,說明nginx的master意外down掉後,keepalivevip分配給了nginx的backup,nginx的backup繼續運行,通過nginx的負載均衡使得多臺日誌採集器同步運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章