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.45
和172.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.45
和172.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.43
和172.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掉後,keepalive
將vip
分配給了nginx的backup
,nginx的backup繼續運行,通過nginx的負載均衡使得多臺日誌採集器同步運行。