Linux系統Centos7 基於Docker搭建ELK分散式日誌系統

来源:https://www.cnblogs.com/mazhilin/archive/2022/04/08/16119137.html
-Advertisement-
Play Games

ELK 基本概述 ELK是Elasticsearch、Logstash、Kibana的簡稱,常常用於部署分散式系統日誌服務。 Elasticsearch:全球實時全文搜索和分析引擎,提供搜集、分析、存儲數據三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分散式系統。它構 ...


ELK 基本概述

ELK是Elasticsearch、Logstash、Kibana的簡稱,常常用於部署分散式系統日誌服務。

  • Elasticsearch:全球實時全文搜索和分析引擎,提供搜集、分析、存儲數據三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分散式系統。它構建於Apache Lucene搜索引擎庫之上。
  • Logstash:用來搜集、分析、過濾日誌的工具。它支持幾乎任何類型的日誌,包括系統日誌、錯誤日誌和自定義應用程式日誌。它可以從許多來源接收日誌,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數據,包括電子郵件、websockets和Elasticsearch。
  • Kibana:基於Web的圖形可視化界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日誌數據。它利用Elasticsearch的REST介面來檢索數據,不僅允許用戶創建他們自己的數據的定製儀錶板視圖,還允許他們以特殊的方式查詢和過濾數據。

基本架構圖elk-architecture]:
ce9905fa6e9ea486655e7f0ce63aead9.png
應用程式將日誌按照約定的Key寫入Redis,Logstash從Redis中讀取日誌信息寫入ElasticSearch集群。Kibana讀取ElasticSearch中的日誌,併在Web頁面中以表格/圖表的形式展示。

搭建部署ElasticSearch服務

Docker 部署應用服務的基本步驟:Search[查詢鏡像]->Pull[拉取鏡像]->Run[部署鏡像]

1.查詢Elasticsearch 鏡像: docker search elasticsearch
elasticsearch-search

ps[註意事項]:

  1. 一般拉取鏡像資源都是從Docker官方倉庫[docker-hub]拉取,或者自己構建的Docker雲倉庫aliyun-docker
  2. 本教程選取的ELK鏡像均是基於ELK官方Docker倉庫elastic-io

2.拉取Elasticsearch 鏡像:docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.1
elasticsearch-pull

ps[註意事項]:
1.本教程採用7.3.x版本,目前最新版本7.4.x[主要用7.3.x版本在阿裡雲搭建過,避免入坑問題]
2.拉取的過程中可能會出現[net/http: TLS handshake timeout]問題,多嘗試幾次,主要是網路帶寬限制問題

3.修改鏡像名稱:docker tag docker.elastic.co/elasticsearch/elasticsearch:7.3.1  elasticsearch:latest
elasticsearch-tag

ps[註意事項]:
1.名稱過長導致查看些許不便,通過docker tag source-image[來源鏡像] target-image[目標鏡像],推薦統一採用[target-image:target-version]格式定義,且不占用空間,相當於重命名鏡像
2.對於拉取kibana[docker.elastic.co/kibana/kibana:7.3.1]和logstash[docker.elastic.co/logstash/logstash:7.3.1] 都建議修改。

4.部署鏡像服務:
部署命令:
docker run -itd -p 9200:9200 -p 9300:9300 --restart=always --privileged=true --name elasticsearch-server -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms=512m -Xms=512m" elasticsearch:latest

/usr/share/elasticsearch/config
/usr/share/elasticsearch/logs
查看容器列表:docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
docker ps
ps[註意事項]:

1.需要開放埠[9200和9300]->9200作為Http協議,主要用於外部通訊,9300作為Tcp協議,jar之間就是通過tcp協議通訊,通常部署集群就是通過9300通信。推薦[宿主機自定義埠:9200]
2.--restart=always :配置容器重啟策略,當宿主機重啟由於配置了開機自啟動,不用手動啟動
3.--privileged:配置容器操作許可權[true-root操作許可權,false-當前容器用戶操作許可權]
4.對於部署網路模式推薦預設橋接模式,也自定義可以host模式等

5.修改配置:
進入容器:docker exec -it container-id[容器id] or container-name[容器名稱] /bin/bash
例如:docker exec -it f2d2e97da375 /bin/bash #f2d2e97da375-> container-id
docker-exec

修改配置文件:

