安裝ELK Stack海量日志分析系統(tǒng)

拓?fù)鋱D:

較為常見的ELK stack架構(gòu)
主機名 主機地址 角色
node1 192.168.31.201 Elasticsearch、jdk1.8鲤拿、Kibana
node2 192.168.31.202 Elasticsearch搬瑰、jdk1.8
node3 192.168.31.203 Elasticsearch、jdk1.8
node4 192.168.31.204 logstash跃捣、jdk1.8
node5 192.168.31.205 redis
node6 192.168.31.206 logstash、nginx亡哄、jdk1.8

一枝缔、安裝Logstash

#編輯repo文件,這里配置一個清華的yum源。
[root@bc ~]# vim /etc/yum.repos.d/logstash24.repo
  [logstash2.4-tsinghua]
  name=logstash24
  baseurl=https://mirrors.tuna.tsinghua.edu.cn/ELK/yum/logstash-2.4/
  enabled=1
  gpgcheck=0
#安裝logstash
[root@bc ~]# yum install logstash-2.4.1 -y
#輸出執(zhí)行路徑
[root@bc ~]# export PATH=/opt/logstash/bin/:$PATH
測試能否正常運行:
1.編輯文件
[root@bc ~]# vim basic
  input{
          stdin{}
  }
  output{
          stdout {
                  codec => rubydebug
          }
  }

從標(biāo)準(zhǔn)輸入讀仍感丁(鍵盤)灵临,輸出到標(biāo)準(zhǔn)輸出(屏幕)

2.使用指定文件運行l(wèi)ogstash,測試是否正常運行
[root@bc ~]# logstash -f basic 
Settings: Default pipeline workers: 1
Pipeline main started
hello world
{
       "message" => "hello world",
      "@version" => "1",
    "@timestamp" => "2017-03-03T02:16:51.538Z",
          "host" => "bc.com"
}

這里我們鍵盤輸入的是hello world

二趴荸、Elasticsearch

1.配置yum源
#編輯repo文件儒溉,這里配置一個清華的yum源。
[root@bc ~]# vim /etc/yum.repos.d/elasticsearch24.repo 
  [elasticsearch2.4-tsinghua]
  name=logstash24
  baseurl=https://mirrors.tuna.tsinghua.edu.cn/ELK/yum/elasticsearch-2.x/
  enabled=1
  gpgcheck=0

#安裝elasticsearch
[root@bc ~]# yum install elasticsearch-2.4.4 -y
#啟動
[root@bc ~]# service elasticsearch start
Starting elasticsearch (via systemctl):                    [  OK  ]

2.測試elasticsearch是否正常運行
[root@bc ~]# curl -i -XGET 'localhost:9200/'
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 367

{
  "name" : "Jericho Drumm",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "vLUapCyRRK6YH2ilwdPMkQ",
  "version" : {
    "number" : "2.4.4",
    "build_hash" : "fcbb46dfd45562a9cf00c604b30849a6dec6b017",
    "build_timestamp" : "2017-01-03T11:33:16Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.2"
  },
  "tagline" : "You Know, for Search"
}
3.構(gòu)建elasticsearch集群
[root@node3 ~]# vim /etc/elasticsearch/elasticsearch.yml
  cluster.name: "elasticsearch"
  #集群名字
  node.name: "node3.bc.com"
  #節(jié)點名字发钝,三個節(jié)點都需要不同的名字以示區(qū)分
  network.host: 0.0.0.0
  #監(jiān)聽地址
  http.port: 9200
  #瀏覽器訪問地址
  discovery.zen.ping.unicast.hosts: ["node2.bc.com", "node3.bc.com", "node1.bc.com"]
  #node1顿涣,node2,node3三個節(jié)點的單播通信酝豪,告訴大家自己的存活狀態(tài)涛碑。
注意:這個地方是最坑的!7跆浴蒲障!

冒號后面,逗號后邊少一個空格都會啟動失敗瘫证。

4.為elasticsearch安裝插件
1.安裝kopf插件
  [root@node2 ~]# /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf/
2.安裝head插件
  [root@node2 ~]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
3.查看已經(jīng)安裝的插件
  [root@node2 ~]# /usr/share/elasticsearch/bin/plugin list
  Installed plugins in /usr/share/elasticsearch/plugins:
      - head
      - license
      - kopf
需要注意的是:

1.三個節(jié)點的插件必須都安裝揉阎,否則啟動不了。
systemctl status elasticsearch一般會報錯: IllegalArgumentException[No custom metadata prototype registered for type
2.本地沒有插件的話會自動從github下載
比較坑的是背捌,elaticsearch的不同版本plugin這個命令的使用方法可能會不同
不過可以用-h來顯示使用方法毙籽,命令不要復(fù)制就用。

5.使用瀏覽器訪問
瀏覽器輸入elasticsearch節(jié)點之一的地址:
http://192.168.31.201:9200/_plugin/head/
elk.jpg

使用logstash內(nèi)置的匹配規(guī)則毡庆,匹配httpd的日志格式

1.這個不是必要的配置文件坑赡,我們在這里先探究一下默認(rèn)的匹配規(guī)則有什么用。

#編寫一個叫apachelog.conf的文件么抗,用來寫匹配httpd日志的規(guī)則垮衷。
[root@bc ~]# vim apachelog.conf
input {
        file {
                path    => ["/var/log/httpd/access_log"]
                type    => "apachelog"
                start_position => "beginning"
            }
}

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

output {
    stdout {
        codec   => rubydebug
    }
}

需要注意的是,此處有三個插件乖坠。
input插件指的是logstash從哪里讀數(shù)據(jù);
filter插件指的是怎么對文本進(jìn)行過濾刀闷;
output插件指的是需要把結(jié)果輸出到哪里
這三個插件的意思是: logstash從文件中讀取數(shù)據(jù)(input)熊泵, 經(jīng)過內(nèi)置的COMBINEDAPACHELOG規(guī)則匹配之后(filter), 把結(jié)果輸出到屏幕(output)

輸出結(jié)果:
[root@bc ~]# logstash -f apachelog.conf
{
        "message" => "192.168.31.242 - - [03/Mar/2017:14:00:41 +0800] \"GET /noindex/css/fonts/Bold/OpenSans-Bold.ttf HTTP/1.1\" 404 238 \"http://192.168.31.201/noindex/css/open-sans.css\" \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36\"",
       "@version" => "1",
     "@timestamp" => "2017-03-03T06:00:52.934Z",
           "path" => "/var/log/httpd/access_log",
           "host" => "bc.com",
           "type" => "apachelog",
       "clientip" => "192.168.31.242",
          "ident" => "-",
           "auth" => "-",
      "timestamp" => "03/Mar/2017:14:00:41 +0800",
           "verb" => "GET",
        "request" => "/noindex/css/fonts/Bold/OpenSans-Bold.ttf",
    "httpversion" => "1.1",
       "response" => "404",
          "bytes" => "238",
       "referrer" => "\"http://192.168.31.201/noindex/css/open-sans.css\"",
          "agent" => "\"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36\""
}
延伸:我們查看COMBINEDAPACHELOG是否可以匹配nginx日志的規(guī)則
使用combinedlog匹配nginx規(guī)則
{
        "message" => "192.168.31.242 - - [03/Mar/2017:14:11:01 +0800] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36\" \"-\"",
       "@version" => "1",
     "@timestamp" => "2017-03-03T06:11:49.150Z",
           "path" => "/var/log/nginx/access.log",
           "host" => "bc.com",
           "type" => "nginx",
       "clientip" => "192.168.31.242",
          "ident" => "-",
           "auth" => "-",
      "timestamp" => "03/Mar/2017:14:11:01 +0800",
           "verb" => "GET",
        "request" => "/",
    "httpversion" => "1.1",
       "response" => "304",
          "bytes" => "0",
       "referrer" => "\"-\"",
          "agent" => "\"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36\""
}

我們可以看出來甸昏,用COMBINEDAPACHELOG也可以匹配nginx日志顽分,但是會漏掉一些東西信息。

從web服務(wù)器收集日志施蜜,并使用redis作為消息隊列

1.node6配置logstash的運行文件
[root@node6 ~]# vim /etc/logstash/conf.d/nginx-out.conf
input {
        file {
                path    => ["/var/log/nginx/access.log"]
                type    => "nginxlog"
                start_position => "beginning"
        }
}

filter {
        grok {
                match => { "message" => "%{COMBINEDAPACHELOG} %{QS:x_forwarded_for}" }
        }
}

output{
        redis {
                port    =>      "6379"
                host    =>      ["192.168.31.205"]
                data_type       =>      "list"
                key     =>      "logstash-%{type}"
}

這里的意思是卒蘸,從nginx日志讀入,使用規(guī)則匹配,并輸出到redis服務(wù)器

2.node5作為消息隊列缸沃,安裝redis
[root@node5 ~]# redis-cli 
127.0.0.1:6379> LLEN logstash-nginxlog
(integer) 19
127.0.0.1:6379> LLEN logstash-nginxlog
(integer) 27
127.0.0.1:6379> LINDEX logstash-nginxlog 1
"{\"message\":\"192.168.31.242 - - [03/Mar/2017:20:39:47 +0800] \\\"GET /nginx-logo.png HTTP/1.1\\\" 200 368 \\\"http://192.168.31.203/\\\" \\\"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36\\\" \\\"-\\\"\",\"@version\":\"1\",\"@timestamp\":\"2017-03-03T12:41:38.315Z\",\"path\":\"/var/log/nginx/access.log\",\"host\":\"node3.bc.com\",\"type\":\"nginxlog\",\"clientip\":\"192.168.31.242\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"03/Mar/2017:20:39:47 +0800\",\"verb\":\"GET\",\"request\":\"/nginx-logo.png\",\"httpversion\":\"1.1\",\"response\":\"200\",\"bytes\":\"368\",\"referrer\":\"\\\"http://192.168.31.203/\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36\\\"\",\"x_forwarded_for\":\"\\\"-\\\"\"}"
3.node4作為logstash Server從redis讀取數(shù)據(jù)
[root@node4 ~]# vim /etc/logstash/conf.d/redis-in.conf
input {
    redis {
        batch_count => 1
        data_type => "list"
        key => "logstash-nginxlog"
        host => "192.168.31.205"
        port => 6379
        threads => 5
    }
}

output{
        elasticsearch{
                hosts => ["192.168.31.201", "192.168.31.202", "192.168.31.203"]
        }
}
3.啟動服務(wù)
#啟動方式也可以使用nohup logstash -f nginxout.conf &來啟動
#也可以通過啟動腳本來啟動。
#但使用啟動腳本容易因為權(quán)限問題趾牧,而導(dǎo)致logstash無法正常運行检盼。

#修改啟動腳本的啟動用戶為root
[root@node4 ~]# vim /etc/init.d/logstash 
  LS_USER=root
  LS_GROUP=root
#啟動logstash
[root@node4 ~]# /etc/init.d/logstash start

為什么要使用logstash => redis => logstash Server這種結(jié)構(gòu)?
首先,我們要了解redis在此處的用處翘单。
redis在此處吨枉,做為一個消息隊列,可以用來整合多個ngxin那里收集而來的日志哄芜。
當(dāng)elasticsearch發(fā)生故障或重啟的時候貌亭,redis仍可接受來自web端的日志。
當(dāng)elasticsearch重新啟動的時候认臊,則會從消息隊列中重新讀取數(shù)據(jù)圃庭。
這樣就可以不會因為重啟的這段時間而丟失那段時間的日志數(shù)據(jù)。

安裝kibana

1.在任意節(jié)點安裝kibana
#配置kibana的清華鏡像
[root@bc ~]# vim /etc/yum.repos.d/kibana.repo
[Kibana-4.5]
name=Kibana-Tsinghua
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ELK/yum/kibana-4.5/
gpgcheck=0
enabled=1

[root@bc ~]# yum install kibana -y

2.修改配置文件
[root@bc ~]# vim /opt/kibana/config/kibana.yml
  elasticsearch.url: "http://node1.bc.com:9200"
3.啟動kibana
#啟動kibana
[root@bc ~]# nohup /opt/kibana/bin/kibana &
#瀏覽器輸入美尸,可以使用ip地址
  http://node1.bc.com:5601
kibana.jpg

ELK stack的安全問題

(1).ELK安全相關(guān):
由于ELK stack是日志信息冤议,相對來說比較私密,不能任由誰都能訪問师坎。
a.在前端使用nginx做代理恕酸,并且啟用basic認(rèn)證
b.nginx設(shè)置訪問控制胯陋,來限制訪問來源的ip蕊温。
c.把ELK stack在局域網(wǎng)內(nèi),不向外提供服務(wù)遏乔。

(2)redis的安全相關(guān):
a.redis啟動自帶的認(rèn)證功能
b.nginx設(shè)置訪問控制义矛,來限制訪問來源的ip。
c.把redis在局域網(wǎng)內(nèi)盟萨,不向外提供服務(wù)凉翻。

#實際上,由于NoSQL的產(chǎn)品興起不久捻激,最近都有一些安全相關(guān)的資訊制轰。
#一定要在安全相關(guān)方面,引起注意胞谭。
  1.redis被提權(quán)之后垃杖,被惡意被執(zhí)行flush_all導(dǎo)致被清庫。
  2.mongodb低版本沒有認(rèn)證功能丈屹,被清庫调俘。
  3.elasticsearch被惡意勒索。(自身為開源免費,認(rèn)證插件收費彩库。)

總結(jié):

(1).ELK安裝起來看起來十分容易肤无,但是實際操作起來,因為版本之間有差異侧巨,所以很容易出錯舅锄。而這個時候,我們可以通過查看日志司忱,或者到官方文檔
(2).寫出正確的grok規(guī)則是最花時間皇忿,也就是說ELK里面,最燒腦的是logstash坦仍。
但是elasticsearch的配置文件很嚴(yán)格鳍烁,有時即使是少寫一個空格也會啟動失敗。
(3).因為ELK stack需要啟動java虛擬機繁扎,很占用內(nèi)存幔荒。
同時elasticsearch、logstash都需要安裝JVM虛擬機梳玫,一般不搭建在同一臺服務(wù)器爹梁。
(4).redis很消耗內(nèi)存,在redis內(nèi)存占用達(dá)到總體70%以上的時候就需要引起注意提澎。
同時姚垃,redis最好安裝3或者以上的高版本,因為低版本的redis很容易和logstash不兼容盼忌,寫不進(jìn)去积糯。
(5).由于權(quán)限的問題而導(dǎo)致啟動失敗
可修改/etc/sysconfig/logstash中啟動用戶為root。
(6)這個架構(gòu)中的單點故障:Redis谦纱。
1.logstash Server故障的時候看成,消息儲存在消息隊列中
2.logstash Client故障的時候,日志仍然保存在nginx日志文件中跨嘉。
但是重啟的時候川慌,只要配合sincedb依然可以繼續(xù)上次斷開的地方開始讀取。
3.Elasticsearch故障的時候祠乃,集群中的其他節(jié)點會生效
4.Redis故障的時候窘游,,logstash client的多個主機都無法向redis寫入數(shù)據(jù)跳纳。

所以將在不久寫一篇文章,講述如何搭建一個redis集群贪嫂。

關(guān)于新版本的見解:
文章都是實際搭建之后而成寺庄,關(guān)于理論部分不過多闡述。
ELK stack2.4版本目前使用較多,新版ELK由于變動較大并追加了新功能斗塘。
在搭建或者使用期間時報錯赢织,可能較難搜索到結(jié)果。
如果求穩(wěn)定使用而不是追求新功能的話馍盟,本文可以作為參考于置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贞岭,隨后出現(xiàn)的幾起案子八毯,更是在濱河造成了極大的恐慌,老刑警劉巖瞄桨,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件话速,死亡現(xiàn)場離奇詭異,居然都是意外死亡芯侥,警方通過查閱死者的電腦和手機泊交,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柱查,“玉大人廓俭,你說我怎么就攤上這事“ぃ” “怎么了研乒?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酵紫。 經(jīng)常有香客問我告嘲,道長,這世上最難降的妖魔是什么奖地? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任橄唬,我火速辦了婚禮,結(jié)果婚禮上参歹,老公的妹妹穿的比我還像新娘仰楚。我一直安慰自己,他們只是感情好犬庇,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布僧界。 她就那樣靜靜地躺著,像睡著了一般臭挽。 火紅的嫁衣襯著肌膚如雪捂襟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天欢峰,我揣著相機與錄音葬荷,去河邊找鬼涨共。 笑死,一個胖子當(dāng)著我的面吹牛宠漩,可吹牛的內(nèi)容都是我干的举反。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼扒吁,長吁一口氣:“原來是場噩夢啊……” “哼火鼻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雕崩,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤魁索,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晨逝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛾默,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年捉貌,在試婚紗的時候發(fā)現(xiàn)自己被綠了支鸡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡趁窃,死狀恐怖牧挣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情醒陆,我是刑警寧澤瀑构,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站刨摩,受9級特大地震影響寺晌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澡刹,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一呻征、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罢浇,春花似錦陆赋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胞锰,卻和暖如春灾锯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗅榕。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工顺饮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留色乾,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓领突,卻偏偏與公主長得像,于是被迫代替她去往敵國和親案怯。 傳聞我的和親對象是個殘疾皇子君旦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容