ELK
本文最后更新于:2023年12月5日 晚上
配套 B 站教程:https://www.bilibili.com/video/BV1Be4y167n9
Elastic Stack 在企业的常见架构
Elastic Stack 分布式⽇志系统概述
集群基础环境初始化
1.准备虚拟机
IP 地址 | 主机名 | CPU 配置 | 内存配置 | 磁盘配置 | 角色说明 |
---|---|---|---|---|---|
10.0.0.101 | elk101.oldboyedu.com | 2 core | 4G | 20G+ | ES node |
10.0.0.102 | elk102.oldboyedu.com | 2 core | 4G | 20G+ | ES node |
10.0.0.103 | elk103.oldboyedu.com | 2 core | 4G | 20G+ | ES node |
2.修改软件源
参考链接:https://mirrors.tuna.tsinghua.edu.cn/help/centos/
3.修改终端颜色
4.修改 sshd 服务优化
5.关闭防⽕墙
6.禁⽤ selinux
7.配置集群免密登录及同步脚本
8.集群时间同步
Elasticsearch 单点部署
1.下载
https://www.elastic.co/cn/downloads/elasticsearch
2.单点部署 elasticsearch
Elasticsearch 分布式集群部署
1.elk101 修改配置文件
2.同步配置⽂件到集群的其他节点
3.所有节点删除之前的临时数据
4.所有节点启动服务
5.验证集群是否正常
部署 kibana 服务
1.本地安装 kibana
2.修改 kibana 的配置⽂件
3.启动 kibana 服务
4.访问 kibana 的 webUI
略。。。
filebeat 部署及基础使用
1.部署 filebeat 环境
2.简单测试
2.1 编写配置文件
2.2 运行 filebeat 实例
2.3 测试
3.input 的 log 类型
4.input 的通配符案例
5.input 的通用字段案例
6.日志过滤案例
7.将数据写入 es 案例
8.自定义 es 索引名称
9.多个索引写入案例
10.自定义分片和副本案例
11.filebeat 实现日志聚合到本地
12.filebeat 实现日志聚合到 ES 集群
EFK 架构企业级实战案例
1.部署 nginx 服务
2.基于 log 类型收集 nginx 原生日志
3.基于 log 类型收集 nginx 的 json 日志
4.基于 modules 采集 nginx 日志文件
模块的基本使用
filebeat 配置⽂件(需要启⽤ nginx 模块)
/etc/filebeat/modules.d/nginx.yml
⽂件内容:
5.基于 modules 采集 tomcat 日志文件
6.基于 log 类型收集 tomcat 的原生日志
7.基于 log 类型收集 tomcat 的 json 日志
8.多⾏匹配-收集 tomcat 的错误日志
https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html
multiline.match
Specifies how Filebeat combines matching lines into an event. The settings are after
or before
. The behavior of these settings depends on what you specify for negate
:
Setting for negate |
Setting for match |
Result | Example pattern: ^b |
---|---|---|---|
false |
after |
Consecutive lines that match the pattern are appended to the previous line that doesn’t match. | |
false |
before |
Consecutive lines that match the pattern are prepended to the next line that doesn’t match. | |
true |
after |
Consecutive lines that don’t match the pattern are appended to the previous line that does match. | |
true |
before |
Consecutive lines that don’t match the pattern are prepended to the next line that does match. |
The
after
setting is equivalent toprevious
in Logstash, andbefore
is equivalent tonext
.
9.多⾏匹配-收集 elasticsearch 的错误日志
10.nginx 错误日志过滤
11.nginx 和 tomcat 同时采集案例
12.log 类型切换 filestream 类型注意事项
12.1.filestream 类型 json 解析配置
12.2.filestream 类型多行匹配
13.收集日志到 redis 服务
13.1.部署 redis
13.2.修改配置⽂件
13.3.启动 redis 服务
13.4.其他节点连接测试 redis 环境
13.5.将 filebeat 数据写入到 redis 环境
13.6.测试写入数据
14.今日作业
⽅案⼀:filebeat 多实例
filebeat 实例⼀:
filebeat 实例二:
方案二:基于 rsyslog 案例
部署 logstash 环境及基础使用
1.部署 logstash 环境
2.修改 logstash 的配置⽂件
3.input 插件基于 file 案例
4.input 插件基于 tcp 案例
5.input 插件基于 http 案例
6.input 插件基于 redis 案例
7.input 插件基于 beats 案例
8.output 插件基于 redis 案例
9.output 插件基于 file 案例
10.logstash 综合案例
1.filebeat-to-redis 参考笔记
2.filebeat-to-logstash 参考笔记
3.logstash 配置⽂件
11.今日作业
11.1 运行一个 logsash 版本
11.2.运行两个 logstash 版本
logstash 企业级插件案例(ELFK 架构)
1.gork 插件概述
Grok 是将⾮结构化⽇志数据解析为结构化和可查询的好⽅法。底层原理是基于正则匹配任意⽂本格式。
该⼯具⾮常适合 syslog ⽇志、apache 和其他⽹络服务器⽇志、mysql ⽇志,以及通常为⼈类⽽⾮计算机消耗⽽编写的任何⽇志格式。
内置 120 种匹配模式,当然也可以⾃定义匹配模式:
https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
2.使⽤ grok 内置的正则案例 1
3.使用 grok 内置的正则案例 2
4.使用 grop 自定义的正则案例
5.filter 插件通用字段案例
6.date 插件修改写入 ES 的时间
7.geoip 分析源地址的地址位置
8.useragent 分析客户端的设备类型
9.mutate 组件数据准备-python 脚本
9.mutate 组件常⽤字段案例
10.logstash 的多 if 分支案例
11.今日作业
filebeat 手机 tomcat 日志
filebeat 收集 nginx 日志
filebeat 收集 apps 日志
logstash 收集 nginx 日志
logstash 收集 tomcat 日志
logstash 收集 apps 日志
kibana 自定义 dashboard 实战案例
1.统计 pv(指标)
2.统计客户端 IP(指标)
3.统计 web 下载带宽(指标)
4.访问页面统计(水平条形图)
5.分析客户端的城市分布(垂直条形图)
6.城市分布百分比(饼图)
7.IP 的 TopN 统计(仪表盘)
8.自定义 dashboard
ElasticStack 二进制部署及排错
1.部署 Oracle JDK 环境
2.单节点 ES 部署
3.修改 ES 的堆(heap)内存大小
4.ES 启动脚本编写
5.部署 ES 集群
6.部署 kibana 服务
7.部署 logstash
7.部署 filebeat
8.部署 es-head 插件
9.部署 postman 组件
10.今⽇作业
ElasticSearch 的 Restful 风格 API 实战
1.Restful 及 JSON 格式
数据类型 | 描述 | 举例 |
---|---|---|
字符串 | 要求使⽤双引号(””)引起来的数据 | “oldboyedu” |
数字 | 通常指的是 0-9 的所有数字。 | 100 |
布尔值 | 只有 true 和 false 两个值 | true |
空值 | 只有 null 一个值 | null |
数组 | 使⽤⼀对中括号(”[]”)放⼊不同的元素(⽀持⾼级数据类型和基础数据类型) | [“linux”,100,false] |
对象 | 使⽤⼀对⼤括号(”{}”)扩起来,⾥⾯的数据使⽤ KEY-VALUE 键值对即可。 | {“class”:”linux80”,”age”:25} |
2.ElasticSearch 的相关术语
3.管理索引的 API
3.1 查看索引信息
3.2 创建索引
3.3 修改索引
3.4 删除索引
3.5 索引别名
3.6 索引关闭
3.7 索引打开
3.8 索引的其他操作
推荐阅读: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html
4.管理文档的 API
4.1 文档的创建
4.2 文档的查看
4.3 文档的修改
4.4 文档的删除
4.5 文档的批量操作
温馨提示: 对于⽂档的批量写操作,需要使⽤_bulk
的 API,⽽对于批量的读操作,需要使⽤_mget
的 API。
参考链接:
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docs-bulk.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docs-multi-get.html
4.6 课堂的练习
将下⾯的数据存储到 ES 集群:
5.使用映射(mapping)自定义数据类型
5.1 映射的数据类型
当写⼊⽂档时,字段的数据类型会被 ES 动态⾃动创建,但有的时候动态创建的类型并符合我们的需求。这个时候就可以使⽤映射解决。
使⽤映射技术,可以对 ES ⽂档的字段类型提前定义我们期望的数据类型,便于后期的处理和搜索。
- text: 全⽂检索,可以被全⽂匹配,即该字段是可以被拆分的。
- keyword: 精确匹配,必须和内容完全匹配,才能被查询出来。
- ip: ⽀持 Ipv4 和 Ipv6,将来可以对该字段类型进⾏ IP 地址范围搜索。
参考链接:
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/mapping.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/mapping-types.html
5.2 IP 案例
5.3 其他类型类型案例
6. IK 中文分词器
6.1 内置的标准分词器 - 分析英文
温馨提示: 标准分词器模式使⽤空格和符号进⾏切割分词的。
6.2 内置的标准分词器 - 分析中文并不友好
温馨提示: 标准分词器默认使⽤单个汉⼦进⾏切割,很明显,并不符合我们国内的使⽤习惯。
6.3 安装 IK 分词器
下载地址: https://github.com/medcl/elasticsearch-analysis-ik
安装 IK 分词器:
重启 ES 节点,使之加载插件:
测试 IK 分词器:
6.4 自定义 IK 分词器的字典
6.5 自定义分词器 - 了解即可
7. 今日作业
7.1 shopping.json
7.2 oldboyedu-linux80.json
参考案例 1
参考案例 2
索引模板
1.什么是索引模板
索引模板是创建索引的⼀种⽅式。
当数据写⼊指定索引时,如果该索引不存在,则根据索引名称匹配相应索引模板的话,会根据模板的配置⽽建⽴索引。
索引模板仅对新创建的索引⽣效,对已经创建的索引是没有任何作⽤的。
推荐阅读: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-templates.html
2.查看索引模板
3.创建/修改索引模板
4.删除索引模板
ES 的 DSL 语句查询 - DBA 方向需要掌握!
1.什么是 DSL
Elasticsearch 提供了基于 JSON 的完整 Query DSL(Domain Specific Language,领域特定语⾔)来定义查询。
2.全文检索 - match 查询
3.完全匹配 - match_phrase 查询
4.全量查询 - match_all
5.分页查询 - size-from
6.查看“_source”对象的指定字段
7.查询包含指定字段的文档 - exists
8.语法高亮 - hightlight
9.基于字段进行排序 - sort
10.多条件查询 - bool
11.范围查询 - filter
12.精确匹配多个值 - terms
13.多词搜索 - 了解即可
14.权重案例 - 了解即可
15.聚合查询 - 了解即可
ES 集群迁移
1.部署 ES6 分布式集群
2.基于_reindex 的 API 迁移
3.基于 logstash 实现索引跨集群迁移
ES 集群常用的 API
1.ES 集群健康状态 API(heath)
2.ES 集群的设置及优先级(settings)
3.集群状态 API(state)
4.集群统计 API(stats)
5.查看集群的分片分配情况(allocation)
集群分配解释 API 的⽬的是为集群中的分⽚分配提供解释。
对于未分配的分⽚,解释 API 提供了有关未分配分⽚的原因的解释。
对于分配的分⽚,解释 API 解释了为什么分⽚保留在其当前节点上并且没有移动或重新平衡到另⼀个节点。
当您尝试诊断分⽚未分配的原因或分⽚继续保留在其当前节点上的原因时,此 API 可能⾮常有⽤,⽽您可能会对此有所期待。
6.集群分片重路由 API(reroute)
reroute 命令允许⼿动更改集群中各个分⽚的分配。
例如,可以将分⽚从⼀个节点显式移动到另⼀个节点,可以取消分配,并且可以将未分配的分⽚显式分配给特定节点。
推荐阅读: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/cluster-reroute.html
7.今日作业
ES 集群理论篇
1.倒排索引
⾯试题: 分⽚底层时如何⼯作的?
答: 分⽚底层对应的是⼀个 Lucene 库,⽽ Lucene 底层使⽤倒排索引技术实现。
正排索引(正向索引)
我们 MySQL 为例,⽤ id 字段存储博客⽂章的编号,⽤ context 存储⽂件的内容。
此时,如果我们查询⽂章内容包含”Jason Yin”的词汇的时候,就⽐较麻烦了,因为要进⾏全表扫描。
倒排索引(反向索引)
ES 使⽤⼀种称为”倒排索引”的结构,它适⽤于快速的全⽂检索。
倒排索引中有以下三个专业术语:
1、词条:
指的是最⼩的存储和查询单元,换句话说,指的是您想要查询的关键字(词)。
对应英⽂⽽⾔通常指的是⼀个单词,⽽对于中⽂⽽⾔,对应的是⼀个词组。
2、词典(字典):
它是词条的集合,底层通常基于”Btree+”和”HASHMap”实现。
3、倒排表:
记录了词条出现在什么位置,出现的频率是什么。
倒排表中的每⼀条记录我们称为倒排项。
倒排索引的搜索过程:
- ⾸先根据⽤户需要查询的词条进⾏分词后,将分词后的各个词条字典进⾏匹配,验证词条在词典中是否存在;
- 如果上⼀步搜索结果发现词条不在字典中,则结束本次搜索,如果在词典中,就需要去查看倒排表中的记录(倒排项);
- 根据倒排表中记录的倒排项来定位数据在哪个⽂档中存在,⽽后根据这些⽂档的”_id”来获取指定的数据;
综上所述,假设有 10 亿篇⽂章,对于 mysql 不创建索引的情况下,会进⾏全表扫描搜索”JasonYin”。⽽对于 ES ⽽⾔,其只需要将倒排表中返回的 id 进⾏扫描即可,⽽⽆须进⾏全量查询。
2.集群角色
3.文档的写流程
4.单个文档的读流程
5.ES 底层存储原理剖析
事务⽇志存储在哪⾥?
什么时候删事务⽇志?
为什么要删?
6.乐观锁机制 - 了解即可
两种⽅法通常被⽤来解决并发更新时变更不会丢失的解决⽅案:
1、悲观并发控制
这种⽅法被关系型数据库⼴泛使⽤,它假定有变更冲突可能发⽣,因此阻塞访问资源以防⽌冲突。⼀个典型的例⼦是修改⼀⾏数据之前像将其锁住,确保只有获得锁的线程能够对这⾏数据进⾏修改。
2、乐观锁并发控制
ES 中使⽤的这种⽅法假设冲突是不可能发⽣的,并且不会阻塞正在尝试的操作。然⽽,如果源数据在读写当中被修改,更新将会失败。应⽤程序接下来该如果解决冲突。例如,可以重试更新,使⽤新的数据,或者将相关情况报告给⽤户。
python 操作 ES 集群 API 实战
1.创建索引
2.写⼊单个⽂档
3.写入多个文档
4.全量查询
5.查看多个文档
6.DSL 查询
7.查看索引是否存在
8.修改文档
9.删除单个文档
10.删除索引
ES 集群加密的 Kibana 的 RABC 实战
1.基于 nginx 反向代理控制 kibana
2.配置 ES 集群 TLS 认证
3.kibana 添加 ES 认证
4.kibana 的 RBAC
具体实操⻅视频。
5.logstash 写入 ES 加密集群案例
温馨提示:
建议⼤家不要使⽤ elastic 管理员⽤户给 logstash 程序使⽤,⽽是创建⼀个普通⽤户,并为该⽤户细化权限。
6.filebeat 写入 ES 加密集群案例
温馨提示:
建议⼤家不要使⽤ elastic 管理员⽤户给 filebeat 程序使⽤,⽽是创建⼀个普通⽤户,并为该⽤户细化权限。