[root@f2d2e97da375 elasticsearch]# ls 
LICENSE.txt  NOTICE.txt  README.textile  bin  config  data  jdk  lib  logs  modules  plugins
[root@f2d2e97da375 elasticsearch]# 
[root@f2d2e97da375 elasticsearch]# cd config  
[root@f2d2e97da375 config]# ls
elasticsearch.keystore  elasticsearch.yml  jvm.options  log4j2.properties  role_mapping.yml  roles.yml  users  users_roles
[root@f2d2e97da375 config]# vi elasticsearch.yml 

添加跨域配置:http.cors.enabled: true && http.cors.allow-origin: "*"

cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"

然後退出exit容器,在宿主機重啟容器:docker restart container-id[容器id] or container-name[容器名稱]
docker restart f2d2e97da375

[root@f2d2e97da375 config]# exit
exit
[root@centos-meteor ~]# docker restart f2d2e97da375
f2d2e97da375
[root@centos-meteor ~]# 

ps[註意事項]:
1.進入容器方式:包括使用 docker attach 命令或 docker exec 命令,
推薦使用 docker exec 命令。原因:

  • docker attach: 使用exit退出容器,會導致容器的停止
  • docker exec:使用exit退出容器,不會導致容器的停止
  • 參考docker進入容器的幾種方法博客-docker進入容器的幾種方法
    2.如果Docker安裝了可視化界面 Portainer,推薦採用這種方式進入容器:
    docker-portainer

搭建部署ElasticSearch-Head服務

ElasticSearch-Head:彈性搜索集群的Web前端界面,是使用Nodjs構建的,主要用於查看ElasticSearch相關信息

1.拉取Elasticsearch-Head 鏡像:docker pull mobz/elasticsearch-head:5

[root@centos-amber ~]# docker pull mobz/elasticsearch-head:5
5: Pulling from mobz/elasticsearch-head
75a822cd7888: Pull complete 
57de64c72267: Pull complete 
4306be1e8943: Pull complete 
871436ab7225: Pull complete 
0110c26a367a: Pull complete 
1f04fe713f1b: Pull complete 
723bac39028e: Pull complete 
7d8cb47f1c60: Pull complete 
7328dcf65c42: Pull complete 
b451f2ccfb9a: Pull complete 
304d5c28a4cf: Pull complete 
4cf804850db1: Pull complete 
Digest: sha256:55a3c82dd4ba776e304b09308411edd85de0dc9719f9d97a2f33baa320223f34
Status: Downloaded newer image for mobz/elasticsearch-head:5
docker.io/mobz/elasticsearch-head:5
[root@centos-amber ~]# 

2.修改Elasticsearch-Head 鏡像名稱:docker tag  mobz/elasticsearch-head:5   elasticsearch-head:latest

[root@centos-amber ~]# docker tag  mobz/elasticsearch-head:5        elasticsearch-head:latest
[root@centos-amber ~]# docker images
REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
grafana/grafana                                 latest              05d1bcf30d16        7 days ago          207MB
nginx                                           latest              540a289bab6c        3 weeks ago         126MB
prom/prometheus                                 latest              2c8e464e47f4        3 weeks ago         129MB
moxm/sentinel-dashboard                         latest              0ccaac81584e        4 weeks ago         167MB
portainer                                       latest              4cda95efb0e4        4 weeks ago         80.6MB
portainer/portainer                             latest              4cda95efb0e4        4 weeks ago         80.6MB
apache/skywalking-ui                            latest              fa66ca9c9862        2 months ago        123MB
apache/skywalking-oap-server                    latest              376a37cdf65c        2 months ago        190MB
docker.elastic.co/kibana/kibana                 7.3.1               b54865ba6b0b        2 months ago        1.01GB
docker.elastic.co/elasticsearch/elasticsearch   7.3.1               3d3aa92f641f        2 months ago        807MB
elasticsearch                                   latest              3d3aa92f641f        2 months ago        807MB
prom/node-exporter                              latest              e5a616e4b9cf        5 months ago        22.9MB
google/cadvisor                                 latest              eb1210707573        12 months ago       69.6MB
elasticsearch-head                              latest              b19a5c98e43b        2 years ago         824MB
mobz/elasticsearch-head                         5                   b19a5c98e43b        2 years ago         824MB
tutum/influxdb                                  latest              c061e5808198        3 years ago         290MB
[root@centos-amber ~]# 

