这篇文章将为大家详细讲解有关Filebeat5+Kafka+ELK Docker是怎么搭建日志系统,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
所有的安装、配置或者说明文档都以官方为准,比如 docker.io, elastic.co, kafka.apache.org 等。百度出来的古老文章如果解决不了问题,后果自裁。
备好三台不同ip的虚机(下文用A B C说明),做集群嘛,标配!
做好心理预期,谷歌科学搜索不能少,妖怪问题会层出不穷,千万不能被吓到!
名称 | 版本号 |
---|---|
Filebeat | 5.0.0-alpha1 |
Kafka | 0.9.0.1 |
Zookeeper | 3.4.8 |
Elasticsearch | 2.4.0 |
Logstash | 2.4.0 |
Kibana | 4.6.0 |
纯粹是处于个人爱好,各种技术只要跟 Docker 搭边就倾爱它的 Docker 镜像版本。本文除了filebeat agent是二进制版本直接安装在应用机上,与docker无关,其他都是基于docker 镜像版本的集群安装。
分布式基于发布订阅的消息系统Kafka,它可以将业务应用端(client)和日志分析服务端(server)很好的黏合起来,并起到了缓冲作用,并提供了很多优秀特性比如异步,解耦,持久化,顺序化等。而且Kafka可以与很多开源组件Storm、Spark等集成,对于日后的扩展这一层会有很大的帮助。
本来开始确实是首选Flume,要做两件事:①上传client端的日志文件到Kafka; ②消费Kafka的队列消息存入ElasticSearch。
坑爹的是,当时最新发布的Flume版本是1.6.0, 而它支持的es版本最高只到1.7.5, 不支持2.x版本,中间对es做了各种的降级和甚至还得配合jdk8云云, 最后放弃。
选择就剩了 logstash-forwarder 和 filebeat, 而后者其实就是前者的升级版+替代品,所以直接选用filebeat无疑了。
妖怪又粗线了, filebeat当时的最新稳定版是1.3.0, 而它是不支持output到kafka的。也就是第①件事就被卡住了,幸好Beats5的alpha1
测试版发布了,虽然不稳定,但是测试下来还未发现日志丢失的情况,先用着吧。
话音未落,alpha2
又发布了...
https://www.elastic.co/guide/en/beats/libbeat/master/release-notes-5.0.0-alpha2.html
第②件事就通过Logstash来实现了(因为docker镜像就是elk一体的 hihahiha)
问完十万个为什么之后,终于可以开整了(其实前面的#为什么#也是我的血泪史...)
直接介绍一个不错的docker镜像,pull下来直接使用
docker pull jeygeethan/zookeeper-cluster
集群三个点上分别启动命令,虚拟卷大家自定义
docker run --name docker-zk -d --restart=always \--net="host" \-p 2181:2181 \-p 2888:2888 \-p 3888:3888 \-v ~/dockerdata/zookeeper/lib:/var/lib/zookeeper \-v ~/dockerdata/zookeeper/log:/var/log/zookeeper \-v /etc/localtime:/etc/localtime:ro \jeygeethan/zookeeper-cluster 192.168.0.1,192.168.0.2,192.168.0.3 1 {1/2/3: 三个节点分别设置}
三个节点都启动成功后,进入节点A
运行 docker exec -it docker-zk bash
默认就会进入/usr/share/zookeeper
目录,
运行 bin/zkCli.sh
进入了zk的客户端命令行,
创建节点 create /nicholas "nicholas"查看节点 get /nicholas 显示创建成功, 在虚机B、C上执行get操作检查下新的节点是否已同步,可见则成功。
### 二、Kafka 的安装
同样 pull 镜像先
docker pull jeygeethan/kafka-cluster
同样三个节点上分别启动,注意,我这里kafka和zk使用的是相同的三台虚机。
docker run --name docker-kafka -d -p 9092:9092-e KAFKA_HOST=192.168.0.1-e KAFKA_PORT=9092-e ZOOKEEPER_CONNECT=192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181-e KAFKA_ID=0 {0/1/2: 三个节点分别设置,从0开始} -v ~/dockerdata/kafka/logs:/tmp/kafka-logsjeygeethan/kafka-cluster
同时进入虚机A,和虚机B
进入docker docker exec -it docker-kafka bash转换目录 cd /opt/kafka_2.11-0.9.0.1/bin创建Topic ./kafka-topics.sh --create --topic TP_NIC --partitions 4 --replication-factor 2 --zookeeper 192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181查看Topic ./kafka-topics.sh --describe --topic TP_NIC --zookeeper 192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181在broker0(虚机A)上生产消息 ./kafka-console-producer.sh --topic=TP_NIC \ --broker-list=192.168.0.1:9092,192.168.0.2:9092,192.168.0.3:9092在broker1(虚机B)上消费消息 ./kafka-console-consumer.sh --topic=TP_NIC \ --zookeeper 192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181
到此,虚机A和B已经都关联上了TP_NIC, 在 A 命令行上,随意输入各类字符, 在 B 上可以看到同样的字符即说明消费成功了.
pull 镜像 2.4 版本 最新的5已经有了
docker pull sebp/elk:es240_l240_k460
修改即将要映射的虚拟卷的目录权限, 注意这里的991,992,993分别对应ELK的三个独立用户,如果你看下docker file的build脚本就明白了,为了让docker运行成功,我们先把权限配上。
chown -R 991:991 ~/dockerdata/es && chown -R 992:992 ~/dockerdata/logstash && chown -R 993:993 ~/dockerdata/kibana
进入对应的目录,我们先把配置给设定好。注:这些配置文件是从docker里面cp出来的,如源文件没有,请先docker run启动原镜像然后docker cp拷贝。
Elasticsearch 配置
vi ~/dockerdata/es/config/elasticsearch.yml编辑内容如下cluster.name: mm-clusternode.name: mm-node-01node.master: falsenode.data: true#restrict outside accessnetwork.host: 192.168.0.11transport.tcp.port: 9300http.port: 9200path.data: /etc/elasticsearch/datapath.work: /etc/elasticsearch/workpath.logs: /etc/elasticsearch/logspath.plugins: /etc/elasticsearch/pluginsbootstrap.mlockall: truediscovery.zen.ping.multicat.enabled: falsediscovery.zen.fd.ping_timeout: 100s#discovery.zen.fd.ping_retries: 6#discovery.zen.fd.ping_interval: 30sdiscovery.zen.ping.timeout: 100sdiscovery.zen.minimum_master_nodes: 1discovery.zen.ping.unicast.hosts: ["192.168.0.11", "192.168.0.12", "192.168.0.13"]gateway.recover_after_nodes: 2#action.auto_create_index: falseindex.number_of_replicas: 0index.number_of_shards: 2
Kibana 配置
vi ~/dockerdata/kibana/config/kibana.yml检查 elasticsearch.url: "http://localhost:9200" 对应上了即可
Logstash 配置
新增Kafka的input配置文件:vi ~/dockerdata/logstash/config/03-kafka-input.conf------------------------------------------input { kafka { zk_connect => "192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181 " #group_id => "" topic_id => "syslog" codec => "plain" reset_beginning => false consumer_threads => 5 decorate_events => true add_field => { "[@metadata][type]" => "syslog" } }}修改日志解析过滤配置文件:vi ~/dockerdata/logstash/config/10-syslog.conf------------------------------------------filter { if [@metadata][type] in ["syslog","accesslog"] { ruby { code => "event['mlogsendts'] = event['@timestamp']" } mutate { add_field => ["mlogsendts_string", "%{@timestamp}"] } json { source => "message" add_field => { "mlogmsg" => "%{message}" } remove_field => [ "message"] } grok { patterns_dir => ["/opt/logstash/patterns"] match => { "mlogmsg" => "[%{MMLOGTS:mlogts}]\s[%{MMLOGWORDEXT:mlogcell}]\s[%{MMLOGWORDEXT:mlognode}]\s[%{MMLOGWORDEXT:mlogthread}]\s[%{MMLOGWORD:mloglevel}]\s[%{MMLOGWORDEXT:mlogclass}]\s%{GREEDYDATA}" } } grok { match => { "source" => "%{GREEDYDATA}/%{GREEDYDATA:mlogfilename}.log" } } syslog_pri { } date { match => [ "mlogts", "yyyy-MM-dd HH:mm:ss.SSS" ] timezone => "Asia/Shanghai" target => "@timestamp" } }}这里最复杂的其实是两件事,① 用日志中的时间戳替换系统@timstamp(参见配置)②grok表达式将日志中的变量分段解析(找在线grok校验工具可以验证自己的正则,很费劲!!!)grok表达式默认支持各种格式的正则格式变量,大家自行官网搜索,这里我是自定义的一些正则变量,存放在:vi ~/dockerdata/logstash/patterns/mmlog.patterns下面的文件logstash默认会自动扫描的,所以文件名随便定义,只要正则对了就可以了。内容为:MMLOGTS \d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}.\d{3}MMLOGWORD \wMMLOGWORDEXT [^]]+MMLOGTHREAD \w(\w)\:\w-\wMMLOGCLASS [\w.]+\:\w\s
下面就可以启动docker了,对于ELK中的Elasticsearch 和 Logstash都需要是集群三个点的,而Kibana只是展示数据,单点即可。所以启动脚本分别为:
Kibana单点虚机,ELK三者全部开启,E+L的堆大小配置是基于该虚机是2c4g(相对低配置)
docker run --privileged=true -i -d -p 5601:5601 -p 9200:9200 -p 9300:9300 -p 5044:5044 -p 5000:5000 \--net="host" \-v ~/dockerdata/es/config/:/etc/elasticsearch/:rw \-v ~/dockerdata/es/plugins/:/etc/elasticsearch/plugins/:rw \-v ~/dockerdata/es/data/:/etc/elasticsearch/data/:rw \-v ~/dockerdata/es/work/:/etc/elasticsearch/work/:rw \-v ~/dockerdata/es/logs/:/var/log/elasticsearch/:rw \-v ~/dockerdata/logstash/config/:/etc/logstash/conf.d/:rw \-v ~/dockerdata/logstash/patterns/:/opt/logstash/patterns/:rw \-v ~/dockerdata/logstash/logs/:/var/log/logstash/:rw \-v ~/dockerdata/kibana/config/:/opt/kibana/config/:rw \-v ~/dockerdata/kibana/logs/:/var/log/kibana/:rw \-v /etc/localtime:/etc/localtime:ro \-e ES_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" \-e ES_HEAP_SIZE="2g" \-e LS_HEAP_SIZE="1g" \-e ELASTICSEARCH_START=1 -e LOGSTASH_START=1 -e KIBANA_START=1 \--name docker-elk sebp/elk:es240_l240_k460 \&& docker logs -f docker-elk
其余两个点的启动关闭Kibana(KIBANA_START=0), 虚机配置是4c8g(相对高配置)
docker run --privileged=true -i -d -p 5601:5601 -p 9200:9200 -p 9300:9300 -p 5044:5044 -p 5000:5000 \--net="host" \-v ~/dockerdata/es/config/:/etc/elasticsearch/:rw \-v ~/dockerdata/es/plugins/:/etc/elasticsearch/plugins/:rw \-v ~/dockerdata/es/data/:/etc/elasticsearch/data/:rw \-v ~/dockerdata/es/work/:/etc/elasticsearch/work/:rw \-v ~/dockerdata/es/logs/:/var/log/elasticsearch/:rw \-v ~/dockerdata/logstash/config/:/etc/logstash/conf.d/:rw \-v ~/dockerdata/logstash/patterns/:/opt/logstash/patterns/:rw \-v ~/dockerdata/logstash/logs/:/var/log/logstash/:rw \-v ~/dockerdata/kibana/config/:/opt/kibana/config/:rw \-v ~/dockerdata/kibana/logs/:/var/log/kibana/:rw \-v /etc/localtime:/etc/localtime:ro \-e ES_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" \-e ES_HEAP_SIZE="4g" \-e LS_HEAP_SIZE="2g" \-e ELASTICSEARCH_START=1 -e LOGSTASH_START=1 -e KIBANA_START=0 \--name docker-elk sebp/elk:es240_l240_k460 \&& docker logs -f docker-elk
打开下面网址校验安装成功与否:
Kibana Web : http://<your-host>:5601
Elasticsearch Json : http://<your-host>:9200/ES的插件安装请自己进入docker然后下载, 比较好用的有 head, hq 等
这个最简单了,官网上下载 filebeat-5.0.0-rc1-linux-x86_64.tar.gz 解压安装;
vi /usr/local/src/filebeat5/filebeat.yml编辑内容如下:################### Filebeat Configuration Example ###################################################### Filebeat ######################################filebeat.prospectors:# Each - is a prospector. Below are the prospector specific configurations- input_type: log paths: ["/usr/local/src/logs/${appname}-${cellname}-${nodename}/sys-.log"] encoding: utf-8 exclude_files: ['.\d{4}-\d{2}-\d{2}..log'] document_type: syslog fields: mlogapp: ${appname} fields_under_root: true scan_frequency: 1s ignore_older: 30m# must set ignore_older to be greater than close_inactive. close_inactive: 5m close_removed: true clean_removed: true multiline: pattern: ^[[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}[[:blank:]][[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}.[[:digit:]]{3}] negate: true match: after max_lines: 500output.kafka: # initial brokers for reading cluster metadata hosts: ["192.168.0.1:9092", "192.168.0.2:9092", "192.168.0.3:9092"] # message topic selection + partitioning topic: '%{[type]}' partition.round_robin: reachable_only: false required_acks: 1 compression: gzip max_message_bytes: 1000000############################# Logging #########################################logging.level: infologging.to_files: truelogging.to_syslog: falselogging.files: path: /usr/local/logs/filebeat name: filebeat.log keepfiles: 7...----------------------*启动Filebeat5:**export appname="uss-web" && export cellname="cell01" && export nodename="node01" \&& cd /usr/local/src/filebeat/ \&& nohup ./filebeat -e > /usr/local/src/logs/filebeat/nohup.out 2>&1 &
关于Filebeat5+Kafka+ELK Docker是怎么搭建日志系统就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/1858445/blog/4435073