部署ELK日志平台(filebeat+kafka+logstash+es+kibana)

本文主要完成如下目标:

1.ELK日志平台搭建

2.冷热数据分离

3.索引生命周期管理

4.filebeat、logstash等字段拆解配置

第一部分:ELK日志平台搭建

架构如下:

安装elasticsearch集群

准备3台redhat/centos的机器。(这种有手就行的活我就不写了),有条件的把集群整大点,哥们条件比较好,搞7台机器玩。

主机名IP地址冷热节点
elastic0110.10.16.146hot
elastic0210.10.16.147hot
elastic0310.10.16.148hot
elastic0410.10.16.149hot
elastic0510.10.16.150hot
elastic0610.10.16.152cold
elastic0710.10.16.143cold

修改下每台主机的主机名以及长短域名解析

hostnamectl set-hostname elastic01

echo "10.10.16.146 elastic01" >> /etc/hosts

#...其他省略,自己补充下就行

修改下内核参数,所有机器都修改

vim /etc/sysctl.conf    #编辑文件

#文件内添加如下两行

fs.file-max=65536
vm.max_map_count=262144


##保存后立即生效
sysctl -p

修改单用户可以打开最大文件描述符数量,所有机器都修改

vim /etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536

官网下载安装包 elasticsearch-8.14.1-x86_64.rpm,每台机器都安装运行一下,部署elasticsearch

yum install -y elasticsearch-8.14.1-x86_64.rpm

每台机器添加1块磁盘,将磁盘挂载至/data目录,后面日志存/data目录下,做个磁盘挂载,目录赋权。

lsblk

vgcreate  datavg /dev/sdb

lvcreate  -l 100%free -n datalv datavg

lsblk

mkfs.xfs  /dev/mapper/datavg-datalv

vim /etc/fstab
/dev/mapper/datavg-datalv /data                 xfs     defaults        0 0

mount -a

[root@elastic01 ~]# df -h
Filesystem                 Size  Used Avail Use% Mounted on
devtmpfs                   3.8G     0  3.8G   0% /dev
tmpfs                      3.9G  4.0K  3.9G   1% /dev/shm
tmpfs                      3.9G  172M  3.7G   5% /run
tmpfs                      3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root     46G  3.6G   42G   8% /
/dev/sda1                 1014M  151M  864M  15% /boot
/dev/mapper/datavg-datalv  200G   23G  177G  12% /data
tmpfs                      781M     0  781M   0% /run/user/0


mkdir -p /data/elasticsearch

chown -R elasticsearch:elasticsearch /data/elasticsearch/

至此为止,只配置操作elastic01,不配置操作elastic02~elastic05!!!

至此为止,只配置操作elastic01,不配置操作elastic02~elastic05!!!

至此为止,只配置操作elastic01,不配置操作elastic02~elastic05!!

备份配置文件

cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml_bak -a

cat /etc/elasticsearch/elasticsearch.yml | grep -Ev "^$|#" > /etc/elasticsearch/elasticsearch.yml_bak1

重要的话说三遍,编辑修改/etc/elasticsearch/elasticsearch.yml配置,node.roles和node.attr.node_type定义节点标签都可以,之前机器难得重启一次,我怕测试都不成功,两种方式都用了。

如下配置是添加了ssl证书的

[root@elastic01 ~]# cat /etc/elasticsearch/elasticsearch.yml
cluster.name: OA-ELK
node.name: elastic01
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.10.16.146
node.roles: ["master","data","data_hot","data_content","ingest","ml","remote_cluster_client","transform"]                        #定义节点角色
node.attr.node_type: hot    #冷热节点标签
discovery.seed_hosts: ["10.10.16.146","10.10.16.147","10.10.16.148","10.10.16.149","10.10.16.150"]
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
cluster.initial_master_nodes: ["elastic01"]
#cluster.initial_master_nodes: ["elastic01","elastic02","elastic03"]
http.host: 0.0.0.0
transport.host: 0.0.0.0
cluster.routing.allocation.same_shard.host: true      #禁止把副本分配到同一台物理机器上(相同ip地址认为是同一台机器)
cluster.routing.allocation.disk.watermark.low: "85%"  #意味着 Elasticsearch 不会将分片分配给磁盘使用率超过 85% 的节点
cluster.routing.allocation.disk.watermark.high: "90%" #意味着 Elasticsearch 将尝试将分片从磁盘使用率高于 90% 的节点,开始挪分片去其他节点。
cluster.routing.allocation.disk.watermark.flood_stage: "95%" #节点上分配了一个或多个分片并且至少有一个磁盘超过洪水阶段的每个索引强制执行只读索引块

