1. 程式人生 > >Elk叢集安裝+配置(Elasticsearch+Logstash+Filebeat+Kafka+Kibana)

Elk叢集安裝+配置(Elasticsearch+Logstash+Filebeat+Kafka+Kibana)

一、部署環境
1.基礎環境:

軟體 版本 作用
Linux Centos7.1,16g
Jdk 1.8.0_151
Elasticsearch 5.5.0 資料持久化,儲存資料
Logstash 5.5.0 資料過濾/處理,從kafka中接收日誌,轉發到es中
Kibana 5.5.0 資料視覺化
Filebeat 5.5.0 資料採集,在各個伺服器上收集日誌,輸出到kafka中
Kafka 2.11-0.10.2.1 資料快取,避免因logstash服務掛掉造成的日誌丟失
Zookeeper 3.4.10 與kafka 配套使用,協調管理kafka代理

2.機器環境:elk 伺服器4臺,業務伺服器34臺

NODE IP 節點型別
es1 X.X.X.109 資料/主節點(安裝es、logstash、kafka、zookeeper)
es2 X.X.X.108 資料/主節點(安裝es、logstash、kafka、zookeeper)
es3 X.X.X.105 資料/主節點(安裝es、logstash、kafka、zookeeper)
es4 X.X.X.100 搜尋節點(安裝es、kibana、node、head、kafkaOffsetMonitor)
log* X.X.X.X 業務伺服器日誌收集節點(安裝filebeat)

二、安裝jdk

  • 解壓
    sudo tar -zxvf jdk-8u151-linux-x64.tar.gz -c /usr/local/etc/
  • 環境變數
    sudo vi /etc/profile
  • etc/profile檔案末尾增加環境變數
export JAVA_HOME=/usr/local/etc/jdk1.8.0_151
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin
  • 使環境變數生效
    source /etc/profile
  • 檢視
    java -version

二、安裝elasticsearch

  1. 軟體下載
    連結:elasticsearch-5.5.0.zip
  2. 解壓檔案到指定目錄
    /usr/local/etc
  3. 修改配置檔案
cluster.name: 66kuaiche  #叢集名稱,同一個叢集的標識.
node.name: es1 #節點名稱
node.master: true #允許一個節點可以成為一個master節
node.data: true #允許該節點儲存資料(預設開啟)
network.host: X.X.X.109 #繫結監聽IP
http.port: 9200 #設定對外服務的http埠
transport.tcp.port: 9300 # 設定節點間互動的tcp埠
discovery.zen.ping.unicast.hosts: ["X.X.X.109:9300","X.X.X.108:9300","X.X.X.105:9300"] # 這是一個叢集中的主節點的初始列表,當節點(主節點或者資料節點)啟動時使用這個列表進行探測
node.max_local_storage_nodes: 2 # 多個節點可以在同一個安裝路徑啟動
discovery.zen.minimum_master_nodes: 2 # 設定這個引數來保證叢集中的節點可以知道其它N個有master資格的節點.預設為1,對於大的叢集來說,可以設定大一點的值(2-4)
http.cors.enabled: true       #允許跨域訪問,head使用
http.cors.allow-origin: "*"   #允許跨域訪問,head使用
  1. 啟動命令
    前臺執行:
    ./elasticserch
    後臺臺執行:
    ./elasticserch -d

  2. 驗證
    瀏覽器輸入:X.X.X.109:9200

	返回結果如下:
	{
	  "name" : "es1",
	  "cluster_name" : "66kuaiche",
	  "cluster_uuid" : "jHr4yAzQQn2NnzAkakj-1A",
	  "version" : {
	    "number" : "5.5.0",
	    "build_hash" : "260387d",
	    "build_date" : "2017-06-30T23:16:05.735Z",
	    "build_snapshot" : false,
	    "lucene_version" : "6.6.0"
	  },
	  "tagline" : "You Know, for Search"
	}
  1. 調整jvm記憶體
    #預設是1g官方建議對jvm進行一些修改,不然很容易出現OOM,參考官網改引數配置最好不要超過記憶體的50%
    cd /config/jvm.options
    -Xms4g
    -Xmx4g
  2. es安裝過程遇到的坑
  • elasticsearch.yml檔案不生效或讀取不到
    -原因:該檔案的執行許可權不夠, sudo chmod +x elasticsearch.yml

  • 啟動elasticsearch時報錯,
    main ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)
    -原因:elasticearch不能以root許可權啟動,改變elasticsearch資料夾所有者到非root使用者,sudo chown -R centos:centos elasticsearch

  • ERROR: bootstrap checks failed
    max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    -原因:堆記憶體過低,需設定核心引數
    -臨時修改:sudo sysctl -w vm.max_map_count=262144
    -永久修改::修改/etc/sysctl.conf 檔案
    新增: vm.max_map_count=262144
    執行:sysctl -p

  • max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
    -原因:elasticsearch使用者擁有的可建立檔案描述的許可權太低,需設定資源引數,至少需要65536;
    #切換到root使用者修改:
    sudo -s
    vim /etc/security/limits.conf
    在最後面追加下面內容
    *** hard nofile 65536
    *** soft nofile 65536
    *** 是啟動ES的使用者,如:centos
    修改檔案成功,仍報too low,是因為沒有使用sudo -s切換到root許可權,而是使用sudo vi limit,conf修改的配置檔案

  • main ERROR RollingFileManager (/usr/local/etc/elasticsearch-5.5.0-slave1/logs/66kuaiche.log)
    java.io.FileNotFoundException: /usr/local/etc/elasticsearch-5.5.0-slave1/logs/66kuaiche.log (許可權不夠)
    java.io.FileNotFoundException: /usr/local/etc/elasticsearch-5.5.0-slave1/logs/66kuaiche.log (許可權不夠)
    -原因:es在生成日誌時需要寫檔案的許可權,但es又不能以root許可權啟動,所以需要將log檔案或整個es資料夾賦予當前使用者的許可權
    sudo chown -R centos:centos elasticsearch-5.5.0

  • 搭建elsticsearch叢集,報錯with the same id but is a different node instance
    -複製elsticsearch將其資料夾下的data資料夾一併複製了,data資料夾下已經產生了data歷史資料,刪除即可

  • 天坑問題(查了好幾天)在一開始使用Tcp的方式傳輸日誌到logstash ,發現有資料丟失的問題
    -原因:業務伺服器的時間和logstash伺服器的時間不同步,在開發環境伺服器X.203.115.115上,時間比標準時間慢5分鐘
    -檢視本伺服器時間:date
    -檢視標準時間:rdate time-b.nist.gov (time-b.nist.gov為是美國標準技術院的時間自動同步伺服器的域名)
    -同步標準時間到本伺服器:rdate -s time-b.nist.gov


