Elasticsearch 学习笔记Day 30

98 阅读7分钟

hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!


开启掘金成长之旅!这是我参与「掘金日新计划 · 4 月更文挑战」的第 14 天,点击查看活动详情

  • 起始标记->用Logstash和Beats构建数据管道(3讲):「77 | Logstash入门及架构介绍」
  • 结尾标记->用Logstash和Beats构建数据管道(3讲):「79 | Beats介绍」

Logstash入门及架构介绍

Logstash

  • ELT工具/数据搜集处理引擎。支持 200多个插件

image.png

Logstash Concepts

  • Pipeline
    • 包含了 input-filter-output 三个阶段的处理流程
    • 插件生命周期管理
    • 队列管理
  • Logstash Event
    • 数据在内部流转时的具体表现形式。数据在 input 阶段被转换为 Event,在 outout 被转化成目标格式数据
    • Event 其实是一个 Java Obiect,在配置文件中,对 Event 的属性进行增删改查

Logstash 架构简介

Codec (Code / Decode) : 将原始数据 decode 成 Event;将 Event encode 成目标数据 image.png

Logstash 配置文件结构

  • Bin/logstash -f demo.conf
  • Pipeline
    • Input / Filter / Output
  • Codec
    • Line /json

image.png

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

image.png

多 Pipelines 实例

image.png

  • 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…

Codec Plugin - Single Line

image.png

Codec Plugin -Multiline

  • 设置参数
    • Pattern:设置行匹配的正则表达式
    • What: 如果匹配成功,那么匹配行属于上一个事件还是下一个事件
      • PreviousI Next
    • Negate true / false: 是否对 pattern 结果取反
      • True / False

Codec Plugin -Multiline(异常日志)

image.png image.png

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

image.png image.png

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 集成
  • 全品类/轻量级/开箱即用/可插拔可扩展/可视化

image.png

Metricbeat 简介

  • 用来定期搜集操作系统,软件的指标数据
    • Metric v.s Logs
      • Metric -可聚合的数据,定期搜集
      • Logs 文本数据,随机搜集
  • 指标存储在 Elasticsearch 中,可以通过 Kibana 进行实时的数据分析

Metricbeat 组成

  • Module
    • 搜集的指标对象,例如不同的操作系统,不同的数据库,不同的应用系统
  • Metricset
    • 一个 Module可以有多个 metricset
    • 具体的指标集合。以减少调用次数为原则进行划分
      • 不同的 metricset 可以设置不同的抓取时长

Module

  • Metricbeat 提供了大量的开箱即用的 Module
  • 通过执行 metricbeat module list 查看
  • 通过执行 metricbeat moudle enable module name 定制

Metricbeat Event

image.png

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 核心技术与实战》