1. 程式人生 > >極速賽車平臺出租與ELK日誌分析平臺

極速賽車平臺出租與ELK日誌分析平臺

roo node trigge yml def sco byte curl html

什麽是ELK呢?極速賽車平臺出租 Q2152876294 論壇:diguaym.com

ELK是三個組件的縮寫, 分別是elasticsearch, logstash, kibana. ELK平臺可以用於實現日誌收集、日誌搜索和日誌分析
1.elasticsearch(es): 它是個開源分布式搜索引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
2.logstash: 簡單說是一個日誌收集工具, 可以定義從哪裏獲取數據, 並且可以簡單處理數據, 最後可以定義將數據輸出到哪裏, 一般輸出到es.
3.kibana: 其實就是一個數據展示界面, 並且可以分析數據, 例如從es中讀取數據進行展示分析. es自己也帶有簡單的展示dashboard:, 當然 前提是你安裝了head插件

如何搭建一個ELK日誌分析平臺呢?

一.單機安裝elasticsearch
1.利用安裝elasticsearch的rpm包安裝

yum install elasticsearch-2.3.3.rpm
1
2.配置elasticsearch的配置文件

cd /etc/elasticsearch/
vim elasticsearch.yml # 主配置文件
17 cluster.name: my-es # 集群的名稱my-es
23 node.name: server1 # 當前節點的主機名
33 path.data: /var/lib/elasticsearch/ # 數據目錄

37 path.logs: /var/log/elasticsearch/ # 日誌目錄
54 network.host: 172.25.1.1 # 當前主機的IP
58 http.port: 9200 # 對外端口號
1
2
3
4
5
6
7
8
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
3.安裝java環境(因為Elasticsearch是用Java開發的)

rpm -ivh jdk-8u121-linux-x64.rpm
1
4.啟動elasticsearch服務

/etc/init.d/elasticsearch start
1
這裏寫圖片描述

打開服務後可以在瀏覽器中輸入當前主機的IP和端口號查看(只有簡單的數據,沒有圖形界面也沒有分析等,所以我們選擇安裝相應圖形界面的插件,方便分析處理數據)
這裏寫圖片描述
5.安裝插件:

cd /usr/share/elasticsearch/
cd /bin
./plugin list # 查看已經安裝的插件
/usr/share/elasticsearch/bin/plugin install file:/root/elk/elasticsearch-head-master.zip
1
2
3
4
這裏寫圖片描述
6.安裝插件以後,我們在瀏覽器中查看,得到的就是比較便於觀察和分析的web界面
這裏寫圖片描述
7.在該web界面下建立索引嘗試查詢
這裏寫圖片描述

二 . 集群Elasticsearch的安裝和配置
Elasticsearch是一個開源的高擴展的分布式全文檢索引擎,它可以近乎實時的存儲、檢索數據;本身擴展性很好,可以擴展到上百臺服務器,處理PB級別的數據。
ES可以作為一個獨立的單個搜索服務器。不過,為了處理大型數據集,實現容錯和高可用性,ES可以運行在許多互相合作的服務器上。這些服務器的集合稱為集群。
1
2
3
1.在server2和server3上安裝elasticsearch-2.3.3.rpm和jdk-8u121-linux-x64.rpm

rpm -ivh jdk-8u121-linux-x64.rpm
yum install elasticsearch-2.3.3.rpm
1
2
2.編輯sevre1上的配置文件elasticsearch.yml

72行 discovery.zen.ping.unicast.hosts: ["server1", "server2","server3"]

表示該集群由三臺主機構成,主機名分別是server1,server2和server3

1
2
將修改好的配置文件發送給server2和server3上,在server2上和server3上修改配置文件中的sevrername和ip
3.啟動server2和sevrer3上的服務
/etc/init.d/elasticsearch start
4.為了將集群中三臺主機所負責的功能模塊分開,我們在配置文件中設定:
server1:

#server1是主節點,同時承擔http查詢任務
vim elasticsearch.yml
23 node.name: server1
24 node.master: true
25 node.data: false
26 http.enabled: true
1
2
3
4
5
6
這裏寫圖片描述
server2:

server2負責存儲數據和http查詢任務

vim elasticsearch.yml
23 node.name: server2
25 node.master: false
26 node.data: true
27 http.enabled: true
1
2
3
4
5
6
server3:

