logstash+redis收集負載均衡模式下多台服務器的多個web日志


一、logstash的簡介



一般我們看日志來解決問題的時候要么 tail+grep 要么 把日志下載下來再搜索,可以應付不多
的主機和應用不多的部署場景。但對於多機多應用部署就不合適了。這里的多機多應用指的是
同一種應用程序被部署到幾台服務器上,每台服務器上又部署着不同的多個應用程序。可以想
象,在這種場景下,為了監控或者搜索某段日志,需要登陸多台服務器,執行多個tail -F和grep
命令來分析日志。一方面這很被動。另一方面,效率非常低,數次操作下來,程序員的心情也
會變糟,所以就有了logstash的出現。

logstash 是解決分布式系統的日志問題管理的一種工具。其基本原理是后台跑着一個logstash的
程序,這個程序負責匯總所有日志到一個本地文件中。只要執行tail -f這個文件就可以做到監控
多台應用服務的日志了。因為所有日志都匯總在一個目標文件里了,所以做日志搜索的時候只要針
對這一個文件搜索就可以了

 下面我們來講一下logstash+redis是如何實現多服務器且每台服務器多應用日志收集到日志服務器的

logstash+redis的這種方式其實和els+kabina+logstash的作用差不多,只不過第二種方式多了個可視

化日志的界面,但是第一種方式比較簡單,第二種方式比較有逼格一點

二、logstash部署架構


 

解釋術語:
Shipper:日志收集者。負責監控本地日志文件的變化,及時把日志文件的最新內容收集起來,輸出到Redis暫存。
Indexer:日志存儲者。負責從Redis接收日志,寫入到本地文件。
Broker :日志管理者。redis用來連接多個Shipper和多個Indexer。

 

三、開始搭建logstash+redis

 

 

服務器環境:
web1服務器             192.168.11.3
web2服務器             192.168.11.4
日志服務器               192.168.11.5      

logstash  在web1服務器 、 web2服務器 、日志服務器都要安裝

redis       為了取消你的多疑心里,redis咱就安裝在日志服務器好了(其實redis安裝在哪一台都可以)

角色划分:

web1服務器     logstash     

web2服務器     logstash

日志服務器      logstash 、redis(redis之前就已經在日志服務器安裝好了,我這里就不介紹redis的安裝了)redis的安裝請跳轉至https://www.cnblogs.com/ouyangfei/p/12091102.html

說明:三台服務器的logstash指的是logstash-7.4.2.tar.gz這個安裝包,這個包在三台服務器都要安裝

------------------------------------------------------------------------------------------------------------------------

web1服務器安裝:192.168.11.3

安裝Java :
下載JDK壓縮包。
tar -zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8 /usr/local/

配置JAVA_HOME環境變量
vim /etc/profile 下面的內容添加到文件的最后一行
export JAVA_HOME=/usr/local/jdk1.8
export PATH=${JAVA_HOME}/bin:$PATH

:wq 保存退出

java -version   查看java的版本信息並確認是否安裝成功

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

 

安裝Logstash :

官網下載Logstash的壓縮包。https://www.elastic.co/cn/downloads/past-releases#logstash
tar -zxvf logstash-7.4.2.tar.gz
mv logstash-7.4.2 /usr/local/
ln -s logstash-7.4.2 logstash 創建軟連接

完了之后咱先不着急啟動logstash,請接着往下看

 

現在我們收集web1服務器下某個應用服務的日志如 website.log website-error.log,咋們web應用服務主要就是收集這兩個日志

mkdir -p /etc/logstash/conf
cd /etc/logstash/conf
vim web-log.conf  創建website.log的logstash啟動配置文件,添加如下內容

input {
file {
path => [
"/wefintek/education/website/logs/website.log"  (這里填寫你需要收集的本服務器路徑下的web日志文件) 
]
type => "website-log"  (名字隨意取,但必須下面的保持一致)
}
}