三、安裝logstash

  1. 軟體下載
    連結:logstash-5.5.0.zip
  2. 解壓檔案到指定目錄
    /usr/local/etc
  3. 啟動
  • 常用啟動引數:
引數 說明 舉例
-e 立即執行,使用命令列裡的配置引數啟動例項 ./bin/logstash -e ‘input {stdin {}} output {stdout {}}’
-f 指定啟動例項的配置檔案 ./bin/logstash -f config/test.conf
-t 測試配置檔案的正確性 ./bin/logstash-f config/test.conf -t
-l 指定日誌檔名稱 ./bin/logstash-f config/test.conf -l logs/test.log
-w 指定filter執行緒數量,預設執行緒數是5 ./bin/logstash-f config/test.conf -w 8
  1. 配置檔案及語法
  • 區域
      Logstash通過{}來定義區域,區域內可以定義外掛,一個區域內可以定義多個外掛,如下:
input {
    stdin {
    }
    beats {
        port => 5044
    }
}
  • 資料型別
型別 說明 舉例
Boolean 布林 result => true
Number 數字 port => 5054
String 字串 type => “log”
Commonts 註釋 # 註釋
  • 欄位
    Logstash資料流中的資料被稱之為Event物件,Event以JSON結構構成,Event的屬性被稱之為欄位,如果你像在配置檔案中引用這些欄位,只需要把欄位的名字寫在中括號[]裡就行了,如[type],對於巢狀欄位每層欄位名稱都寫在[]裡就可以了,比如:[tags][type];除此之外,對於Logstash的arrag型別支援下標與倒序下表,如:[tags][type][0],[tags][type][-1]。

  • 運算語法

型別 說明
比較運算子 ==, !=, <, >, <=, >=
正則運算 =~, !~
條件運算子 in, not in
邏輯運算子 and, or, nand, xor
  1. 輸入外掛
  • file讀取外掛
      檔案讀取外掛主要用來抓取檔案的變化資訊,將變化資訊封裝成Event程序處理或者傳遞。
