ELK搭建(Docker環(huán)境)

ELK搭建

ELK是Elasticsearch、Logstash、Kibana的簡(jiǎn)稱,這三者是核心套件實(shí)現(xiàn)日志采集、分析、展示,但并非全部。

Elasticsearch是實(shí)時(shí)全文搜索和分析引擎,提供搜集、分析、存儲(chǔ)數(shù)據(jù)三大功能;是一套開放REST和JAVA API等結(jié)構(gòu)提供高效搜索功能,可擴(kuò)展的分布式系統(tǒng)。它構(gòu)建于Apache Lucene搜索引擎庫之上。

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

Kibana是一個(gè)基于Web的圖形界面,用于搜索、分析和可視化存儲(chǔ)在 Elasticsearch指標(biāo)中的日志數(shù)據(jù)。它利用Elasticsearch的REST接口來檢索數(shù)據(jù),不僅允許用戶創(chuàng)建他們自己的數(shù)據(jù)的定制儀表板視圖,還允許他們以特殊的方式查詢和過濾數(shù)據(jù)。

一、參考資料

二、下載相關(guān)的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

創(chuàng)建一個(gè)elk文件夾, 后面的elk日志采集系統(tǒng)的配置文件都放在這里面

mkdir /home/elk

創(chuàng)建elasticsearch配置文件

vi /home/elk/elasticsearch.yml

在里面添加如下配置:

cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 訪問ID限定,0.0.0.0為不限制,生產(chǎn)環(huán)境請(qǐng)?jiān)O(shè)置為固定IP
transport.host: 0.0.0.0
# elasticsearch節(jié)點(diǎn)名稱
node.name: node-1
# elasticsearch節(jié)點(diǎn)信息
cluster.initial_master_nodes: ["node-1"]
# 下面的配置是關(guān)閉跨域驗(yàn)證(可以不開啟)
http.cors.enabled: true
http.cors.allow-origin: "*"

創(chuàng)建并啟動(dòng)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

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

{
  "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"
}

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

可能遇到的問題

1. 啟動(dòng)成功后,過了一會(huì)就停止

這與我們剛才修改的配置有關(guān),因?yàn)閑lasticsearch在啟動(dòng)的時(shí)候會(huì)進(jìn)行一些檢查,比如最多打開的文件的個(gè)數(shù)以及虛擬內(nèi)存
區(qū)域數(shù)量等等,如果你放開了此配置,意味著需要打開更多的文件以及虛擬內(nèi)存(實(shí)際就是硬件配置達(dá)不到它的要求),所以我們還需要系統(tǒng)調(diào)優(yōu)。

  • 修改/etc/security/limits.conf ,添加如下內(nèi)容:

      * soft nofile 65536
      * hard nofile 65536
    

nofile是單個(gè)進(jìn)程允許打開的最大文件個(gè)數(shù) soft nofile 是軟限制 hard nofile是硬限制

  • 修改/etc/sysctl.conf,追加內(nèi)容

      vm.max_map_count=655360
    

vm.max_map_count是限制一個(gè)進(jìn)程可以擁有的VMA(虛擬內(nèi)存區(qū)域)的數(shù)量

執(zhí)行下面命令 修改內(nèi)核參數(shù)馬上生效,之后重啟服務(wù)器和docker服務(wù)

sysctl ‐p
2. 啟動(dòng)失敗顯示如下日志信息
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

這個(gè)是由于elasticsearch7是集群多節(jié)點(diǎn)的版本,需要在elasticsearch.yml中添加如下配置(我們已經(jīng)在上面配置了無需再處理):

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

查看日志發(fā)現(xiàn)如下錯(cuò)誤

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