server3和server2相同

vim elasticsearch.yml
23 node.name: server2
25 node.master: false
26 node.data: true
27 http.enabled: true
1
2
3
4
5
6
這裏寫圖片描述
5.重啟所有節點上的服務,在瀏覽器中查看web界面
這裏寫圖片描述
6.查詢集群的狀態

curl -XGET
這裏寫圖片描述
數據查詢(三個節點上的node.data均為true)

curl 172.25.1.1:9200/_nodes/_local
1
這裏寫圖片描述
刪除demo索引

curl -XDELETE
1
這裏寫圖片描述
這裏寫圖片描述

三.logstash的安裝與配置
Logstash是開源的服務器端數據處理管道,能夠同時從多個來源采集數據,轉換數據,然後將數據發送到您喜歡的“存儲庫”中。(我們的存儲當然是Elasticsearch。)

1.安裝logstash工具

rpm -ivh logstash-2.3.3-1.noarch.rpm
1
添加不同的模塊:

1.標準終端輸入stdin和輸出stdout模塊

/opt/logstash/bin/logstash -e ‘input { stdin { } } output { stdout { } }‘

input輸入是從終端標準輸出

Settings: Default pipeline workers: 1
Pipeline main started
hello # 標準輸入hello
2018-08-25T02:36:54.035Z server1 hello # 標準輸出hello
world
2018-08-25T02:36:57.372Z server1 world
^CSIGINT received. Shutting down the agent. {:level=>:warn} # ctrl+c中斷
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
1
2
3
4
5
6
7
8
9
10
11
12
這裏寫圖片描述
2.在標準終端輸出的時候選擇輸出數據格式codec => rubydebug