output {
if [type] == "website-log" {
redis {
host => "192.168.11.5"                          redis主機IP地址
port => 7890                                         redis端口號
db => 12                                               redis的12號庫(如果你的redis是專門給logstash用的話,這里1-15號庫隨便填,但要和日志服務器的保持一致)
password => "Yang_20191118"               redis的密碼
data_type => "channel"                           會話模式,channel模式
key => "/wefintek/education/website/logs/website-log"              (key的名字隨便取但是要和日志服務器的input保持一致)
}
}
}

filter {
mutate {
replace => ["host", "192.168.11.3"]   按自定義的這種格式輸出到日志
}
}

:wq 保存退出

data_type的可選值有channel和list兩種。用過Redis的人知道,channel是Redis的發布/訂閱通信模式,而list是Redis的隊列數據結構。兩者都可以用來實現系統間有序的消息異步通信。channel相比list的好處是,解除了發布者和訂閱者之間的耦合。舉個例子,一個Indexer在持續讀取Redis中的記錄,現在想加入第二個Indexer,如果使用list,就會出現上一條記錄被第一個Indexer取走,而下一條記錄被第二個Indexer取走的情況,兩個Indexer之間產生了競爭,導致任何一方都沒有讀到完整的日志。channel就可以避免這種情況。這里Shipper角色的配置文件和下面將要提到的Indexer角色的配置文件中都使用了channel。

 


vim web-error.conf 創建website-error.log的logstash啟動配置文件,添加如下內容

input {
file {
path => [
"/wefintek/education/website/logs/website-error.log" 這里填寫你需要收集的本服務器路徑下的文件。
]
type => "website-error-log"
}
}


output {
if [type] == "website-error-log" {
redis {
host => "192.168.11.5"
port => 7890
db => 12
password => "Yang_20191118"
data_type => "channel"
key => "/wefintek/education/website/logs/website-error-log"   (key的名字隨便取但是要和日志服務器的input保持一致)
}
}
}

filter {
mutate {
replace => ["host", "192.168.11.3"] 按自定義的這種格式輸出到日志
}
}

:wq 保存退出

現在啟動配置文件website-log.conf和website-error.conf都准備好了,但是咱還是不要着急啟動

 

說明:啟動logstash之前需要更改下配置文件logstash.yml
vim /usr/local/logstash/config/logstash.yml
http.host: "127.0.0.1" 改為 http.host: "0.0.0.0" (127.0.0.1只能本地連接,0.0.0.0表示所有服務器都可以連接)
為了安全着想,可以在雲控制台的安全規則里面添加端口的授權IP(logstash的端口9600)

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

web2服務器:192.168.11.4

安裝Java :
下載JDK壓縮包。
tar -zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8 /usr/local/

配置JAVA_HOME環境變量
vim /etc/profile 下面的內容添加到文件的最后一行
export JAVA_HOME=/usr/local/jdk1.8
export PATH=${JAVA_HOME}/bin:$PATH

:wq 保存退出

java -version   查看java的版本信息並確認是否安裝成功

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

 

安裝Logstash :

官網下載Logstash的壓縮包。https://www.elastic.co/cn/downloads/past-releases#logstash
tar -zxvf logstash-7.4.2.tar.gz
mv logstash-7.4.2 /usr/local/
ln -s logstash-7.4.2 logstash 創建軟連接

完了之后咱先不着急啟動logstash,請接着往下看

 

現在我們收集web2服務器下的應用服務的日志 website.log website-error.log  (web1和web2部署的服務都是一模一樣的,用nginx做的負載均衡)

mkdir -p /etc/logstash/conf
cd /etc/logstash/conf
vim web-log.conf  創建website.log的logstash啟動配置文件,添加如下內容

input {
file {
path => [
"/wefintek/education/website/logs/website.log"  (這里填寫你需要收集的本服務器路徑下的web日志文件) 
]
type => "website-log"  (名字隨意取,但必須下面的保持一致)
}
}


