Docker部署ELK7.3.0日志收集服务最佳实践

Docker部署ELK7.3.0日志收集服务最佳实践,第1张

Docker部署ELK7.3.0日志收集服务最佳实践

本文主要介绍Docker部署ELK7.3.0日志收集服务的最佳实践,通过示例代码进行了非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。

写在前面

本文仅包含ELK7.3.0部署!

部署环境:

系统 CentOS7 Docker Docker版本19.03.5 CPU 2个内核 内存 2.5G 磁盘 30G(推荐设置,磁盘不足可能导致es错误) Filebeat v7.3.0,单节点 ElasticSearch v7.3.0,两片 Kina V7.3.0,单节点 Logstash v7.3.1,单节点

ELK分布式集群部署方案

在linux中,elasticsearch用户拥有的内存权限太小,至少需要262144,并报错(maxvirtualmemoryareasVM。max_map_count[65530]太低,至少增加到[262144]),所以要先修改系统配置。

#修改配置sysctl.conf vi/etc/sysctl.conf #添加下面配置: vm.max_map_count=262144 #重新加载: sysctl-p #最后重新启动elasticsearch,即可启动成功。

环境由Docker部署。为了更方便地使用Docker命令,我们安装了bash-completion自动完成插件:

#安装依赖工具bash-complete yuminstall-ybash-completion ource/usr/share/bash-completion/completions/docker source/usr/share/bash-completion/bash_completion

部署顺序:es-->:kiBana-->logstash->;Filebeat

ElasticSearch7.3.0部署

主节点部署

创建配置文件和数据存储目录

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 #节点名称 node.name:es-master #是否可以成为master节点 node.master:true #是否允许该节点存储数据,默认开启 node.data:false #网络绑定 network.host:0.0.0.0 #设置对外服务的http端口 http.port:9200 #设置节点间交互的tcp端口 transport.port:9300 #集群发现 discovery.seed_hosts: -172.17.0.2:9300 -172.17.0.3:9301 #手动指定可以成为mater的所有节点的name或者ip,这些配置将会在第一次选举中进行计算 cluster.initial_master_nodes: -172.17.0.2 #支持跨域访问 http.cors.enabled:true http.cors.allow-origin:"*" #安全认证 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"

拉镜会有点慢,耐心等待!

#拉取镜像,可以直接构建容器,忽略此步 dockerpullelasticsearch:7.3.0 #构建容器 ##映射5601是为Kibana预留的端口 dockerrun-d-eES_JAVA_OPTS="-Xms256m-Xmx256m"\ -p9200:9200-p9300:9300-p5601: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\ --namees-masterelasticsearch:7.3.0

/etc/localtime:/etc/localtime:主机与容器时间同步。

从节点部署

创建配置文件和数据存储目录

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 #节点名称 node.name:es-slave1 #是否可以成为master节点 node.master:true #是否允许该节点存储数据,默认开启 node.data:true #网络绑定 network.host:0.0.0.0 #设置对外服务的http端口 http.port:9201 #设置节点间交互的tcp端口 transport.port:9301 #集群发现 discovery.seed_hosts: -172.17.0.2:9300 -172.17.0.3:9301 #手动指定可以成为mater的所有节点的name或者ip,这些配置将会在第一次选举中进行计算 cluster.initial_master_nodes: -172.17.0.2 #支持跨域访问 http.cors.enabled:true http.cors.allow-origin:"*" #安全认证 xpack.security.enabled:false #http.cors.allow-headers:"Authorization" bootstrap.memory_lock:false bootstrap.system_call_filter:false

拉镜会有点慢,耐心等待!

#拉取镜像,可以直接构建容器,忽略此步 dockerpullelasticsearch:7.3.0 #构建容器 dockerrun-d-eES_JAVA_OPTS="-Xms256m-Xmx256m"\ -p9201:9200-p9301: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\ --namees-slave1elasticsearch:7.3.0

修改配置并重新启动容器

#查看主从容器IP dockerinspectes-master dockerinspectes-slave1

将es配置文件es-master.yml和es-slave1.yml中的discovery.seed_hostscluster.initial_master_nodes修改为对应的IP!重新启动容器:

dockerrestartes-master dockerrestartes-slave1 #查看es日志 dockerlogs-f--tail100fes-master

访问http://IP:9200/_cat/nodes查看es集群信息,可以看到有主节点和从节点成功部署:

用于节点部署的通用API:

API 函数 Http://IP:9200 查看ES版本信息 查看所有碎片

查看所有索引

基巴纳7.3.0部署

创建Kibana配置文件

vim/mnt/kibana.yml # ##**THISISANAUTO-GENERATEDFILE** ## # ##DefaultKibanaconfigurationfordockertarget server.name:kibana #配置Kibana的远程访问 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

dockerps|grepes-master

部署基巴纳

注意把命令中的40eff5876ffd改成es-master容器ID,拉镜像,耐心等待!

#拉取镜像,可以直接构建容器,忽略此步 dockerpulldocker.elastic.co/kibana/kibana:7.3.0 #构建容器 ##--network=container表示共享容器网络 dockerrun-it-d\ -v/mnt/kibana.yml:/usr/share/kibana/config/kibana.yml\ -v/etc/localtime:/etc/localtime\ -eELASTICSEARCH_URL=http://172.17.0.2:9200\ --network=container:40eff5876ffd\ --namekibanadocker.elastic.co/kibana/kibana:7.3.0