3.部署Elasticsearch-Head 容器:docker run -itd --restart=always --privileged=true -p 9100:9100 --name elasticsearch-head-server elasticsearch-head:latest
查看容器服務:docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
docker-elasticsearch-head
4.瀏覽器訪問:http://remote-ip:9100/
elasticsearch-head

搭建部署Kibana服務

1.拉取Kibana 鏡像:
docker pull docker.elastic.co/kibana/kibana:7.3.1
2.修改Kibana鏡像名稱:
docker tag docker.elastic.co/kibana/kibana:7.3.1  kibana:latest
3.部署Kibana鏡像容器:
docker run -itd -p 5601:5601 --restart=always --privileged=true --link
elasticsearch-server:elasticsearch --name kibana-server -e ELASTICSEARCH_URL=http://elasticsearch:9200 kibana:latest

搭建部署Logstash服務

1.拉取Logstash 鏡像:
docker pull docker.elastic.co/logstash/logstash:7.3.1
2.修改Kibana鏡像名稱:
docker tag docker.elastic.co/logstash/logstash:7.3.1  logstash:latest
3.部署Kibana鏡像容器:
docker run -itd --restart=always --privileged=true -p 5043:5043 --name logstash-server  --link elasticsearch-server:elasticsearch  logstash:latest
4.進入容器-修改配置logstash.yml:

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.url: http://host-ip:9200
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changme

ps[註意事項]:
1.host-ip是本機ip地址
5.進入容器-修改pipeline下的logstash.conf文件:

#預設配置
#========================================
#input {
#  beats {
#    port => 5044
#  }
#}

#output {
#  stdout {
#    codec => rubydebug
#  }
#}
#========================================
#添加配置
input {
        file {
            codec=> json
                path => "/usr/local/*.json"
        }
}
filter {
  #定義數據的格式
  grok {
    match => { "message" => "%{DATA:timestamp}\|%{IP:serverIp}\|%{IP:clientIp}\|%{DATA:logSource}\|%{DATA:userId}\|%{DATA:reqUrl}\|%{DATA:reqUri}\|%{DATA:refer}\|%{DATA:device}\|%{DATA:textDuring}\|%{DATA:duringTime:int}\|\|"}
  }
}
output {
   elasticsearch{
     hosts=> "http://host-ip:9200"
   }
}

6.退出容器在宿主機重啟elk相關的容器:docker restart elk相關容器服務

ps[註意事項]:如果Docker安裝了可視化界面 Portainer,可以在界面操作:
portainer-command

7.訪問地址:http://remote-ip:5601/,然後可就額操作kibana面板

搭建部署Apm-server服務和Filebeat服務

步驟基本和上述操作差不多,只是配置文件和埠可能不一致:
拉取鏡像:
docker pull docker.elastic.co/beats/filebeat:7.3.1
docker pull docker.elastic.co/apm/apm-server:7.3.1

修改鏡像名稱:
docker tag docker.elastic.co/beats/filebeat:7.3.1     filebeat:latest
docker tag docker.elastic.co/apm/apm-server:7.3.1     apm-server:latest

部署容器:
docker run -itd --restart=always --privileged=true  -p 5044:5044 --name filebeat-server --link logstash-server:logstash  filebeat:latest

docker run -itd --restart=always --privileged=true -p 8200:8200  --name apm-server  --link elasticsearch-server:elasticsearch apm-server:latest --strict.perms=false -e  -E output.elasticsearch.hosts=["elasticsearch:9200"]

最後修改配置文件整合相關資源,重啟容器服務

ps[註意事項]: 可以參考官方文檔:
elasticsearch:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/docker.html
kibana:https://www.elastic.co/guide/en/kibana/7.3/docker.html
logstash:https://www.elastic.co/guide/en/logstash/7.3/docker.html
filebeat:https://www.elastic.co/guide/en/beats/filebeat/7.3/running-on-docker.html
apm-server:https://www.elastic.co/guide/en/apm/server/7.3/running-on-docker.html

開發SpringBoot+Elasticsearch集成實戰

[1] 集成Maven配置方式:

Java與ElasticSearch連接的兩種方式:
(1)使用Transport與ElasticSearch建立連接

<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
<dependency>
       <groupId>org.elasticsearch</groupId>
       <artifactId>elasticsearch</artifactId>
       <version>6.4.2</version>
 </dependency>
   <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->      <dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>transport</artifactId>
   <version>6.4.2</version>
   <exclusions>
       <exclusion>
       <groupId>org.elasticsearch</groupId>
       <artifactId>elasticsearch</artifactId>
       </exclusion>
   </exclusions>
 </dependency>

(2)使用SpringDataElasticSearch建立連接

<dependency>    
<groupId>org.springframework.boot</groupId>    
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

或者:

dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    // 使用SpringDataElasticSearch只需要添加一處依賴即用
    compile('org.springframework.boot:spring-boot-starter-data-elasticsearch')
}

兩種方式的優缺點:
(1)優點:脫離框架,集成過程中不需要考慮與Spring的版本相容問題,容易集成
缺點:使用原生API操作ES,代碼量大,撰寫困難

(2)優點:將原生API進行封裝,提供了ElasticsearchRepository,操作ES非常簡單,與JPA同理
 缺點:出生於Spring家族,與SpringBoot,SpringData版本容易衝突

[2] 參數連接配置方式:

# Elasticsearch# 9200埠是用來讓HTTP REST API來訪問ElasticSearch,而9300埠是傳輸層監聽的預設埠
elasticsearch.ip=192.168.30.128
elasticsearch.port=9300
elasticsearch.pool=5
elasticsearch.cluster.name=my-application

node.name: "elasticsearch-server"
network.host: 0.0.0.0
network.bind_host: 0.0.0.0
network.publish_host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
bootstrap.memory_lock: true
transport.tcp.port: 9300
transport.tcp.compress: true
http.max_content_length: 128mb

版權聲明:本文為博主原創文章,遵循相關版權協議,如若轉載或者分享請附上原文出處鏈接和鏈接來源。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • cluster概念澄清 postgresql中沒有聚集索引的概念,表都是以堆(heap)的方式存在,可以認為數據在物理存儲上是無序的。cluster:這裡的cluster不是指多個機器的組成的集群,而是指表中數據行按照某種方式物理排序存儲。是一種改變postgresql表的物理存儲的一種方案。適應場 ...
  • 在鴻蒙開發中tab切換功能(如下圖所示)是非常常見一個功能,今天描述如下功能怎麼實現?開發中需要準備哪些資料? 今天我們從“資料準備”,“Tabs功能實現”,“底部按鈕功能實現”,“運行效果”四個方面進行描述 1. 開發準備 1.1 資料準備 想要實現如上圖功能的話,需要學習“Tabs”,“TabC ...
  • 背景 開發者在應用中集成HMS Core部分服務時,android sdk 以及flutter等跨平臺sdk,會出現編譯打包後,運行報6003錯誤碼的情況。根據查詢可以得知,錯誤代碼 6003 表示證書指紋配置不一致,主要是生成的包(例如安卓apk)的簽名,與華為開發者平臺上應用設置裡面配置的不一致 ...
  • 即時通訊(Instant Messaging)是一種基於互聯網的即時交流消息的業務。 實時聊天交互功能是市面上主流APP的重要功能之一,人們所熟悉的就是微信,QQ的聊天消息系統,IM看似簡單,技術開發絕非易事,海量併發,超低延時,消息必達等高實時性需求需要眾多技術的應用合體; IM結合RTC可以... ...
  • pinia是一個vue的狀態存儲庫,你可以使用它來存儲、共用一些跨組件或者頁面的數據,使用起來和vuex非常類似。pina相對Vuex來說,更好的ts支持和代碼自動補全功能。本篇隨筆介紹pinia的基礎用法以及持久化存儲的一些用法,供參考學習。 pinia在2019年11月開始時候是一個實驗項目,目... ...
  • element組件的change方法預設獲取的只有選擇的id,如果同時我們想要獲得選中的name或其他數據則是不行的 這時候組件本身給我們提供了方法 下麵是使用方法 HTML <el-form-item label="排查地點" class="requireds-label"> <el-cascad ...
  • 寫過前端代碼大概率聽說過amd cmd umd commonjs esm這些名詞, 想當初我第一次看到這些的時候, 人都麻了, 都是些啥啊. 後來我知道了, 這些都是js的模塊規範. amd - 瀏覽器中的js模塊化解決方案 AMD全稱是Async Module Definition非同步模塊定義 R ...
  • web前端開發規範 規範概述 一個人走的更快,一群人可以走的更遠,前提是統一的策略,還要不斷地反省和優化。不管有多少人共同參與同一項目,儘可能確保每一行代碼都像是同一個人編寫的 開發目錄規範 開發環境規範 開發編碼規範 一、目錄及文件命名規範 (一)、例靜態專題頁目錄 - src / html 源代 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...