output {
if [type] == "website-log" {
redis {
host => "192.168.11.5"                          redis主機IP地址
port => 7890                                         redis端口號
db => 12                                               redis的12號庫(如果你的redis是專門給logstash用的話,這里1-15號庫隨便填,但要和日志服務器的保持一致)
password => "Yang_20191118"               redis的密碼
data_type => "channel"                           會話模式,channel模式
key => "/wefintek/education/website/logs/website-log"              (key的名字隨便取但是要和日志服務器的input保持一致)
}
}
}

filter {
mutate {
replace => ["host", "192.168.11.4"]   按自定義的這種格式輸出到日志
}
}

:wq 保存退出

 

vim web-error.conf 創建website-error.log的logstash啟動配置文件,添加如下內容

input {
file {
path => [
"/wefintek/education/website/logs/website-error.log" 這里填寫你需要收集的本服務器路徑下的文件。
]
type => "website-error-log"
}
}


output {
if [type] == "website-error-log" {
redis {
host => "192.168.11.5"
port => 7890
db => 12
password => "Yang_20191118"
data_type => "channel"
key => "/wefintek/education/website/logs/website-error-log"   (key的名字隨便取但是要和日志服務器的input保持一致)
}
}
}

filter {
mutate {
replace => ["host", "192.168.11.4"] 按自定義的這種格式輸出到日志
}
}

:wq 保存退出

現在啟動配置文件website-log.conf和website-error.conf都准備好了,但是咱也不要着急啟動

說明:啟動logstash之前需要更改下配置文件logstash.yml
vim /usr/local/logstash/config/logstash.yml
http.host: "127.0.0.1" 改為 http.host: "0.0.0.0" (127.0.0.1只能本地連接,0.0.0.0表示所有服務器都可以連接)
為了安全着想,可以在雲控制台的安全規則里面添加端口的授權IP(logstash的端口9600)

--------------------------------------------------------------------------------------------------------------------------

 

日志服務器:192.168.11.5

安裝Java :
下載JDK壓縮包。
tar -zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8 /usr/local/

配置JAVA_HOME環境變量
vim /etc/profile 下面的內容添加到文件的最后一行
export JAVA_HOME=/usr/local/jdk1.8
export PATH=${JAVA_HOME}/bin:$PATH

:wq 保存退出

java -version   查看java的版本信息並確認是否安裝成功

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

 

安裝Logstash :

官網下載Logstash的壓縮包。https://www.elastic.co/cn/downloads/past-releases#logstash
tar -zxvf logstash-7.4.2.tar.gz
mv logstash-7.4.2 /usr/local/
ln -s logstash-7.4.2 logstash 創建軟連接

完了之后咱先不着急啟動logstash,請接着往下看



mkdir -p /etc/logstash/conf
cd /etc/logstash/conf
vim web-log.conf

input {
redis {
type => "website-log"
host => "192.168.11.5"
port => 7890
password => "Yang_20191118"
db => 12
data_type => "channel"
key => "/wefintek/education/website/logs/websitelog" 和web服務器配置的key保持一致
}
}

output {
if [type] == "website-log" {
file {
path => "/root/logs/website-log/website-%{+YYYY.MM.dd}.log" 將日志輸出到本服務器的規定目錄下並自帶日期
flush_interval => 0
}
}
}
:wq



vim web-error.conf

input {
redis {
type => "website-error-log" 
host => "192.168.11.5"
port => 7890
password => "Yang_20191118"
db => 12
data_type => "channel"
key => "/wefintek/education/website/logs/website-error-log" 和web服務器配置的key保持一致
}
}

output {
if [type] == "website-error-log" {
file {
path => "/root/logs/website-log/website-error-%{+YYYY.MM.dd}.log"
flush_interval => 0
}
}
}
:wq

現在啟動配置文件website-log.conf和website-error.conf都准備好了,但是咱也還是不要着急啟動