cluster.info.update.interval: "30s"                   #多久检查一次集群中每个节点的磁盘使用情况。
#cluster.routing.allocation.disk.include_relocations: true       #计算磁盘使用率时是否考虑当前分配的分片。
cluster.routing.allocation.disk.threshold_enabled: true         #这启用和禁用磁盘分配决策程序。

http.max_content_length: "500mb"
http.max_initial_line_length: "100kb"
http.max_header_size: "40kb"

 启动elasticsearch服务,并且设置开机自启动

systemctl restart elasticsearch.service

systemctl enable elasticsearch.service

检查下集群状态

systemctl status elasticsearch.service

修改ES账号和密码,并且创建其他ES节点加入集群的token。

默认安装好的ES集群会给elastic账户一个高度复杂的随机密码,密码在安装日志里,想去看的自己查,我也没查过,直接重置就好。进入/usr/share/elasticsearch/bin/目录

cd /usr/share/elasticsearch/bin/

./elasticsearch-reset-password  -u elastic -i
#弹框 y 
#连续输入两次密码

#目录下

 在elastic01上创建其他节点加入ES集群的token

[root@elastic01 ~]#/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node
eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTAuMTAuMTYuMTQ2OjkyMDAiXSwiZmdyIjoiYWM1NmQ5ZjBiYmEzZTI0ZTExZDRkNGZmOGI0MjExNTYyYWQ0NGRmMWE5ODU3YTk4YTE2ZmVmMTYyM2
MyMTRlZiIsImtleSI6InB2ekliSkFCTl9oUm02d1ZWMVZWOkh6SEZRbXRxUlpDVGhOZmNOYTVTb2cifQ==

在其他节点上导入刚才elastic01上生成的token,命令后带着token,这一串token不要有任何回车或者中断,在其他节点导入,导入过程输入"y"

/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token  eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTAuMTAuMTYuMTQ2OjkyMDAiXSwiZmdyIjoiYWM1NmQ5ZjBiYmEzZTI0ZTExZDRkNGZmOGI0MjExNTYyYWQ0NGRmMWE5ODU3YTk4YTE2ZmVmMTYyM2
MyMTRlZiIsImtleSI6InB2ekliSkFCTl9oUm02d1ZWMVZWOkh6SEZRbXRxUlpDVGhOZmNOYTVTb2cifQ==

修改完elastic02~05的配置,启动ES

[root@a-oa-elk-elastic-prod02 ~]# cat /etc/elasticsearch/elasticsearch.yml
cluster.name: OA-ELK
node.name: elastic02
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.10.16.147
node.roles: ["master","data","data_hot","data_content","ingest","ml","remote_cluster_client","transform"]
node.attr.node_type: hot
discovery.seed_hosts: ["10.10.16.146","10.10.16.147","10.10.16.148","10.10.16.149","10.10.16.150"]
cluster.initial_master_nodes: ["elastic01"]
#cluster.initial_master_nodes: ["elastic01","elastic02","elastic03"]
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
http.host: 0.0.0.0
transport.host: 0.0.0.0
cluster.routing.allocation.same_shard.host: true                #禁止把副本分配到同一台物理机器上(相同ip地址认为是同一台机器)
cluster.routing.allocation.disk.watermark.low: "85%"            #意味着 Elasticsearch 不会将分片分配给磁盘使用率超过 85% 的节点
cluster.routing.allocation.disk.watermark.high: "90%"           #意味着 Elasticsearch 将尝试将分片从磁盘使用率高于 90% 的节点,开始挪分片去其他节点。
cluster.routing.allocation.disk.watermark.flood_stage: "95%"    #节点上分配了一个或多个分片并且至少有一个磁盘超过洪水阶段的每个索引强制执行只读索引块

cluster.info.update.interval: "30s"              #多久检查一次集群中每个节点的磁盘使用情况。
#cluster.routing.allocation.disk.include_relocations: true       #计算磁盘使用率时是否考虑当前分配的分片。
cluster.routing.allocation.disk.threshold_enabled: true          #这启用和禁用磁盘分配决策程序。