/opt/logstash/bin/logstash -e ‘input { stdin { } } output { stdout { codec => rubydebug } }‘
Settings: Default pipeline workers: 1
Pipeline main started
hello # 標準輸入
{
"message" => "hello", # 輸出
"@version" => "1",
"@timestamp" => "2018-08-25T02:38:09.060Z",
"host" => "server1"
}
world
{
"message" => "world",
"@version" => "1",
"@timestamp" => "2018-08-25T02:38:12.447Z",
"host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
這裏寫圖片描述
3.標準終端輸出,輸出到提供elasticsearch的主機(server1)中

/opt/logstash/bin/logstash -e ‘input { stdin { } } output { elasticsearch { hosts => ["172.25.1.1"] index => "logstash-%{+YYYY.MM.dd}" } }‘
Settings: Default pipeline workers: 1
Pipeline main started
hello
hello world
hello jay # 無終端輸出,是因為將數據輸出到了elasticsearch中
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
1
2
3
4
5
6
7
8
9
10
11
在瀏覽器中查看:
這裏寫圖片描述

4.上邊幾種情況的集合,標準終端輸入,輸出分為兩部分,一部分輸出到elasticsearch ,另一種是輸出到終端…

/opt/logstash/bin/logstash -e ‘input { stdin { } } output { elasticsearch { hosts => ["172.25.1.1"] index => "logstash-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } }‘
Settings: Default pipeline workers: 1
Pipeline main started
hello world
{
"message" => "hello world",
"@version" => "1",
"@timestamp" => "2018-08-25T02:42:38.615Z",
"host" => "server1"
}
hello linux
{
"message" => "hello linux",
"@version" => "1",
"@timestamp" => "2018-08-25T02:42:42.556Z",
"host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
這裏寫圖片描述
這裏寫圖片描述
5.上邊的各種模塊都是直接在命令行選擇模塊,輸入或者輸出。我們也可以在文件中編寫使用的模塊,選擇輸入和輸出,

cd /etc/logstash/conf.d/
vim es.conf # 文件名,可以隨意取
input {
stdin {} # 輸入是標準終端輸入standard input
}

output {
elasticsearch { # 第一個輸出是到elasticsearch
hosts => ["172.25.1.1"] # elasticsearch所在的主機
index => "logstash-%{+YYYY.MM.dd}"
}

    stdout {                         # 第二個輸出是標準終端輸出
            codec => rubydebug       # 輸出的風格是rubydebug
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在終端的運行情況:

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf # 在終端利用logstash運行此文件
Settings: Default pipeline workers: 1
Pipeline main started
hello qzy # 標準終端輸入
{
"message" => "hello qzy", # 輸出的一部分,在終端標準輸出
"@version" => "1",
"@timestamp" => "2018-08-25T02:46:38.949Z",
"host" => "server1"
}
hello jay
{
"message" => "hello jay",
"@version" => "1",
"@timestamp" => "2018-08-25T02:46:43.771Z",
"host" => "server1"
}
nice to meet you
{
"message" => "nice to meet you",
"@version" => "1",
"@timestamp" => "2018-08-25T02:46:58.730Z",
"host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
這裏寫圖片描述
在瀏覽器中的數據輸出:
這裏寫圖片描述

6.rsyslog模塊:
將server1當作一個日誌收集服務器
(1).編輯一個使用模塊的文件

vim message.conf
input {
syslog {
port => 514 # 輸入是server2的日誌,同步日誌端口為514/udp
}
}

output {

elasticsearch {

hosts => ["172.25.1.1"] # 輸出到server1的elasticsearch

index => "message-%{+YYYY.MM.dd}"

}

    stdout {
            codec => rubydebug     # 輸出到標準屏幕輸出
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(2).在sevrer2中編輯同步日誌的文件

vim /etc/rsyslog.conf
. @@172.25.1.1:514
/etc/init.d/rsyslog restart # 重新打開rsyslog服務
1
2
3
(3).查看rsyslog的端口和運行該模式的結果
在server1上netstat -antulp | grep 514
這裏寫圖片描述
在server1以終端占用的方式執行
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/message.conf
這裏寫圖片描述
在server1上可以收集到server2上的日誌信息
(4).在server上執行logger tigger,在server1上立即可以看到trigger的輸出
這裏寫圖片描述

7.利用logstash中的模塊將日誌記錄中的多行輸出變為一行:
(1).在elasticsearch的日誌記錄文件中

cd /var/log/elasticsearch
cat my-es.log
1
2
看到以[]為界線的日誌有時候並不在一行
這裏寫圖片描述
(2).利用filter對輸入進行過濾處理再指定輸出

vim /etc/logstash/conf.d/message.conf
input {
file {
path => "/var/log/elasticsearch/my-es.log" # 待處理日誌所在位置
start_position => "beginning" # 從日誌的開始處處理
}
}

filter {
multiline {
pattern => "^["
negate => true
what => "previous"
}
}

output {
elasticsearch {
hosts => ["172.25.1.1"]
index => "es-%{+YYYY.MM.dd}"
}

    stdout {
            codec => rubydebug
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
這裏寫圖片描述

(3).在終端執行操作

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/message.conf

因為在終端出有大量的java日誌,所以就不再展示

1
2
這裏有一個需要註意的點:我們在message.conf中寫的是從日誌文件的beginning開始,但是,此時我們接著往日誌中寫東西,我們發現是從上次結束的地方開始,看起來好像與我們的設置出現差異,但是不然,如果又從頭開始記錄,必然會造成信息的重復。
在linux中,我們有文件專門記錄日誌的編號:
cat /root/.sincedb_452905a167cf4509fd08acb964fdb20c
913943 0 64768 32581
ls -i /var/log/messages
913943 /var/log/messages
這裏寫圖片描述
這兩個數字是一樣的,最後一個日誌表示此時日誌的位置為32581,當我們在日誌中接著寫點東西的時候,該數字會發生變化,即表示下次記錄的時候從此位置開始
logger cat
cat .sincedb_452905a167cf4509fd08acb964fdb20c (該文件不發生變更,是不會重復讀的)
913943 0 64768 32751
這裏寫圖片描述

9.利用filter使httpd的日誌按照規定格式輸出:

1.編輯一個處理httpd日誌的文件test.conf

vim test.conf
input {
stdin {} # 輸入是終端標準輸入
}
filter {
grok {
match => { "message" => "%IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }

利用filter對輸入的數據進行過濾,轉換為指定格式指定

    }

}

output {
stdout {
codec => rubydebug # 標準終端輸出
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在終端中

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
172.25.1.2 GET /index.html 15888 0.043 # 標準輸入
1
2
這裏寫圖片描述
2.引用系統中的變量對httpd服務的輸出日誌進行處理,按照指定格式輸出

vim message.conf
input {
file {
path => ["/var/log/httpd/access_log","/var/log/httpd/error_log"] # 日誌文件所在的位置
start_position => "beginning" # 開始同步的位置=>文件開始處
}
}

filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }

引用變量COMBINEDAPACHELOG

    }

}

output {
elasticsearch {
hosts => ["172.25.1.1"]
index => "apache-%{+YYYY.MM.dd}"
}

    stdout {
            codec => rubydebug
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
3.在httpd的默認發布目錄寫默認發布文件,在主配置文件中可以看到默認的日誌輸出格式
這裏寫圖片描述
這裏寫圖片描述
引用變量的位置在
/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/
vim grok-patterns
這裏寫圖片描述
在終端執行輸出:
這裏寫圖片描述

四.在server3上安裝kibana
Kibana是一個開源的分析與可視化平臺,設計出來用於和Elasticsearch一起使用的
1.安裝rpm包

rpm -ivh kibana-4.5.1-1.x86_64.rpm
1
2.編輯其主配置文件,寫

cd /opt/kibana/config/
vim kibana.yml
1
2
這裏寫圖片描述
3.打開服務並查看端倪口

/etc/init.d/kibana start
netstat -antlp
1
2
這裏寫圖片描述

五.ELK日誌分析工具之間的解耦
思路:從nginx的日誌文件中得到數據放在logstash中,由logstash將數據存在redis中,再由logstash將數據從redis中拿出來交給kibana,這樣下來,數據經過redis,保證了數據的安全性也使得logstash和kibana之間得數據不是直接關聯,降低了耦合性。
(一).基本服務的配置
1.在server1上安裝nginx

rpm -ivh nginx-1.8.0-1.el6.ngx.x86_64.rpm
1
2.在server2上安裝redis

tar zxf redis-3.0.6.tar.gz
cd redis-3.0.6
make # 來一波簡單的源碼編譯
make install
1
2
3
4
3.打開redis

cd /root/redis-3.0.6/src/utils/
./install_server.sh
查看redis的端口netstat -antlp
1
2
3
這裏寫圖片描述
(二).nginx的安裝
1.在server1上安裝nginx

rpm -ivh nginx-1.8.0-1.el6.ngx.x86_64.rpm
1
2.查看nginx的日誌格式,nginx的配置文件

cd /etc/nginx/
vim nginx.conf
1
2
這裏寫圖片描述
3.引用apache的日誌格式變量

cd /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/
vim grok-patterns
1
2
4.編輯nginx.conf來對nginx的日誌做處理

vim nginx.conf
input {
file {
path => "/var/log/nginx/access.log" # nginx的日誌
start_position => "beginning"
}
}

filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG} %{QS:x_forwarded_for}" } # 在apache日誌的前提下再加上自己的日誌輸出
}
}
output {
redis {
host => ["172.25.1.2"]
port => 6379 # 輸出到server2的redis端口
data_type => "list" # 在redis中以列表形式存儲
key => "logstash:redis" # 定義列表形式的鍵值對
}
stdout {
codec => rubydebug
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
這裏寫圖片描述
修改nginx的日誌權限

chmod 644 /var/log/nginx/access.log # 保證對所有用戶可寫
1
5.在終端執行處理nginx日誌的文件

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/nginx.conf
1
6.在物理機進行壓測ab -c 1 -n 10

(三).在server2上安裝noarch

rpm -ivh logstash-2.3.3-1.noarch.rpm
cd /etc/logstash/conf.d/
vim es.conf
input {
redis { # 從redis中拿數據
host => "172.25.1.2"
port => 6379
data_type => "list"
key => "logstash:redis" # 格式和上邊的保持一致
}
}

output {
elasticsearch { # 輸出是將數據輸出到elasticsearch中
hosts => ["172.25.1.1"]
index => "nginx-%{+YYYY.MM.dd}"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
這裏寫圖片描述
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf

在網頁中刷新,出現nginx
這裏寫圖片描述

(四).在server3上配置kibana對獲得的數據進行分析
選擇要創建視圖的項目:
這裏寫圖片描述
創建反映信息的試圖:
這裏寫圖片描述
創建聯系人或者時間(根據需要選擇)
這裏寫圖片描述
將創建的視圖添加到視圖框中:
這裏寫圖片描述
這裏寫圖片描述
根據自己的需要添加相應的模塊來對數據進行分析,最終展現出來:
這裏寫圖片描述

極速賽車平臺出租與ELK日誌分析平臺