input
  file {
    path => ["/var/log/*.log", "/var/log/message"]
    type => "system"
    start_position => "beginning"
  }
}
  • Beats監聽外掛
      Beats外掛用於建立監聽服務,接收Filebeat或者其他beat傳送的Events;
input {
    beats {
        port => 5044
    }
}
  • TCP監聽外掛
      TCP外掛有兩種工作模式,“Client”和“Server”,分別用於傳送網路資料和監聽網路資料。
tcp {
    port => 41414
}
  • kafka 輸入外掛
kafka {
        bootstrap_servers => ["X.X.X.109:9092,X.X.X.108:9092,X.X.13
0.105:9092"]
        topics => ["ucenter-dev-kafka"]
        auto_offset_reset => "latest"
	codec => "json"
    }
  1. 過濾外掛
  • grok正則捕獲
      grok 是Logstash中將非結構化資料解析成結構化資料以便於查詢的最好工具,非常適合解析syslog logs,apache log, mysql log,以及一些其他的web log
input
  file {
    path => ["/var/log/*.log", "/var/log/message"]
    type => "system"
    start_position => "beginning"
  }
}
  • date時間處理外掛
      該外掛用於時間欄位的格式轉換,比如將“Apr 17 09:32:01”(MMM dd HH:mm:ss)轉換為“MM-dd HH:mm:ss”。通常情況下,Logstash會為自動給Event打上時間戳,但是這個時間戳是Event的處理時間(主要是input接收資料的時間),和日誌記錄時間會存在偏差(主要原因是buffer),我們可以使用此外掛用日誌發生時間替換掉預設是時間戳的值。
    (天坑之一)#match匹配時間的格式必須和輸入流格式嚴格匹配,特別要注意表示式前後的空格
date {
      match => ['time', ' yyyy-MM-dd HH:mm:ss.SSS ']
	  target => '@timestamp'
    }
  • ruby語法
      ruby filter可以說是Logstash中最強大的一個filter了,通過自己編寫ruby程式碼可以靈活地實現各種功能
      #ruby外掛有兩個屬性,一個init 還有一個code
    #init屬性是用來初始化欄位的,你可以在這裡初始化一個欄位,無論是什麼型別的都可以,這個欄位只是在ruby{}作用域裡面生效。
ruby {
        code =>"
        arr=event.get('message').split('-|')
        length=arr.length
        if length ==7
            event.set('logId',arr[0][-32..-1])
	    	event.set('module',arr[1])
            event.set('time',arr[2])
            event.set('level',arr[3])
            event.set('thread',arr[4])
            event.set('class',arr[5])
            event.set('msg',arr[6])
        else
            event.set('msg',event.get('message'))
        end
        "
       remove_field => ['_id','input_type','tags','message','beat','offset']
    }
  1. 輸出外掛
  • ElasticSearch輸出外掛
      用於將事件資訊寫入到Elasticsearch中
elasticsearch {
        hosts => ["X.X.X.109:9200","X.X.X.108:9200","X.X.X.105:9200"]
        index => "truck-ka-prod-%{+YYYY.MM.dd}"
        manage_template => true
        template_name => "filebeat-tem"
        template_overwrite => true
        template => "/usr/local/etc/logstash-1/template/filebeat_template.json"
    }