检查Kibana容器的日志,下图所示的日志表示启动成功。

dockerlogs-f--tail100fkibana

访问http://IP:5601,可能会出现503。以后再去参观也可以。访问Kibana控制台意味着已经成功安装了Kibana,并且已经在es-master中建立了连接。

Logstash7.3.1部署

编写Logstash配置文件

vim/mnt/logstash-filebeat.conf

input{ #来源beats beats{ #端口 port=>"5044" } } #分析、过滤插件,可以多个 filter{ grok{ #grok表达式存放的地方 patterns_dir=>"/grok" #grok表达式重写 #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}" #设置为true表示如果你有一个自定义的模板叫logstash,那么将会用你自定义模板覆盖默认模板logstash template_overwrite=>true } }

部署日志存储

#拉取镜像,可以直接构建容器,忽略此步 dockerpulllogstash:7.3.1 #构建容器 #xpack.monitoring.enabled打开X-Pack的安全和监视服务 #xpack.monitoring.elasticsearch.hosts设置ES地址,172.17.0.2为es-master容器ip #docker允许在容器启动时执行一些命令,logsatsh-f表示通过指定配置文件运行logstash,/usr/share/logstash/config/logstash-sample.conf是容器内的目录文件 dockerrun-p5044:5044-d\ -v/mnt/logstash-filebeat.conf:/usr/share/logstash/config/logstash-sample.conf\ -v/etc/localtime:/etc/localtime\ -eelasticsearch.hosts=http://172.17.0.2:9200\ -expack.monitoring.enabled=true\ -expack.monitoring.elasticsearch.hosts=http://172.17.0.2:9200\ --namelogstashlogstash:7.3.1-f/usr/share/logstash/config/logstash-sample.conf

这里要注意es集群地址。这里只配置es-master的ip(172.17.0.2),详细的Logstash配置。检查以下日志以显示安装成功:

Filebeat7.3.0部署

Filebeat不是必须的组件,我们也可以通过Logstash携带日志。

例如,要合并所有不以“20”开头的日志,可以使用以下Logstash配置:

input{ #来源beats beats{ #端口 port=>"5044" } file{ type=>"server-log" path=>"/logs/*.log" start_position=>"beginning" codec=>multiline{ //正则表达式,所有“20”前缀日志,如果你的日志是以“[2020-06-15”这类前缀则,可以替换成"^[" pattern=>"^20" //是否对正则规则取反 negate=>true //previous表示合并到上一行,next表示合并到下一行 what=>"previous" } } }

请注意,Filebeat必须与应用程序部署在同一个服务器上。这里应用是由docker部署的,/mnt/omc-dev/logs是应用日志文件的映射目录。如果你也是通过docker部署服务,请记得通过[-v/mnt/OMC-dev/logs:/applicationwork/logs]日志文件映射出来!

创建Filebeat配置文件

##/mnt/omc-dev/logs为应用日志目录,必须将应用的部署目录映射出来 mkdir-p{/mnt/omc-dev/logs,/mnt/filebeat/logs,/mnt/filebeat/data} vim/mnt/filebeat/filebeat.yml filebeat.inputs: -type:log enabled:true paths: #当前目录下的所有.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和端口。

#拉取镜像,可以直接构建容器,忽略此步 dockerpulldocker.elastic.co/beats/filebeat:7.3.0 #构建容器 ##--linklogstash将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况,logstash为容器名 dockerrun-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\ --linklogstash--namefilebeatdocker.elastic.co/beats/filebeat:7.3.0

查看日志,我们在配置文件中配置了Filebeat的日志级别为debug,所以它会打开所有记录的信息。

dockerlogs-f--tail100ffilebeat

可以看到,通过查询ES索引,又多了三个索引,根据我们的配置按天划分。因为我的环境已经运行了三天,所以omc服务有三个索引(omc是一个有调度任务的服务,你也可以写一个简单的调度任务进行测试)。

接下来,让我们创建一个Kibana索引模式并进行日志查询:

创建索引后,可以通过索引模式在Discover视图中查询日志。

文章到此结束。如果要引入其他服务,只需将日志挂载到指定的目录。当然,如果服务部署在其他服务器上,需要在服务器上部署Filebeat,并保证服务器之间的网络互通~~

最后,这里推荐一个开源的ELK自动化Docker部署项目:https://github.com/deviantony/docker-elk.git.

-

020.6.28更新

最近发生了Logstash导致物理内存膨胀的问题。

简要说明主要问题:

目前单个服务的日日志量在2.2GB左右,由于早期对Logstash内存没有限制,当大量数据上来的时候,Logstash疯狂的占用内存和IO。

最近随着同一台服务器上应用服务流量的增加,OutOfMemoryError的问题最终导致内存不足。

然后通过设置和优化JVM内存(细节我就不说了,网上有很多),加上Logstash响应内存配置,就可以解决更早的遗留问题了。

最后,将Logstash添加到Kibana进行监控(当然,也可以将Logstash日志配置到ES):

https://blog.csdn.net/QiaoRui_/article/details/97667293

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zz/774242.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存