安装所需包
docker pull elasticsearch:7.17.0
docker pull kibana:7.17.0
docker pull logstash:7.17.0
docker pull elastic/filebeat:7.17.0
docker pull wurstmeister/kafka
docker pull wurstmeister/zookeeper
步骤一、优化系统参数
vi /etc/security/limits.conf
---在文件最后面添加如下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
# vi /etc/sysctl.conf
vm.max_map_count=655360
# sysctl -p
vm.max_map_count = 655360
步骤二、Docker搭建es,kibana(详情请看之前文案)
docker run --restart=always --name es01
-p 9200:9200 -p 9300:9300
--net mynetwork --ip 172.18.0.4
-e ES_JAVA_OPTS="-Xms512m -Xmx512m"
-v /kdata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
-v /kdata/elasticsearch/data:/usr/share/elasticsearch/data
-v /kdata/elasticsearch/plugins:/usr/share/elasticsearch/plugins
-v /kdata/elasticsearch/logs:/usr/share/elasticsearch/logs
-d elasticsearch:7.17.0
docker run --restart=always --name kibana
-p 5601:5601
-e TZ="Asia/Shanghai" -e "I18N_LOCALE=zh-CN"
--net mynetwork --ip 172.18.0.5
-v /kdata/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
-d kibana:7.17.0
步骤三、Docker运行Kafka、Zookeeper
1、拉取镜像
# docker pull wurstmeister/kafka
# docker search zookeeper
2、启动容器
首先启动zookeeper
#
docker run --restart=always --name zookeeper
--net mynetwork --ip 172.18.0.2
-p 2181:2181
-v /etc/localtime:/etc/localtime
-d wurstmeister/zookeeper
然后再启动Kafka
#
docker run --restart=always -d --name kafka
--net mynetwork --ip 172.18.0.3
-p 9092:9092
-e KAFKA_BROKER_ID=0
-e KAFKA_ZOOKEEPER_CONNECT=192.168.20.100:2181
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.20.100:9092
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
-v /etc/localtime:/etc/localtime
-t wurstmeister/kafka
docker run --restart=always -d --name kafka
--net mynetwork --ip 172.18.0.3
-p 9092:9092
-e KAFKA_BROKER_ID=0
-e KAFKA_ZOOKEEPER_CONNECT=192.168.20.101:2181
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.20.101:9092
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
-v /etc/localtime:/etc/localtime
-t wurstmeister/kafka
docker run --restart=always -d --name kafka
--net mynetwork --ip 172.18.0.3
-p 9092:9092
-e KAFKA_BROKER_ID=0
-e KAFKA_ZOOKEEPER_CONNECT=192.168.20.102:2181
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.20.102:9092
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
-v /etc/localtime:/etc/localtime
-t wurstmeister/kafka
# -e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
# -e KAFKA_ZOOKEEPER_ConNECT=1192.168.20.100:2181/kafka 配置zookeeper管理kafka的路径
# -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.20.100:9092 把kafka的地址端口注册给zookeeper
# -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口
# -v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间
docker logs -f --tail=1000 kafka
cd /opt/kafka_2.13-2.8.1/bin
可为集群之外的客户端链接
–env KAFKA_ADVERTISED_HOST_NAME=kafka所在宿主机的IP (一定要是公网ip,否则远程是无法操作kafka的,kaka tools也是无法使用的,如果仅仅紧紧集群服务器间通信可以 设置 内网IP),中间的kafka所在宿主机的IP,如果不这么设置,可能会导致在别的机器上访问不到kafka。
3、验证kafka是否可以使用
# docker exec -it kafka bash
cd /opt/kafka_2.13-2.8.1/bin
运行kafka生产者发送消息
./kafka-console-producer.sh --broker-list localhost:9092 --topic sun
>cc #手动输入
>kk
>{"datas":[{"channel":"","metric":"temperature","producer":"ijinus","sn":"IJA0101-00002245","time":"1543207156000","va
运行kafka消费者接收消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic sun --from-beginning
kk
cc
kk
{"datas":[{"channel":"","metric":"temperature","producer":"ijinus","sn":"IJA0101-00002245","time":"1543207156000","va
kafka可视化工具kafka tool:https://www.kafkatool.com/download.html
步骤四、安装filebeat
cd /kdata/filebeat/
vi filebeat.yml
#添加信息:
- type: log
enabled: true
paths:
- /root/a.log #测试日志文件
- /var/path2/*.log
#output.elasticsearch: #添加注释
# Array of hosts to connect to.
# hosts: ["localhost:9200"]
output.kafka:
enabled: true
hosts: ["192.168.20.100:9092"]
topic: "kk_consumer"
compression: gzip
max_message_bytes: 100000000
# nohup ./filebeat -e -c filebeat.yml &
#执行
docker run --name filebeat --user=root
--net elasticsearch_default
-v /var/log/nginx/:/var/log/nginx/
-v /kdata/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
-v /var/lib/docker/containers:/var/lib/docker/containers:ro
-v /var/run/docker.sock:/var/run/docker.sock:ro
-d elastic/filebeat:7.17.0
步骤五、运行logstash
cd /kdata/logstash
vi logstash.yml ##新建文件,添加如下两行:
##注意这行是表示容器里面配置文件的路径,照写就行,不要写成自己本地新建的路径,这里博主踩坑花了很长时间 path.config: /usr/share/logstash/conf.d/*.conf
path.logs: /var/log/logstash
cd /kdata/logstash/conf.d
vi mylogstash.conf
#测试内容如下:
input {
beats {
port => 5044
codec => "json"
}
}
output {
elasticsearch {
hosts => ["192.168.20.100:9200","http://192.168.20.101:9200","http://192.168.20.102:9200"]
index => "nginx-access-log-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
#执行
docker run --restart=always -it --name logstash
-p 5044:5044
--net mynetwork --ip 172.18.0.3
-v /kdata/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
-v /kdata/logstash/conf.d/:/usr/share/logstash/conf.d/
-d logstash:7.17.0
#查看日志
docker logs -f logstash
#进入logstash容器
docker exec -it logstash bash
####################################################
filebeat.yml 配置文件的编写
filebeat.inputs:
- type: log
# 是否启动
enabled: true
encoding: "utf-8"
# 从那个路径收集日志,如果存在多个 input ,则这个 paths 中的收集的日志最好不要重复,否则会出现问题
# 日志路径可以写通配符
paths:
- "/Users/huan/soft/elastic-stack/filebeat/filebeat/springboot-admin.log"
# 如果日志中出现了 DEBUG 的字样,则排除这个日志
exclude_lines:
- "DEBUG"
# 添加自定义字段
fields:
"application-servic-name": "admin"
# fields 中的字段不放在根级别 ,true表示放在根级别
fields_under_root: false
# 添加一个自定义标签
tags:
- "application-admin"
# 多行日志的处理,比如java中的异常堆栈
multiline:
# 正则表达式
pattern: "^[+"
# 是否开启正则匹配,true:开启,false:不开启
negate: true
# 不匹配正则的行是放到匹配到正则的行的after(后面)还是before(前面)
match: after
# 多行日志结束的时间,多长时间没接收到日志,如果上一个是多行日志,则认为上一个结束了
timeout: 2s
# 使用es的ignes node 的pipeline处理数据,这个理论上要配置到output.elasticsearch下方,但是测试的时候发现配置在output.elasticsearch下方不生效。
pipeline: pipeline-filebeat-springboot-admin
# 配置索引模板的名字和索引模式的格式
setup.template.enabled: false
setup.template.name: "template-springboot-admin"
setup.template.pattern: "springboot-admin-*"
# 索引的生命周期,需要禁用,否则可能无法使用自定义的索引名字
setup.ilm.enabled: false
# 数据处理,如果我们的数据不存在唯一主键,则使用fingerprint否则可以使用add_id来实现
processors:
# 指纹,防止同一条数据在output的es中存在多次。(此处为了演示使用message字段做指纹,实际情况应该根据不用的业务来选择不同的字段)
- fingerprint:
fields: ["message"]
ignore_missing: false
target_field: "@metadata._id"
method: "sha256"
# 输出到es中
output.elasticsearch:
# es 的地址
hosts:
- "http://localhost:9200"
- "http://localhost:9201"
- "http://localhost:9202"
username: "elastic"
password: "123456"
# 输出到那个索引,因为我们这个地方自定义了索引的名字,所以需要下方的 setup.template.[name|pattern]的配置
index: "springboot-admin-%{[agent.version]}-%{+yyyy.MM.dd}"
# 是否启动
enabled: true