這個(gè)問題通常是由于安裝在一臺(tái)機(jī)器上的docker容器,防火墻開啟的狀態(tài)下,docker容器內(nèi)部無法訪問宿主機(jī)服務(wù)(能夠訪問非宿主機(jī)的其他局域網(wǎng)計(jì)算機(jī)的服務(wù)),解決方法如下3種:

  1. 配置防火墻規(guī)則firewall-cmd --zone=public --add-port={port}/tcp --permanent,并重載防火墻規(guī)則firewall-cmd --reload

     firewall-cmd --zone=public --add-port=9200/tcp --permanent
     firewall-cmd --reload
    
  2. 啟動(dòng)容器時(shí)使用--net host模式(docker的4種網(wǎng)絡(luò)模式:http://www.itdecent.cn/p/22a7032bb7bd

  3. 關(guān)閉防火墻(不建議)

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

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

啟動(dòng)成功后訪問9100端口即可使用界面化進(jìn)行管理elasticsearch。

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

  2. 將grunt安裝為全局命令 。Grunt是基于Node.js的項(xiàng)目構(gòu)建工具。它可以自動(dòng)運(yùn)行你所 設(shè)定的任務(wù)

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

     npm install
    
  4. 啟動(dòng)

     grunt server
    

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

四、安裝kibana

kibana主要用于對(duì)elasticsearch的數(shù)據(jù)進(jìn)行分析查看。注意選擇的版本必須和elasticsearch的版本相同或者低,建議和elasticsearch的版本相同,否則會(huì)無法將無法使用kibana。

創(chuàng)建配置文件

vi /home/elk/kibana.yml

在里面編寫如下配置:

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

創(chuàng)建并啟動(dòng)kibana容器

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

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

操作說明

剛進(jìn)入系統(tǒng)時(shí)會(huì)有如下提示,任意選擇即可


創(chuàng)建索引模式,以便我們可以查看日志信息




五、安裝logstash

logstash會(huì)將收到的日志信息推送到elasticsearch中

創(chuàng)建配置文件

vi /home/elk/logstash.conf

在里面添加如下配置:

input {
    tcp {
        port => 5044
        # 輸入為json數(shù)據(jù)
        codec => json_lines
    }
}
filter {

}
output {
    # 這個(gè)是logstash的控制臺(tái)打?。ㄟM(jìn)行安裝調(diào)試的時(shí)候開啟,稍后成功后去掉這個(gè)配置即可)
    stdout {
        codec => rubydebug
    }
    # elasticsearch配置
    elasticsearch {
        hosts => ["elasticsearch的IP:9200"]
        # 索引名稱,沒有會(huì)自動(dòng)創(chuàng)建
        index => "logstash-%{[server_name]}-%{+YYYY.MM.dd}"
    }
}

%{[server_name]} 說明:這個(gè)是取輸入的json數(shù)據(jù)中的key為server_name值。

創(chuàng)建和啟動(dòng)logstash容器

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

將微服務(wù)的日志推送到logstash中

下面以springboot項(xiàng)目為例

添加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>
    <!-- 控制臺(tái)輸出 -->
    <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">
            <!-- 打印行號(hào)、方法名,官方不建議在生產(chǎn)環(huán)境開啟此配置,默認(rèn)為false(關(guān)閉),具網(wǎng)友測(cè)試開啟后的耗時(shí)是未開啟的大約360倍的時(shí)間(業(yè)務(wù)量小的時(shí)候可以忽略) -->
            <includeCallerData>true</includeCallerData>
            <!-- 設(shè)置時(shí)區(qū)-->
            <timeZone>UTC</timeZone>
            <!-- 日期格式化-->
            <!-- <timestampPattern>yyyy-MM-dd'T'HH:mm:ss.SSS</timestampPattern>-->
            <!-- 添加自定義屬性,這里的server_name是服務(wù)名-->
            <customFields>{"server_name":"demo-server"}</customFields>
        </encoder>
        <!-- 設(shè)置超時(shí)時(shí)間, 默認(rèn)沒有,使用集群的時(shí)候可以加上-->
        <!--<writeTimeout>30 seconds</writeTimeout>-->
    </appender>

    <root level="INFO">
        <!--本地開發(fā)調(diào)試將控制臺(tái)輸出打開,同時(shí)將日志文件輸出關(guān)閉,提高日志性能;線上部署請(qǐng)務(wù)必將控制臺(tái)輸出關(guān)閉-->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="STASH"/>
    </root>
</configuration>

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

注意生產(chǎn)環(huán)境中請(qǐng)把權(quán)限相關(guān)驗(yàn)證配置上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容