引數名稱 型別 預設值 描述資訊
index string “logstash-%{+YYYY.MM.dd}” 指定elasticsearch儲存資料時的所有名稱,支援變數引用,比如你可以按天建立索引,方便刪除歷史資料或者查詢制定範圍內的資料
hosts string [//127.0.0.1] elasticsearch服務地址列表,如果配置多個將啟用負載均衡
manage_template boolean true 是否啟用elasticsearch模版,Logstash自帶一個模版,但是隻有名稱匹配“logstash-*”的索引才會應用該默版
template_name string “logstash” 是否啟用elasticsearch模版,Logstash自帶一個模版,但是隻有名稱匹配“logstash-*”的索引才會應用該默版
template_overwrite boolean false 始終
template string 設定自定義的默版存放路徑

四、安裝kibana

  1. 軟體下載
    連結:kibana-5.5.0-linux-x86_64.tar.gz
  2. 解壓檔案到指定目錄
    /usr/local/etc
  3. 修改配置檔案
server.port: 9000 # kibana 對外訪問埠
server.host: "X.X.X.100"  # kibana 對外訪問ip
elasticsearch.url: "http://X.X.X.100:9200" # kibana 連線es的ip地址,其中本專案中es 叢集有4哥幾點,3臺數據/主節點,1臺搜尋節點,kibana連線搜尋節點
  1. 啟動命令
    前臺執行:
    ./kibana
    後臺臺執行:
    ./kibana &
    停止:
    ps -ef|grep node kill 相應的程序
  2. 驗證
    X.X.X.100:9000

五、安裝kafka

  1. 軟體下載
    連結:kafka_2.11-0.10.2.1.tgz
  2. 解壓檔案到指定目錄
    /usr/local/etc
  3. 修改配置檔案
broker.id=1 #當前機器在叢集中的唯一標識,和zookeeper的myid性質一樣
delete.topic.enable=true #如果kafka啟動之前沒有配置delete.topic.enable=true,刪除topic只會標記為marked for deletion,加上配置,重啟kafka,之前的topic就真正刪除了
auto.create.topics.enable=false #是否自動建立topic,如果kafka中沒有topic,自動建立topic
listeners=PLAINTEXT://X.X.X.109:9092 #kafka監聽
advertised.listeners=PLAINTEXT://X.X.X.109:9092
num.network.threads=3 #這個是borker進行網路處理的執行緒數
num.io.threads=8 #這個是borker進行I/O處理的執行緒數
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/usr/local/etc/kafka/log  #訊息存放的目錄,這個目錄可以配置為“,”逗號分割的表示式,上面的num.io.threads要大於這個目錄的個數這個目錄,如果配置多個目錄,新建立的topic他把訊息持久化的地方是,當前以逗號分割的目錄中,那個分割槽數最少就放那一個
num.partitions=3 #預設的分割槽數,一個topic預設1個分割槽數
num.recovery.threads.per.data.dir=1
log.retention.hours=168 #預設訊息的最大持久化時間,168小時,7天
log.segment.bytes=1073741824 #這個引數是:因為kafka的訊息是以追加的形式落地到檔案,當超過這個值的時候,kafka會新起一個檔案
log.retention.check.interval.ms=300000 #每隔300000毫秒去檢查上面配置的log失效時間
zookeeper.connect=X.X.X.109:12181,X.X.X.108:12181,X.X.X.105:12181  #設定zookeeper的連線埠
zookeeper.connection.timeout.ms=6000  #設定zookeeper的連線超時時間
  1. 啟動命令
    ./kafka-server-start.sh -daemon ../config/server.properties
  2. 驗證啟動成功失敗
    執行命令jps檢視kafka程序

五、安裝zookeeper

  1. 軟體下載
    連結:zookeeper-3.4.10.tar.gz
  2. 解壓檔案到指定目錄
    /usr/local/etc
  3. 修改配置檔案
  • a. 配置zoo.cfg
    - 將/conf目錄下的zoo-sample.cfg檔案,複製並命名為zoo.cfg
tickTime=2000
initLimit=10 #對於從節點最初連線到主節點時的超時時間,單位為tick值的倍數
syncLimit=5 #對於主節點與從節點進行同步操作時的超時時間,單位為tick值的倍數
dataDir=/usr/local/etc/zookeeper/zkdata #用於配置記憶體資料庫儲存的模糊快照的目錄。即剛剛建立的data資料夾就是在此目錄中,檔案資訊都存放在data目錄下
clientPort=12181 #表示客戶端所連線的伺服器所監聽的埠號,預設是2181。即zookeeper對外提供訪問的埠號
server.1=X.X.X.109:12888:13888
server.2=X.X.X.108:12888:13888
server.3=X.X.X.105:12888:13888

-b. 配置zoo.cfg
- 在三個linux機器上剛剛建立的data目錄下新建一個myid檔案並開啟,vi myid命令,依次在3臺機器上輸入1、2、3,儲存退出。這裡的1,2,3是與server1,2,3相對應的

[[email protected]-41b-6 zkdata]$ more myid
1
  • c. 配置環境變數
    - vi etc/profile 輸入下面引數,儲存退出,source profile命令使修改生效
export ZOOKEEPER_HOME=/usr/local/etc/zookeeper/zookeeper-3.4.10/
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
  1. 啟動命令
    ./zkServer.sh start
  2. 驗證
    ./zkServer.sh status
    顯示
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg #配置檔案
Mode: follower #是否為leader
  1. 連線到zookeeper
    ./zkCli.sh -server X.X.X.108:12181

效果圖:
1.es節點圖,圖中帶星號的es2為master節點,es4為資料搜尋節點
在這裡插入圖片描述

2.kibana效果圖
在這裡插入圖片描述