說明:啟動logstash之前需要更改下配置文件logstash.yml
vim /usr/local/logstash/config/logstash.yml
http.host: "127.0.0.1" 改為 http.host: "0.0.0.0" (127.0.0.1只能本地連接,0.0.0.0表示所有服務器都可以連接)
為了安全着想,可以在雲控制台的安全規則里面添加端口的授權IP(logstash的端口9600)

--------------------------------------------------------------------------------------------------------------------------------------------------------------

 

是時候該着急了,咋們總算能啟動logstash了

 

先在Web1服務器上啟動:


cd /root
mkdir logs
touch logs/logstash.log  (logstash的啟動是在當前終端上的,ctrl + C就停止logstash的進程了,所以創建日志文件以后台的方式啟動) 


vim logstart.sh 啟動腳本(logstash本身是沒有腳本的,一般都是手敲命令啟動,所以要創建腳本)

#!/bin/bash
a=`ps -elf | grep logstash | grep /usr/java/jdk1.8.0_121/bin/java | awk '{print $4}'`
if [ "$a" > "0" ]
then
echo "logstash is really running"
else
cd /usr/local/logstash
nohup /usr/local/logstash/bin/logstash -f /etc/logstash/conf &>/root/logs/logstash.log &
fi

:wq
chmod 755 logstart.sh

 

vim logstop.sh 停止腳本

#!/bin/bash
a=`ps -elf | grep logstash | grep /usr/java/jdk1.8.0_121/bin/java | awk '{print $4}'`
if [ $a > 0 ]
then kill -9 $a
else
echo "logstash is really stop"
fi

:wq
chmod 755 logstop.sh

sh logstart.sh

tail -f logs/logstash.log 查看是否報錯

 

---------------------------------------------------

將啟動和停止腳本復制到web2服務器的/root/下面,然后再啟動
cd /root
mkdir logs
touch logs/logstash.log

vim logstart.sh

復制粘貼過來

:wq 保存退出

 

vim logstop.sh

復制粘貼過來

:wq  保存退出

 

chmod 755 logstart.sh logstop.sh
sh logstart.sh

tail -f logs/logstash.log 查看是否報錯

--------------------------------------------

將腳本復制到日志服務器的/root/下面,然后再啟動
cd /root
mkdir logs
touch logs/logstash.log

mkdir logs/website-log

 

 

vim logstart.sh

 

復制粘貼過來

 

:wq 保存退出

 

 

vim logstop.sh

 

復制粘貼過來

 

:wq  保存退出

 

chmod 755 logstart.sh logstop.sh
sh logstart.sh

tail -f logs/logstash.log 查看是否報錯

--------------------------------------------------

 

最后在r日志服務器觀察相應web的集合日志
cd /root
tail -f logs/web-log/website.log
--------------------------------------------------
我們也可以手動測試一下,模擬日志產生
在web1服務器

echo "Hello World" >> /wefintek/education/website/logs/website.log
如果日志服務器tail -f /root/logs/web-log/website.log 出現: 192.168.11.3 B[1] Hello World,說明web1服務器的website.log收集成功。
--------------------------------------------------
為了保險起見,web2服務器我們也可以手動測試

echo "I want to your home" >> /wefintek/education/website/logs/website.log

如果日志服務器tail -f /root/logs/web-log/website.log 出現: 192.168.11.4 B[1] I want to your home,說明web2服務器的website.log收集成功。

如果你願意你也可以把web1服務器、web2服務器的website-error.log 也測試一下

到此logstash+redis安裝完成了

 

說明:生產中可能會看到重復的日志,你可以到源服務器去看下源日志是否有重復,一般都是原日志有重復,所以我們

收集的日志里面才會有重復,網上很多人說數據有重復,其實是你沒有安裝好,網上的搭建寫的都不全,只要按照我這

種安裝的方式是不會有重復日志數據的問題的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM