系統(tǒng) | CentOS 7 |
Docker | Docker version 19.03.5 |
CPU | 2核 |
內(nèi)存 | 2.5G |
磁盤 | 30G(推薦設(shè)置,磁盤不足可能會引發(fā)es報錯) |
Filebeat | v7.3.0,單節(jié)點(diǎn) |
ElasticSearch | v7.3.0,兩份片 |
Kibana | v7.3.0,單節(jié)點(diǎn) |
Logstash | v7.3.1,單節(jié)點(diǎn) |
ELK分布式集群部署方案
linux中elasticsearch用戶擁有的內(nèi)存權(quán)限太小,至少需要262144,報錯信息(max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]),因此先修改系統(tǒng)配置。
# 修改配置sysctl.conf vi /etc/sysctl.conf # 添加下面配置: vm.max_map_count=262144 # 重新加載: sysctl -p # 最后重新啟動elasticsearch,即可啟動成功。
環(huán)境均采用Docker部署,為了更方便的使用Docker命令,我們安裝一下bash-completion自動補(bǔ)全插件:
# 安裝依賴工具bash-complete yum install -y bash-completion ource /usr/share/bash-completion/completions/docker source /usr/share/bash-completion/bash_completion
部署順序:ES --> Kibana --> Logstash --> Filebeat
ElasticSearch7.3.0部署
主節(jié)點(diǎn)部署
創(chuàng)建配置文件和數(shù)據(jù)存放目錄
mkdir -p {/mnt/es1/master/data,/mnt/es1/master/logs} vim /mnt/es1/master/conf/es-master.yml
es-master.yml配置
# 集群名稱 cluster.name: es-cluster # 節(jié)點(diǎn)名稱 node.name: es-master # 是否可以成為master節(jié)點(diǎn) node.master: true # 是否允許該節(jié)點(diǎn)存儲數(shù)據(jù),默認(rèn)開啟 node.data: false # 網(wǎng)絡(luò)綁定 network.host: 0.0.0.0 # 設(shè)置對外服務(wù)的http端口 http.port: 9200 # 設(shè)置節(jié)點(diǎn)間交互的tcp端口 transport.port: 9300 # 集群發(fā)現(xiàn) discovery.seed_hosts: - 172.17.0.2:9300 - 172.17.0.3:9301 # 手動指定可以成為 mater 的所有節(jié)點(diǎn)的 name 或者 ip,這些配置將會在第一次選舉中進(jìn)行計算 cluster.initial_master_nodes: - 172.17.0.2 # 支持跨域訪問 http.cors.enabled: true http.cors.allow-origin: "*" # 安全認(rèn)證 xpack.security.enabled: false #http.cors.allow-headers: "Authorization" bootstrap.memory_lock: false bootstrap.system_call_filter: false #解決跨域問題 #http.cors.enabled: true #http.cors.allow-origin: "*" #http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE #http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length, X-User"
pull鏡像時會有些慢,耐心等待!
# 拉取鏡像,可以直接構(gòu)建容器,忽略此步 docker pull elasticsearch:7.3.0 # 構(gòu)建容器 ## 映射5601是為Kibana預(yù)留的端口 docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" \ -p 9200:9200 -p 9300:9300 -p 5601:5601 \ -v /mnt/es1/master/conf/es-master.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /mnt/es1/master/data:/usr/share/elasticsearch/data \ -v /mnt/es1/master/logs:/usr/share/elasticsearch/logs \ -v /etc/localtime:/etc/localtime \ --name es-master elasticsearch:7.3.0
/etc/localtime:/etc/localtime:宿主機(jī)與容器時間同步。
從節(jié)點(diǎn)部署
創(chuàng)建配置文件和數(shù)據(jù)存放目錄
mkdir -p {/mnt/es1/slave1/data,/mnt/es1/slave1/logs} vim /mnt/es1/slave1/conf/es-slave1.yml
es-slave1.yml配置
# 集群名稱 cluster.name: es-cluster # 節(jié)點(diǎn)名稱 node.name: es-slave1 # 是否可以成為master節(jié)點(diǎn) node.master: true # 是否允許該節(jié)點(diǎn)存儲數(shù)據(jù),默認(rèn)開啟 node.data: true # 網(wǎng)絡(luò)綁定 network.host: 0.0.0.0 # 設(shè)置對外服務(wù)的http端口 http.port: 9201 # 設(shè)置節(jié)點(diǎn)間交互的tcp端口 transport.port: 9301 # 集群發(fā)現(xiàn) discovery.seed_hosts: - 172.17.0.2:9300 - 172.17.0.3:9301 # 手動指定可以成為 mater 的所有節(jié)點(diǎn)的 name 或者 ip,這些配置將會在第一次選舉中進(jìn)行計算 cluster.initial_master_nodes: - 172.17.0.2 # 支持跨域訪問 http.cors.enabled: true http.cors.allow-origin: "*" # 安全認(rèn)證 xpack.security.enabled: false #http.cors.allow-headers: "Authorization" bootstrap.memory_lock: false bootstrap.system_call_filter: false
pull鏡像時會有些慢,耐心等待!
# 拉取鏡像,可以直接構(gòu)建容器,忽略此步 docker pull elasticsearch:7.3.0 # 構(gòu)建容器 docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" \ -p 9201:9200 -p 9301:9300 \ -v /mnt/es1/slave1/conf/es-slave1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /mnt/es1/slave1/data:/usr/share/elasticsearch/data \ -v /mnt/es1/slave1/logs:/usr/share/elasticsearch/logs \ -v /etc/localtime:/etc/localtime \ --name es-slave1 elasticsearch:7.3.0
修改配置重啟容器
# 查看主從容器IP docker inspect es-master docker inspect es-slave1
修改ES配置文件es-master.yml、es-slave1.yml中的discovery.seed_hosts、cluster.initial_master_nodes為對應(yīng)的IP!重啟容器:
docker restart es-master docker restart es-slave1 # 查看es日志 docker logs -f --tail 100f es-master
訪問http://IP:9200/_cat/nodes確認(rèn)查看ES集群信息,可以看到有主從節(jié)點(diǎn)部署成功:
節(jié)點(diǎn)部署常用API:
API | 功能 |
http://IP:9200 | 查看ES版本信息 |
http://IP:9200/_cat/nodes |
查看所有分片 |
http://IP:9200/_cat/indices | 查看所有索引 |
Kibana7.3.0部署
創(chuàng)建Kibana配置文件
vim /mnt/kibana.yml # ## ** THIS IS AN AUTO-GENERATED FILE ** ## # ## Default Kibana configuration for docker target server.name: kibana #配置Kibana的遠(yuǎn)程訪問 server.host: "0.0.0.0" #配置es訪問地址 elasticsearch.hosts: [ "http://127.0.0.1:9200" ] #漢化界面 i18n.locale: "zh-CN" #xpack.monitoring.ui.container.elasticsearch.enabled: true
查看es-master容器ID
docker ps|grep es-master
部署Kibana
注意將命令中的40eff5876ffd 修改成es-master容器ID,拉取鏡像,情耐性等待!
# 拉取鏡像,可以直接構(gòu)建容器,忽略此步 docker pull docker.elastic.co/kibana/kibana:7.3.0 # 構(gòu)建容器 ## --network=container 表示共享容器網(wǎng)絡(luò) docker run -it -d \ -v /mnt/kibana.yml:/usr/share/kibana/config/kibana.yml \ -v /etc/localtime:/etc/localtime \ -e ELASTICSEARCH_URL=http://172.17.0.2:9200 \ --network=container:40eff5876ffd \ --name kibana docker.elastic.co/kibana/kibana:7.3.0
查看Kibana容器日志,看到如下圖所示日志則表示啟動成功
docker logs -f --tail 100f kibana
訪問http://IP:5601,可能會出現(xiàn)503,等一會在訪問就OK了??梢栽L問到Kibana控制臺則表示Kibana已安裝成功,并已于es-master建立連接。
Logstash7.3.1部署
編寫Logstash配置文件
vim /mnt/logstash-filebeat.conf
input { # 來源beats beats { # 端口 port => "5044" } } # 分析、過濾插件,可以多個 filter { grok { # grok 表達(dá)式存放的地方 patterns_dir => "/grok" # grok 表達(dá)式重寫 # match => {"message" => "%{SYSLOGBASE} %{DATA:message}"} # 刪除掉原生 message字段 overwrite => ["message"] # 定義自己的格式 match => { "message" => "%{URIPATH:request} %{IP:clientip} %{NUMBER:response:int} \"%{WORD:sources}\" (?:%{URI:referrer}|-) \[%{GREEDYDATA:agent}\] \{%{GREEDYDATA:params}\}" } } # 查詢歸類插件 geoip { source => "message" } } output { # 選擇elasticsearch elasticsearch { # es 集群 hosts => ["http://172.17.0.2:9200"] #username => "root" #password => "123456" # 索引格式 index => "omc-block-server-%{[@metadata][version]}-%{+YYYY.MM.dd}" # 設(shè)置為true表示如果你有一個自定義的模板叫l(wèi)ogstash,那么將會用你自定義模板覆蓋默認(rèn)模板logstash template_overwrite => true } }
部署Logstash
# 拉取鏡像,可以直接構(gòu)建容器,忽略此步 docker pull logstash:7.3.1 # 構(gòu)建容器 # xpack.monitoring.enabled 打開X-Pack的安全和監(jiān)視服務(wù) # xpack.monitoring.elasticsearch.hosts 設(shè)置ES地址,172.17.0.2為es-master容器ip # docker允許在容器啟動時執(zhí)行一些命令,logsatsh -f 表示通過指定配置文件運(yùn)行l(wèi)ogstash,/usr/share/logstash/config/logstash-sample.conf是容器內(nèi)的目錄文件 docker run -p 5044:5044 -d \ -v /mnt/logstash-filebeat.conf:/usr/share/logstash/config/logstash-sample.conf \ -v /etc/localtime:/etc/localtime \ -e elasticsearch.hosts=http://172.17.0.2:9200 \ -e xpack.monitoring.enabled=true \ -e xpack.monitoring.elasticsearch.hosts=http://172.17.0.2:9200 \ --name logstash logstash:7.3.1 -f /usr/share/logstash/config/logstash-sample.conf
這里需要注意es集群地址,這里我們只配置es-master的ip(172.17.0.2),詳細(xì)Logstash配置。 查看到如下日志則表示安裝成功:
Filebeat7.3.0部署
Filebeat 并不是一個必須的組件,通過Logstash我們同樣也可以實(shí)現(xiàn)日志的搬運(yùn)工作。
例如,實(shí)現(xiàn)將所有非“20”開頭的日志進(jìn)行合并,可以使用如下Logstash配置:
input { # 來源beats beats { # 端口 port => "5044" } file { type => "server-log" path => "/logs/*.log" start_position => "beginning" codec=>multiline{ // 正則表達(dá)式,所有“20”前綴日志, 如果你的日志是以“[2020-06-15”這類前綴則,可以替換成"^[" pattern => "^20" // 是否對正則規(guī)則取反 negate => true // previous 表示合并到上一行,next 表示合并到下一行 what => "previous" } } }
注意,F(xiàn)ilebeat必須與應(yīng)用部署在同一服務(wù)器,這里應(yīng)用采用docker部署,/mnt/omc-dev/logs應(yīng)用日志文件的映射目錄,如果你也是通過docker進(jìn)行服務(wù)部署,請記得通過【-v /mnt/omc-dev/logs:/應(yīng)用工作/logs】日志文件映射出來哦!
創(chuàng)建Filebeat配置文件
## /mnt/omc-dev/logs 為應(yīng)用日志目錄,必須將應(yīng)用的部署目錄映射出來 mkdir -p {/mnt/omc-dev/logs,/mnt/filebeat/logs,/mnt/filebeat/data} vim /mnt/filebeat/filebeat.yml
filebeat.inputs: - type: log enabled: true paths: # 當(dāng)前目錄下的所有.log文件 - /home/project/spring-boot-elasticsearch/logs/*.log multiline.pattern: '^20' multiline.negate: true multiline.match: previous logging.level: debug filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false setup.template.settings: index.number_of_shards: 1 setup.dashboards.enabled: false setup.kibana: host: "http://172.17.0.2:5601" # 不直接傳輸至ES #output.elasticsearch: # hosts: ["http://es-master:9200"] # index: "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}" output.logstash: hosts: ["172.17.0.5:5044"] #scan_frequency: 1s close_inactive: 12h backoff: 1s max_backoff: 1s backoff_factor: 1 flush.timeout: 1s processors: - add_host_metadata: ~ - add_cloud_metadata: ~
注意修改Logstash IP和端口。
# 拉取鏡像,可以直接構(gòu)建容器,忽略此步 docker pull docker.elastic.co/beats/filebeat:7.3.0 # 構(gòu)建容器 ## --link logstash 將指定容器連接到當(dāng)前連接,可以設(shè)置別名,避免ip方式導(dǎo)致的容器重啟動態(tài)改變的無法連接情況,logstash 為容器名 docker run -d -v /mnt/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \ -v /mnt/omc-dev/logs:/home/project/spring-boot-elasticsearch/logs \ -v /mnt/filebeat/logs:/usr/share/filebeat/logs \ -v /mnt/filebeat/data:/usr/share/filebeat/data \ -v /etc/localtime:/etc/localtime \ --link logstash --name filebeat docker.elastic.co/beats/filebeat:7.3.0
查看日志,我們在配置文件中將Filebeat的日志級別配置成了debug,因此會開到所有收錄到的信息
docker logs -f --tail 100f filebeat
可以看到,通過查詢ES索引,多出了三條索引,通過我們配置的按天進(jìn)行索引分割,因?yàn)槲疫@個環(huán)境已經(jīng)跑了三天了,所以存在三個omc服務(wù)的索引(omc 是一個定時任務(wù)的服務(wù),你也可以寫一個簡單的定時任務(wù)來進(jìn)行測試)。
接下來我們創(chuàng)建一個Kibana索引模式,并進(jìn)行日志查詢:
索引創(chuàng)建完成,到Discover視圖就可以通過索引模式查詢?nèi)罩玖恕?/p>
文章到這里就結(jié)束了,如果你還有別的服務(wù)需要引入的話,只需要將日志掛載到指定目錄就行了,當(dāng)然如果服務(wù)是部署在其他服務(wù)器上,則需要在服務(wù)器上部署Filebeat,并且要保證服務(wù)器之間網(wǎng)絡(luò)互通哦~~
最后,在這里推薦一個開源ELK自動化Docker部署項(xiàng)目:https://github.com/deviantony/docker-elk.git
--------------------------------------------------------
2020.6.28更新
最近發(fā)生了一起Logstash導(dǎo)致的物理內(nèi)存暴漲問題。
簡單闡述一下主要問題:
目前單服務(wù)單日日志量在2.2GB左右,由于早期沒有限制Logstash內(nèi)存,導(dǎo)致大量數(shù)據(jù)上來時,Logstash瘋狂占用內(nèi)存與IO。
隨著近日,在同一服務(wù)器上面應(yīng)用服務(wù)流量上漲,最終導(dǎo)致內(nèi)存不足,出現(xiàn)OutOfMemoryError問題。
隨后,通過設(shè)置優(yōu)化JVM內(nèi)存(具體我就不說了,網(wǎng)上一大把),并添加上Logstash響應(yīng)內(nèi)存配置,得以解決早前的遺留問題。
最后,將Logstash 添加到Kibana進(jìn)行監(jiān)控(當(dāng)然你還可以將Logstash日志配置到ES上去):
https://blog.csdn.net/QiaoRui_/article/details/97667293
標(biāo)簽:亳州 澳門 拉薩 齊齊哈爾 衡陽 烏海 嘉興 運(yùn)城
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Docker部署ELK7.3.0日志收集服務(wù)最佳實(shí)踐》,本文關(guān)鍵詞 Docker,部署,ELK7.3.0,日志,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。