http.max_content_length: "500mb"
http.max_initial_line_length: "100kb"
http.max_header_size: "40kb"
systemctl restart elasticsearch.service

systemctl enable elasticsearch.service

systemctl status elasticsearch.service

浏览器访问集群内任何一个节点9200端口,输入elastic和刚才重置的密码

https://10.10.16.147:9200/

输入后下图:

ES集群管理可以使用浏览器扩展插件ES-head,但是公司不让随意下载安装东西,一言难尽。

自己查查行了,简单的一

至此,完成如下部分:

安装kibana

打开kibana的机器 kibana01

yum install kibana-8.14.1-x86_64.rpm

修改kibana配置文件,然后启动kibana

[root@kibana01 ~]# cat /etc/kibana/kibana.yml
server.port: 5601
server.host: "10.10.16.151"
server.publicBaseUrl: "https://10.10.16.151:5601"
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/gongsi.crt    #使用的公司泛域名证书,自签证书配置后续补充
server.ssl.key: /etc/kibana/gongsi.key            #使用的公司泛域名证书,自签证书配置后续补充
logging:
  appenders:
    file:
      type: file
      fileName: /var/log/kibana/kibana.log
      layout:
        type: json
  root:
    appenders:
      - default
      - file
pid.file: /run/kibana/kibana.pid
i18n.locale: "zh-CN"

启动kibana服务

systemctl start kibana

systemctl status  kibana

systemctl enable kibana

netstat  -tlunp | grep 5601    #检查端口启动状态

登录elastic01机器

/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
eyJ2ZXIiOiI4LjQuMCIsImFkciI6WyIxOTIuMTY4LjUwLjExOjkyMDAiXSwiZmdyIjoiOTg3NWM4MzhjZjI
1YzA4OGNhNTMwOTI3ZWMzM2JkZWM3MTgyOTg3YzZlNzRkOWVhY2VmMjk4ZmVkYzM5MGUyNyIsImtleSI6IkZFU0
g1SUlCVDBGT3ExeHpDMTZDOjFES3lfWF9CVF9heUpGMGI0Z0Y5MFEifQ==

登录https://10.10.16.151:5601

将elastic01刚刚生成的token粘贴进去

提示输入验证码,验证码需要在 kibana 服务上生成(有些远程 ssh 工具执行命令验证码可能会 显示不出来,可以直接在系统命令界面去执行命令就可以看见验证码了)。
 

[root@kibana kibana]# cd /usr/share/kibana/bin/

[root@kibana bin]# ls

[root@kibana bin]# ./kibana-verification-code

Your verification code is: 974 086

输入生成的验证码连接。

输入验证码后,就会跳转到登录窗口可以登录使用了。用户可以用 ES 上的账户 elastic,密 码就是前面 ES 重置的

后续查看下面自动生成的配置文件,不用管

至此,完成如下部分:

接下来先部署filebeat吧,这样可以从日志源头一边配置一边排错印证。

安装filebeat

yum install filebeat-8.14.1-x86_64.rpm  -y

配置filebeat文件

[root@oa-email-nginx-prod01 filebeat]# cat /etc/filebeat/filebeat.yml
filebeat.config:
  inputs:
    enabled: true
    path: inputs.d/*.yml        #/etc/filebeat目录下创建inputs.d目录,以.yml结尾的文件可以匹配,方便对同一台机器上不通业务日志进行收集管理
    reload.enabled: true
    reload.period: 30s
  modules:
    enabled: true
    path: ${path.config}/modules.d/*.yml
    reload.enabled: true
    reload.period: 30s

logging.metrics.enabled: false
setup.template.enabled: true

logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7
  permissions: 0600


output.kafka:
  hosts: ["10.10.16.140:9092","10.10.16.141:9092","10.10.16.142:9092"]    #kafka的地址和端口
  topic: "%{[app]}"
  sasl.mechanism: "PLAIN"

在/etc/filebeat目录下创建inputs.d目录

mkdir /etc/filebeat/inputs.d

在/etc/filebeat/inputs.d目录下创建nginx应用的日志收集文件oa_email_nginx.yml

[root@nginx01 inputs.d]# cat /etc/filebeat/inputs.d/oa_email_nginx.yml
- type: log
  paths:
    - /var/log/nginx/proxy.log            #nignx日志路径
  ignore_older: 24h
  multiline.type: pattern
  multiline.pattern: '^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'    #匹配nginx日志匹配行首字符,完成日志换行,防止多行日志出现在elk一条日志中
  multiline.negate: true
  multiline.match: after
  fields_under_root: true
  fields:
    app: oa_email_proxy_prd    #自定定义一个app标签名,该名称就是kafka上的topic名称
    app_alias: oa_eml_prd      #定义日志别名

- type: log
  paths:
    - /var/log/nginx/error.log
  ignore_older: 24h
  multiline.type: pattern
  multiline.pattern: '^\d{4}'
  multiline.negate: true
  multiline.match: after
  fields_under_root: true
  fields:
    app: oa_email_error_prd
    app_alias: oa_eml_prd

 观察下图为/var/log/nginx/proxy.log的日志

192.168.156.112 54535 - [11/Feb/2025:13:55:34 +0800] 200 TCP "192.168.17.3:25" "14850" "0.000"
192.168.156.112 54536 - [11/Feb/2025:13:55:34 +0800] 200 TCP "192.168.17.1:25" "14850" "0.000"

所以filebeat中日志换行的配置为 multiline.pattern: '^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' ,

其实上述配置为 0.0.0.0~999.999.999.999 ,不过匹配IP地址的目的是区分日志行,够用就行。

观察下图为/var/log/nginx/error.log的日志

2025/02/08 22:08:36 [error] 124009#124009: *65028291 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.148.5, server: 0.0.0.0:25, upstream: "192.168.17.5:25", bytes from/to client:0/0, bytes from/to upstream:0/0
2025/02/08 23:05:00 [error] 124009#124009: *65044866 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.156.113, server: 0.0.0.0:25, upstream: "192.168.17.5:25", bytes from/to client:0/0, bytes from/to upstream:0/0

所以filebeat中error日志的行首匹配为 multiline.pattern: '^\d{4}'

启动filebeat服务,设置开机自启动

systemctl restart filebeat

systemctl status filebeat

systemctl enable filebeat

下图红框部分配置完成

######这部分为其他业务系统的一些配置,纯粹记录

[root@app01 inputs.d]# cat ebs_cm_prod.yml
- type: log
  paths:
    - /var/log/eblogs/info.log
  ignore_older: 24h
  multiline.type: pattern
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'    #匹配日期
  multiline.negate: true
  multiline.match: after
  fields_under_root: true
  fields:
    app: ebs_cm_info_prod
    app_alias: ebs_cm_prod

- type: log
  paths:
    - /var/log/logs/eberror.log
  ignore_older: 24h
  multiline.type: pattern
  multiline.pattern:  '^[0-9]{4}-[0-9]{2}-[0-9]{2}'    #匹配日期
  multiline.negate: true
  multiline.match: after
  fields_under_root: true
  fields:
    app: ebs_cm_error_prod
    app_alias: ebs_cm_prod
[root@ebs-oa-new-test01 inputs.d]# cat ebs_oa_test.yml
- type: log
  paths:
    - /usr/weaver/Resin4/log/stdout.log
  encoding: gbk            #系统ELK日志中文部分全部为乱码,encoding调整
  ignore_older: 24h
  multiline.type: pattern
  multiline.pattern: '^\['    #匹配[开头的
  multiline.negate: true
  multiline.match: after
  fields_under_root: true
  fields:
    app: ebs_oa_info_test
    app_alias: ebs_oa_test

日志
[2025.02.12 15:45:56.422]2025-02-12 15:45:56,422 INFO  A2  - [null] resin-port-80-365-365[com.engine.workflow.biz.requestForm.RequestFormBiz:211] - jym-------------��ֶתkeyʱ0

######上面部分为一些记录

部署KAFKA作为日志消息缓存

再一些日志量大的业务系统,应用繁多、日志量大,如果filebeat或者logstash的日志直接发给es,es集群会有一定压力,避免日志接收问题,引入消息队列作为缓存。

kafka在2.8.0版本以后移除zookeeper,使用的kraft协议

tar zxf kafka_2.13-3.7.0.tgz -C /opt/

ln -s /opt/kafka_2.13-3.7.0/ /opt/kafka

mkdir /data/kafka/logs -p

cd /opt/kafka/config/kraft/


[root@kafka-prod01 ~]# cat /opt/kafka/config/kraft/server.properties | grep -Ev "^$|#"
process.roles=broker,controller
node.id=1                        #KAFKA的broker节点ID
controller.quorum.voters=1@10.10.16.140:9093,2@10.10.16.141:9093,3@10.10.16.142:9093    #kafka controller投票者配置
listeners=PLAINTEXT://10.10.16.140:9092,CONTROLLER://10.10.16.140:9093    #kafka broker监听端口
inter.broker.listener.name=PLAINTEXT
advertised.listeners=PLAINTEXT://10.10.16.140:9092    #节点自己的监听地址
controller.listener.names=CONTROLLER
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
num.network.threads=5
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kraft-combined-logs        #日志存储位置
num.partitions=3
num.recovery.threads.per.data.dir=3
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=3
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
default.replication.factor=3

 同理配置kafka-02、kafka03节点

创建kraft集群,执行生成集群id命令,生成随机生成的字符串

[root@a-oa-elk-kafka-prod03 ~]# ll /opt/kafka/bin/kafka-storage.sh
-rwxr-xr-x 1 root root 860 Feb  9  2024 /opt/kafka/bin/kafka-storage.sh

[root@a-oa-elk-kafka-prod03 ~]# /opt/kafka/bin/kafka-storage.sh random-uuid        

kDyxWJx7SoCOnv26k8zvXw

 然后分别在三台机器上执行如下命令,分别在几台服务器上面使用集群ID格式化目录:

cd /opt/kafka
bin/kafka-storage.sh format -t kDyxWJx7SoCOnv26k8zvXw -c config/kraft/server.properties

上面命令执行完成后,配置的数据目录将会生成两个文件,其中 bootstrap.checkpoint 是一个二进制文件,meta.properties 是元数据文件:

然后执行如下命令,经验是最好同时运行,我之前时间间隔长一些,创建出的集群存在异常。

#后台启动:
/opt/kafka/bin/kafka-server-stop.sh  -daemon /opt/kafka/config/kraft/server.propertie    

# 前台启动:
/opt/kafka/bin/kafka-server-stop.sh  /opt/kafka/config/kraft/server.propertie

添加开机自启动

echo "/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties" >>/etc/rc.local

一些KAFKA命令,测试使用的时候修改下地址

# 以下所有命令都是以test-topic主题为示例,test-group消费者组为示例

# 1. 创建主题:(test-topic 主题名;replication-factor 副本数量,副本是包含leader的,如果某个topic有副本,该值至少要配置为2)
$ ./bin/kafka-topics.sh --bootstrap-server 192.168.56.101:9092 --create --topic test-topic --partitions 3 --replication-factor 2

# 2. 查看主题:
$ ./bin/kafka-topics.sh --bootstrap-server 192.168.56.101:9092 --describe --topic test-topic

# 3. 删除主题:
$ ./bin/kafka-topics.sh --bootstrap-server 192.168.56.101:9092 --delete --topic test-topic

# 4. 列出主题列表
$ ./bin/kafka-topics.sh --bootstrap-server 192.168.56.101:9092 --list

# 5. 调整分区数量
$ ./bin/kafka-topics.sh --bootstrap-server 192.168.56.101:9092 -alter --partitions 4 --topic test-topic

# 6. 查看消费者组信息
$ ./bin/kafka-consumer-groups.sh --bootstrap-server 192.168.56.101:9092 --list

# 7. 查看某个消费者组消费情况
$ ./bin/kafka-consumer-groups.sh --bootstrap-server 192.168.56.101:9092 --group test-group --describe

# 8. 在控制台向某个主题写入数据:
$ ./bin/kafka-console-producer.sh --broker-list 192.168.56.101:9092,192.168.56.102:9092,192.168.56.103:9092 --topic test-topic

# 9. 在控制台消费某个主题数据
$ ./bin/kafka-console-consumer.sh --bootstrap-server 192.168.56.101:9092,192.168.56.102:9092,192.168.56.103:9092 --topic test-topic

# 10. 指定消费10条数据
$ ./bin/kafka-console-consumer.sh --bootstrap-server 192.168.56.101:9092 --topic test-topic --max-messages 10

# 在控制台消费数据时还可以添加参数:
# 最早数据开始消费:--from beginning
# 删除offsets并重新开始消费:--delete-consumer-offsets --from beginning
# 指定消费者组相关信息:--consumer.config ./config/consumer.properties


------
# 下面这些是不怎么常用的命令,没有验证过作为记录供参考:

# 更改主题配置信息:
./bin/kafka-configs.sh --bootstrap-server 192.168.56.101:9092 --entity-type topics --entity-name test-topic --alter --add-config max.message.bytes=128000


# 查看主题配置信息:
./bin/kafka-configs.sh --bootstrap-server 192.168.56.101:9092 --entity-type topics --entity-name test-topic --describe


# 删除配置:
./bin/kafka-configs.sh --bootstrap-server 192.168.56.101:9092  --entity-type topics --entity-name test-topic --alter --delete-config max.message.bytes

# 将test topic的消费组的0分区的偏移量设置为最新
./bin/kafka-consumer-groups.sh --bootstrap-server 192.168.56.101:9092,192.168.56.102:9092,192.168.56.103:9092 --group test-group --topic test-topic:0 --reset-offsets --to-earliest –execute


# 将test topic的消费组的0和1分区的偏移量设置为最旧
./bin/kafka-consumer-groups.sh --bootstrap-server 192.168.56.101:9092,192.168.56.102:9092,192.168.56.103:9092 --group test-group --topic test-topic:0,1 --reset-offsets --to-latest –execute

# 将test topic的消费组的所有分区的偏移量设置为1000
./bin/kafka-consumer-groups.sh --bootstrap-server 192.168.56.101:9092,192.168.56.102:9092,192.168.56.103:9092 --group test-group --topic test-topic --reset-offsets --to-offset 1 –execute

# --reset-offsets后可以跟的其他用法:--to-current:把位移调整到分区当前位移
# --reset-offsets后可以跟的其他用法:--shift-by N: 把位移调整到当前位移 + N处,注意N可以是负数,表示向前移动
# --reset-offsets后可以跟的其他用法:--to-datetime <datetime>:把位移调整到大于给定时间的最早位移处,datetime格式是yyyy-MM-ddTHH:mm:ss.xxx,比如2017-08-04T00:00:00.000

除上述一些命令外,还可以安装kafka-ui的服务用于方便管理,安装docker就不说了。

docker load < kafka-ui_v0.4.0.tar
docker ps
docker image ls

##看下docker-compose的配置
[root@a-oa-elk-kafka-prod01 ~]# cat docker-compose.yml
version: '3'
services:
  kafkaui:
    image: '10.13.164.50:80/public/provectuslabs/kafka-ui:v0.4.0'
    container_name: kafkaui
    network_mode: "bridge"
    restart: always
    ports:
      - "8080:8080"
    environment:
      - KAFKA_CLUSTERS_0_NAME=F84NuqVqSFmncQmlHv1RQQ
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=10.10.16.140:9092,10.10.16.141:9092,10.10.16.142:9092
##
docker compose up -d

检查端口并且用浏览器访问,点击topic可以看到filebeat中写的app名称的topic。

[root@kafka-prod01 ~]# netstat -tlunp | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      97368/docker-proxy
tcp6       0      0 :::8080                 :::*                    LISTEN      97375/docker-proxy

至此,下图中红框部分配置完成。

最后一步,安装logstash。

常规安装logstash

yum install /tmp/logstash-8.14.1-x86_64.rpm

不过我使用systemctl restart logstash服务后,CPU就一直使用率100%,我也不知道咋回事,索性就直接使用进程直接跑,不用服务了。

mkdir /data/logstashconf

在此目录下写/data/logstashconf配置文件

[root@logstash-prod01 logstashconf]# cat ebs_asset_prod.conf
input {
  kafka {
    bootstrap_servers => "10.10.16.140:9092,10.10.16.141:9092,10.10.16.142:9092"
    topics => ["ebs_asset_info_prod","ebs_asset_error_prod"]
    codec => json {
      charset => "UTF-8"
    }
  }
}
filter{
  grok{
    #match => {"message" => "%{TIMESTAMP_ISO8601:timestamp}%{SPACE}\s\[%{DATA:thread}\s*\]%{SPACE}%{LOGLEVEL:level}%{SPACE}%{NOTSPACE:logger}%{SPACE}-%{SPACE}\s\[%{NOTSPACE:method}\s*\]%{SPACE}-%{SPACE}%{GREEDYDATA:msg}"}
    match => {"message" => "%{EBSTIME:timestamp}%{SPACE}\s\[%{DATA:thread}\s*\]%{SPACE}%{LOGLEVEL:level}%{SPACE}%{NOTSPACE:logger}%{SPACE}-%{SPACE}\s\[%{NOTSPACE:method}\s*\]%{SPACE}-%{SPACE}%{GREEDYDATA:msg}"}
  }
  mutate {
    remove_field => [ "[agent][id]","[agent][ephemeral_id]","[agent][type]","[agent][version]","[ecs][version]","[log][offset]","[input][type]","[event][original]" ]
 }

  date{
    match => ["timestamp","yyyy-MM-dd HH:mm:ss.SSS"]
    target => "@timestamp"
    #tag_on_failure => ["_dateparsefailure"]
        }
}
output {
  elasticsearch {
    hosts =>["https://10.10.16.146:9200","https://10.10.16.147:9200","https://10.10.16.148:9200","https://10.10.16.149:9200","https://10.10.16.150:9200"]
    index => "ebs_asset_prod-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "aaaaa"
    ssl => "true"
    cacert => "/etc/logstash/certs/http_ca.crt"
  }
}

 上文中EBSTIME为个人定义,因为我没找到相关的时间格式。。。因此在/usr/share/logstash/vendor/bundle/jruby/3.1.0/gems/logstash-patterns-core-4.3.4/patterns/ecs-v1/grok-patterns目录下自己写了3个,太痛苦了当时!!!

HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}
EVENTTIME %{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME}
EBSTIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}
[root@a-oa-elk-logstash-prod01 logstashconf]# cat nginx.conf
input {
  kafka {
    bootstrap_servers => "10.10.16.140:9092,10.10.16.141:9092,10.10.16.142:9092"
    topics => ["test_nginx_accesslog"]
    codec => json {
      charset => "UTF-8"
    }
  }
}
filter{
  grok{
    match => {"message" => "%{COMBINEDAPACHELOG}" }
  }
}
output {
  elasticsearch {
    hosts =>["https://10.10.16.146:9200","https://10.10.16.147:9200","https://10.10.16.148:9200","https://10.10.16.149:9200","https://10.10.16.150:9200"]
    index => "test_nginx_accesslog-%{+YYYY.MM}"
    user => "elastic"
    password => "aaaaa"
    ssl => "true"
    cacert => "/etc/logstash/certs/http_ca.crt"
  }
}

 下图是使用索引模板创建的索引,方便后续管理,规划。

output {
  #stdout { codec => rubydebug }
  elasticsearch {
    hosts =>["https://10.10.16.146:9200","https://10.10.16.147:9200","https://10.10.16.148:9200","https://10.10.16.149:9200","https://10.10.16.150:9200"]
    template_name => "yzy_default_template"    #使用的索引模板
    index => "yzy_prod-%{+YYYY.MM.dd}"         #索引格式,我这里用的是每天滚动
    ilm_enabled => true
    user => "elastic"
    password => "aaaaa"
    ssl => "true"
    cacert => "/etc/logstash/certs/http_ca.crt"
  }
}

 将 ES 的证书复制到 Logstash 目录。因为我们的 ES 使用的 HTTPS 访问认证, Logstash 要发送日志到 ES 时,需要进行证书认证。

scp -r /etc/elasticsearch/certs root@10.10.16.143:/etc/logstash/

写个统一启动的脚本,统一拉起来logstash

[root@logstash-prod01 data]# cat /data/logstashstart.sh
#!/bin/bash

nohup /usr/share/logstash/bin/logstash --path.data=/data/oa_email_ngx -f /data/logstashconf/oa_email_ngx.conf > /dev/null 2>&1 &
nohup /usr/share/logstash/bin/logstash --path.data=/data/ebs_ems_prod -f /data/logstashconf/ebs_ems_prod.conf > /dev/null 2>&1 &

##出现过业务太多了,结果机器内存顶不住的问题,调节这个配置

[root@logstash-prod01 data]# cat /etc/logstash/jvm.options
## JVM configuration

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms512m    #调节内存
-Xmx512m    #调节内存

至此,下图所有配置完成。。。。!!!!

打开kibana查看索引是否生成,创建相应的patterns就ok了

冷热数据分离、索引模板创建、生命周期管理、字段拆解下次再说,写不动了啊啊啊啊啊啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值