hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!
开启掘金成长之旅!这是我参与「掘金日新计划 · 4 月更文挑战」的第 14 天,点击查看活动详情
- 起始标记->用Logstash和Beats构建数据管道(3讲):「77 | Logstash入门及架构介绍」
- 结尾标记->用Logstash和Beats构建数据管道(3讲):「79 | Beats介绍」
Logstash入门及架构介绍
Logstash
- ELT工具/数据搜集处理引擎。支持 200多个插件
Logstash Concepts
- Pipeline
- 包含了 input-filter-output 三个阶段的处理流程
- 插件生命周期管理
- 队列管理
- Logstash Event
- 数据在内部流转时的具体表现形式。数据在 input 阶段被转换为 Event,在 outout 被转化成目标格式数据
- Event 其实是一个 Java Obiect,在配置文件中,对 Event 的属性进行增删改查
Logstash 架构简介
Codec (Code / Decode) : 将原始数据 decode 成 Event;将 Event encode 成目标数据
Logstash 配置文件结构
- Bin/logstash -f demo.conf
- Pipeline
- Input / Filter / Output
- Codec
- Line /json
input Plugins
- 一个 Pipeline 可以有多个 input 插件
- Stdin / File
- Beats / Log4J / Elasticsearch / JDBC / Kafka / Rabbitmg / Redis
- JMX / HTTP / Websocket / UDP / TCP
- Google Cloud Storage / S3
- Github / Twitter
Output Plugins
- 将 Event 发送到特定的目的地,是 Pipeline 的最后一个阶段
- 常见 Output Plugins (www.elastic.co/guide/en/lo…
- Elasticsearch
- Email/ Pageduty
- Influxdb/ KafkaMongodb / Opentsdb/ Zabbixo
- Http / TCP / Websocket
Codec Plugins
- 将原始数据 decode 成 Event; 将 Event encode 成目标数据
- 内置的 Codec Plugins(www.elasticco/guide/en/lo…
- Line / Multiline
- JSON / Avro / Cef (ArcSight Common Event Format)
- Dots / Rubydebug
Filter Plugins
- 处理 Event
- 内置的 Filter Plugins (www.elastic.co/guide/en/lo…
- Mutate - 操作 Event 的字段
- Metrics - Aggregate metrics
- Ruby -执行 Ruby 代码
Queue
多 Pipelines 实例
- Pipeline.works: Pipeline 线程数,默认是 CPU 核数
- Pipeline.batch.size: Batcher 一次批量获取等待处理的文档数,默认125。需结合 ivm.options 调节
- Pipeline.batch.delav: Batcher 等待时间
Logstash Queue
- In Memory Queue
- 进程 Crash,机器当机,都会引起数据的丢失
- Persistent Queue
- Queue.type.persisted(默认是 memory)
- Queue.max bytes: 4gb
- 机器当机,数据也不会丢失;数据保证会被消费;可以替代 Kafka 等消息队列缓冲区的作用
- www.elastic.co/guide/en/lo…
- Queue.type.persisted(默认是 memory)
Codec Plugin - Single Line
Codec Plugin -Multiline
- 设置参数
- Pattern:设置行匹配的正则表达式
- What: 如果匹配成功,那么匹配行属于上一个事件还是下一个事件
- PreviousI Next
- Negate true / false: 是否对 pattern 结果取反
- True / False
Codec Plugin -Multiline(异常日志)
Input Plugin - File
- 支持从文件中读取数据,如日志文件
- 文件读取需要解决的问题
- 只被读取一次。重启后需要从上次读取的位置继续 (通过sincedb 实现)0
- 读取到文件新内容,发现新文件
- 文件发生归档操作(文档位置发生变化,日志 rotation),不能影响当前的内容读取
Filter Plugin
- Filter Plugin 可以对 Logstash Event 进行各种处理,例如解析,删除字段,类型转换
- Date:日期解析
- Dissect: 分割符解析
- Grok:正则匹配解析
- Mutate:处理字段。重命名,删除,替换
- Ruby:利用 Ruby 代码来动态修改 Event
Filter Plugin - Mutate
- 对字段做各种操作
- Convert 类型转换
- Gsub 字符串替换
- Split / Join / Merge 字符串切割,数组合并字符串,数组合并数组
- Rename 字段重命名
- Update /Replace 字段内容更新替换
- Remove field 字段删除
CodeDemo
# 一个 Demo, demo 运行
sudo bin/logstash -f logstash-filter.conf
# demo数据
127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"
# codec demo
sudo bin/logstash -e "input{stdin{codec=>line}}output{stdout{codec=> rubydebug}}"
sudo bin/logstash -e "input{stdin{codec=>json}}output{stdout{codec=> rubydebug}}"
sudo bin/logstash -e "input{stdin{codec=>line}}output{stdout{codec=> dots}}"
sudo bin/logstash -f multiline-exception.conf
# 多行数据,异常
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
# 一个实例
https://github.com/onebirdrocks/geektime-ELK/blob/master/part-1/2.4-Logstash%E5%AE%89%E8%A3%85%E4%B8%8E%E5%AF%BC%E5%85%A5%E6%95%B0%E6%8D%AE/movielens/logstash.conf
本节知识总结
介绍了Logstash以及它的架构,通过学习了它的Plugin,如何使用Plugin解决实际工作中数据转换的需求。
利用JDBC插件导入数据到Elasticsearch
同步数据库数据到 Elasticsearch
- 需求 - 将数据库中的数据同步到 ES,借助 ES 的全文搜索提高搜索速度
- 需要把新增用户信息同步到 Elasticsearch 中
- 用户信息 Update 后,需要能被更新到 Elasticsearch
- 支持增量更新
- 用户注销后,不能被 ES 所搜索到
JDBCInput Plugin & 设计实现思路
- 支持通过 JDBC Input Plugin 将数据从数据库从读到 Logstash
- 需要自己提供所需的 JDBC Driver
- Scheduling
- 语法来自 Rufus-scheduler
- 扩展了 Cron,支持时区
- State
- Tracking_column / sg_last_value
CodeDemo
https://spring.io/guides/gs/accessing-data-mysql/
create database db_example;
use db_example;
show tables;
drop table user;
select * from user;
# 新增用户
curl localhost:8080/demo/add -d name=Mike -d email=mike@xyz.com -d tags=Elasticsearch,IntelliJ
curl localhost:8080/demo/add -d name=Jack -d email=jack@xyz.com -d tags=Mysql,IntelliJ
curl localhost:8080/demo/add -d name=Bob -d email=bob@xyz.com -d tags=Mysql,IntelliJ
#查看所有的用户
curl 'localhost:8080/demo/all'
# 更新用户
curl -X PUT localhost:8080/demo/update -d id=16 -d name=Bob2 -d email=bob2@xyz.com -d tags=Mysql,IntelliJ
# 删除用户
curl -X DELETE localhost:8080/demo/delete -d id=15
mysql-demo.conf
# 创建 alias,只显示没有被标记 deleted的用户
POST /_aliases
{
"actions": [
{
"add": {
"index": "users",
"alias": "view_users",
"filter" : { "term" : { "is_deleted" : false } }
}
}
]
}
# 通过 Alias查询,查不到被标记成 deleted的用户
POST view_users/_search
{
}
POST view_users/_search
{
"query": {
"term": {
"name.keyword": {
"value": "Jack"
}
}
}
}
POST users/_search
{
"query": {
"term": {
"name.keyword": {
"value": "Jack"
}
}
}
}
本节知识总结
通过一个具体的Demo,帮助我们了解如何使用JDBC的Input 插件实现从Mysql数据库到Elasticsearch的增量的需求,关于删除的功能,需要我们在Mysql数据库中增加一个是否删除的字段,同时在ES中通过index alics 去过滤已删除的数据。我们可通过实现其他的方式来将数据从mysql和es中真正的删除。
Beats介绍
什么是 Beats
- Light weight data shippers
- 以搜集数据为主
- 支持与 Logstash 或 ES 集成
- 全品类/轻量级/开箱即用/可插拔可扩展/可视化
Metricbeat 简介
- 用来定期搜集操作系统,软件的指标数据
- Metric v.s Logs
- Metric -可聚合的数据,定期搜集
- Logs 文本数据,随机搜集
- Metric v.s Logs
- 指标存储在 Elasticsearch 中,可以通过 Kibana 进行实时的数据分析
Metricbeat 组成
- Module
- 搜集的指标对象,例如不同的操作系统,不同的数据库,不同的应用系统
- Metricset
- 一个 Module可以有多个 metricset
- 具体的指标集合。以减少调用次数为原则进行划分
- 不同的 metricset 可以设置不同的抓取时长
Module
- Metricbeat 提供了大量的开箱即用的 Module
- 通过执行 metricbeat module list 查看
- 通过执行 metricbeat moudle enable module name 定制
Metricbeat Event
Packetbeat
- Packetbeat- 实时网络数据分析,监控应用服务器之间的网络流量
- 常见抓包工具-Tcpdump /wiresharko
- 常见抓包配置 - Pcap 基于 libpcap,跨平台 /Af_packet 仅支持 Linux,基于内存映射嗅探,高性能0
- Packetbeat 支持的协议
- ICMP / DHCP /DNS / HTTP / Cassandra / Mysal / PostgresSQL / Redis / MongoDB /Memcache / TLS
- Network flows: 抓取记录网络流量数据,不涉及协议解析
CodeDemo
##
# 查看 packetbeat 模块
# 设置 packetbeat 的mysql 模块
# 启动运行
#
./metricbeat modules list
./metricbeat modules enable mysql
./metricbeat setup --dashboards
# 安装mysql
create database db_example
use db_example;
show tables;
select * from user
curl localhost:8080/demo/add -d name=Mike -d email=mike@xyz.com -d tags=Elasticsearch,IntelliJ
curl localhost:8080/demo/add -d name=Jack -d email=jack@xyz.com -d tags=Mysql,IntelliJ
curl localhost:8080/demo/add -d name=Bob -d email=bob@xyz.com -d tags=Mysql,IntelliJ
curl 'localhost:8080/demo/all'
# 配置 packetbeat
# 启动
修改 packetbeat,打开 http 5601 9200 和 mysql 3306监控
sudo chown root packetbeat.yml
sudo ./packetbeat setup --dashboards
sudo ./packetbeat
# 查看所有 Filebeat 模块
# 查看所有的modules
./filebeat modules list
#
./filebeat modules enable mysql
本节知识总结
学习了Beats相关的知识,通过两个具体的demo,学习了如何安装并配置Metricbeat以及Packetbeat,其他的beats都是大同小异。
此文章为4月Day14学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》