ELK搭建(docker環境)


ELK搭建

ELK是Elasticsearch、Logstash、Kibana的簡稱,這三者是核心套件實現日志采集、分析、展示,但並非全部。

Elasticsearch是實時全文搜索和分析引擎,提供搜集、分析、存儲數據三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分布式系統。它構建於Apache Lucene搜索引擎庫之上。

Logstash是一個用來搜集、分析、過濾日志的工具。它支持幾乎任何類型的日志,包括系統日志、錯誤日志和自定義應用程序日志。它可以從許多來源接收日志,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數據,包括電子郵件、websockets和Elasticsearch。

Kibana是一個基於Web的圖形界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日志數據。它利用Elasticsearch的REST接口來檢索數據,不僅允許用戶創建他們自己的數據的定制儀表板視圖,還允許他們以特殊的方式查詢和過濾數據。

一、參考資料

二、下載相關的docker鏡像

docker pull elasticsearch:7.6.0
docker pull kibana:7.6.0
docker pull logstash:7.6.0
docker pull mobz/elasticsearch‐head:5

三、 安裝elasticsearch

創建一個elk文件夾, 后面的elk日志采集系統的配置文件都放在這里面

mkdir /home/elk

創建elasticsearch配置文件

vi /home/elk/elasticsearch.yml

在里面添加如下配置:

cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 訪問ID限定,0.0.0.0為不限制,生產環境請設置為固定IP
transport.host: 0.0.0.0
# elasticsearch節點名稱
node.name: node-1
# elasticsearch節點信息
cluster.initial_master_nodes: ["node-1"]
# 下面的配置是關閉跨域驗證(可以不開啟)
http.cors.enabled: true
http.cors.allow-origin: "*"

創建並啟動elasticsearch容器

docker run -di -p 9200:9200 -p 9300:9300 --name=elasticsearch -v /home/elk/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:7.6.0

Elasticsearch默認是集群模式,集群模式下對機器配置較高;可以指定使用單機版的部署。下面是啟動命令:

docker run -d --restart=always --name es7 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.0

之后通過9200端口在瀏覽器上訪問(需要開啟外網訪問權限),有信息返回則成功;,像下面的信息:

{
  "name" : "node-1",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "7jUr1QFPQcSbDGG4A4c5Og",
  "version" : {
    "number" : "7.6.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
    "build_date" : "2020-02-06T00:09:00.449973Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

注意:如果需要添加插件時,需要將容器的插件目錄映射到實際的路徑中或者通過命令(如安裝ik分詞器:docker cp ik elasticsearch:/usr/share/elasticsearch/plugins/)將其拷貝到容器中

可能遇到的問題

1. 啟動成功后,過了一會就停止

這與我們剛才修改的配置有關,因為elasticsearch在啟動的時候會進行一些檢查,比如最多打開的文件的個數以及虛擬內存
區域數量等等,如果你放開了此配置,意味着需要打開更多的文件以及虛擬內存(實際就是硬件配置達不到它的要求),所以我們還需要系統調優。

  • 修改/etc/security/limits.conf ,添加如下內容:

      * soft nofile 65536
      * hard nofile 65536
    

nofile是單個進程允許打開的最大文件個數 soft nofile 是軟限制 hard nofile是硬限制

  • 修改/etc/sysctl.conf,追加內容

      vm.max_map_count=655360
    

vm.max_map_count是限制一個進程可以擁有的VMA(虛擬內存區域)的數量

執行下面命令 修改內核參數馬上生效,之后重啟服務器和docker服務

sysctl ‐p
2. 啟動失敗顯示如下日志信息
ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

這個是由於elasticsearch7是集群多節點的版本,需要在elasticsearch.yml中添加如下配置(我們已經在上面配置了無需再處理):

# elasticsearch節點名稱
node.name: node-1
# elasticsearch節點信息
cluster.initial_master_nodes: ["node-1"]
3. 外網上已經可以通過9200端口推送數據和查詢數據,但是后面安裝的kibana等組件卻無法連

查看日志發現如下錯誤

error=>"Elasticsearch Unreachable: [http://192.168.6.128:9200/][Manticore::...

這個問題通常是由於安裝在一台機器上的docker容器,防火牆開啟的狀態下,docker容器內部無法訪問宿主機服務(能夠訪問非宿主機的其他局域網計算機的服務),解決方法如下3種:

  1. 配置防火牆規則firewall-cmd --zone=public --add-port={port}/tcp --permanent,並重載防火牆規則firewall-cmd --reload

     firewall-cmd --zone=public --add-port=9200/tcp --permanent
     firewall-cmd --reload
    
  2. 啟動容器時使用--net host模式(docker的4種網絡模式:https://www.jianshu.com/p/22a7032bb7bd)

  3. 關閉防火牆(不建議)

安裝elasticsearch‐head插件做調試使用(可以不安裝)

docker run ‐di ‐‐name=es-head ‐p 9100:9100 mobz/elasticsearch‐head:5

啟動成功后訪問9100端口即可使用界面化進行管理elasticsearch。

在本地電腦上安裝
  1. 下載head插件:https://github.com/mobz/elasticsearch-head

  2. 將grunt安裝為全局命令 。Grunt是基於Node.js的項目構建工具。它可以自動運行你所 設定的任務

     npm install ‐g grunt‐cli
    
  3. 安裝依賴

     npm install
    
  4. 啟動

     grunt server
    

打開瀏覽器,輸入 http://localhost:9100

四、安裝kibana

kibana主要用於對elasticsearch的數據進行分析查看。注意選擇的版本必須和elasticsearch的版本相同或者低,建議和elasticsearch的版本相同,否則會無法將無法使用kibana。

創建配置文件

vi /home/elk/kibana.yml

在里面編寫如下配置:

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch的IP:9200"]
# 操作界面語言設置為中文
i18n.locale: "zh-CN"

創建並啟動kibana容器

docker run -di --name kibana -p 5601:5601 -v /home/elk/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.6.0

啟動成功后訪問5601端口即可進入kibana管理界面。(進入后要求選擇配置,直接選擇自己瀏覽即可)

操作說明

剛進入系統時會有如下提示,任意選擇即可

創建索引模式,以便我們可以查看日志信息




五、安裝logstash

logstash會將收到的日志信息推送到elasticsearch中

創建配置文件

vi /home/elk/kibana.yml

在里面添加如下配置:

input {
    tcp {
        port => 5044
		# 輸入為json數據
        codec => json_lines
    }
}
filter {

}
output {
	# 這個是logstash的控制台打印(進行安裝調試的時候開啟,稍后成功后去掉這個配置即可)
	stdout {
		codec => rubydebug
	}
	# elasticsearch配置
	elasticsearch {
		hosts => ["elasticsearch的IP:9200"]
		# 索引名稱,沒有會自動創建
		index => "logstash-%{[server_name]}-%{+YYYY.MM.dd}"
	}
}

%{[server_name]} 說明:這個是取輸入的json數據中的key為server_name值。

創建和啟動logstash容器

docker run -di -p 5044:5044 -v /home/elk/logstash.conf:/usr/share/logstash/pipeline/logstash.conf --name logstash logstash:7.6.0

將微服務的日志推送到logstash中

下面以springboot項目為例

添加maven依賴

    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>6.3</version>
    </dependency>

下面以springboot中使用logback作為日志處理工具,配置文件(logback-spring.xml)配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 控制台輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg) %n</pattern>
        </layout>
    </appender>
    <!--logback輸出-->
    <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.0.111:5044</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <!-- 打印行號、方法名,官方不建議在生產環境開啟此配置,默認為false(關閉),具網友測試開啟后的耗時是未開啟的大約360倍的時間(業務量小的時候可以忽略) -->
            <includeCallerData>true</includeCallerData>
            <!-- 設置時區-->
            <timeZone>UTC</timeZone>
            <!-- 日期格式化-->
			<!-- <timestampPattern>yyyy-MM-dd'T'HH:mm:ss.SSS</timestampPattern>-->
            <!-- 添加自定義屬性,這里的server_name是服務名-->
            <customFields>{"server_name":"demo-server"}</customFields>
        </encoder>
        <!-- 設置超時時間, 默認沒有,使用集群的時候可以加上-->
		<!--<writeTimeout>30 seconds</writeTimeout>-->
    </appender>

    <root level="INFO">
        <!--本地開發調試將控制台輸出打開,同時將日志文件輸出關閉,提高日志性能;線上部署請務必將控制台輸出關閉-->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="STASH"/>
    </root>
</configuration>

更詳細的配置說明見官方文檔:https://github.com/logstash/logstash-logback-encoder

注意生產環境中請把權限相關驗證配置上


免責聲明!

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



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