一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
简介
ElasticSearch 是一款基于 JSON 的分布式搜索引擎,简称 ES
ElasticSearch 基于 Lucene,隐藏了 Lucene 的复杂性,取而代之的是对外提供了一套简单一致的 Restful API
Elastic Stack 还被广泛运用在大数据近实时分析领域,包括:日志分析 、指标监控 、信息安全 等。它可以帮助你探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,通过使用机器学习,自动识别异常状况
ES 能做什么
ES 最擅长的,就是搜索!特别是模糊搜索!数字、文本、地理位置、结构化数据、非结构化数据。适用于所有数据类型。全文本搜索只是全球众多公司利用 Elasticsearch 解决各种挑战的冰山一角
对于数据来说,我们可以分为以下三种:
1)结构型数据
简单来说,结构型数据就是可以用二维表结构来组织的数据,称为结构型数据
比如学生信息可以这样表述
{
"name": "吉尔裤裆甩",
"age": 18,
"length": 18
"high": 180
}
复制代码
这些信息我们通常保存在关系型数据库中,比如 MySQL,Oracle 数据库,可以通过 SQL 很方便的管理这些数据,通过索引也可以加快我们查询的速度
2)非结构型数据
无法用二维表结构来描述的数据被称为非结构型数据
非结构型数据有很多,比如日志文件、各种文档、图片、视频、XML、HTML 等等,这种数据一般使用非关系型数据库存储(NO SQL),比如 MongoDB、Redis……
这种数据往往使用 Key Value 形式进行保存,通过 Key 来定位数据或许很快;但是有一点要知道的是,这种数据一般都是维度广,数据量大,无法做到和关系型数据库那样搜索,更无法去遍历,难以实现模糊搜索
为了对结构化和非结构化数据进行准确的查询,ElasticSearch 诞生了,对于数据的实时采集、分析、存储、搜索,由 ElasticSearch 为核心的 Elastic Stack 有着相当不错的表现,同时也是我们必须掌握的技能
ES 中的重要概念
- Near Realtime(NRT) - 近实时。数据提交索引后,立马就可以搜索到
- Cluster 集群 - 集群由一个唯一的名字标识,默认为“elasticsearch”;集群名称非常重要,具有相同集群名的节点才会组成一个集群
- Node 节点 - 存储集群的数据,参与集群的索引和搜索功能
- Index 索引 - 索引是一个文档的集合,每个索引有唯一的名字,可以通过这个名字来操作索引;一个集群中可以有任意多个索引
- Document 文档 - 被索引的一条数据,索引的基本信息单元,以JSON格式来表示
- Shard 分片 - 在创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上
- Replication 备份 - 一个分片可以有多个备份(副本)
与关系型数据库的基本概念对比
关系型数据库 | ElasticSearch |
---|---|
数据库(Database) | 索引(Index) |
表(Table) | 类型(Type)(将被废弃) |
行(Row) | 文档(Document) |
列(Column) | 字段(Field) |
表结构(Schema) | 映射(Mapping) |
索引 | 倒排索引(重点) |
SQL | 查询 DSL |
SELECT * FROM TABLE | GET http://…… |
UPDATE TABLE SET | PUT http://…… |
DELETE FROM TABLE | DELETE http://…… |
Elastic Stack 生态
以 Elasticsesarch 为核心,先是引入了 Kibina、Logstash,称为 ELK,后来又引入了 Beats,就由 ELK 更名为 Elastic Stack
其中:
-
ES:一款基于 JSON 的分布式搜索引擎,Elastic Stack 生态的核心
-
Kibana:实现数据可视化,以图表的形式呈现数据(柱状图、线状图、饼图、旭日图等等),并且具有可扩展的用户界面,可以全方位的配置和管理 ElasticSearch
-
Logstash:Logstash是动态数据收集管道 ,拥有可扩展的插件生态系统,能够动态地采集、转换和传输数据,并且不受格式或复杂度的影响;Logstash 能够与ElasticSearch产生强大的协同作用
-
Beats:负责采集数据的组件,Beats是一个面向轻量型采集器 的平台,这些采集器可以从边缘机器向Logstash、ElasticSearch发送数据,它是由Go语言进行开发的,运行效率方面比较快。从下图中可以看出,不同Beats的套件是针对不同的数据源
Elastic Stack 的发展历程
Elastic Stack 主要体现在日志收集系统的演变上
一个典型的日志系统主要包括以下几点
- 收集 - 能够采集多种来源的日志数
- 传输 - 能够稳定的把日志数据解析过滤并传输到存储系统
- 存储 - 持久化日志数据
- 分析 - UI 分析支持
- 警告 - 能够提供错误报告,监控机制
1)第一阶段,Beats 采集,ES 存储,Kinaba 展示
2)第二阶段引入了 Logstash
第二阶段引入 Logstash 后,相比第一阶段新增了很多的优势
- Logstash具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻背压
- 增加了更多的数据源,可以从其他数据源(例如数据库,S3或消息传递队列)中提取数据
- 可以将数据发往更多的目的地
- 使用条件数据流逻辑组成更复杂的处理管道
beats结合logstash带来的优势
- 水平可扩展性,高可用性和可变负载处理;Beats 和 logstash 可以实现节点之间的负载均衡,多个Logstash 可以实现 Logstash 的高可用
- 消息持久性与至少一次交付保证;使用 Beats 进行日志收集时,可以保证至少一次交付
- 具有身份验证和有线加密的端到端安全传输;从 Beats 到 Logstash 以及从 Logstash 到Elasticsearch 的传输都可以使用加密方式传递
- 增加更多数据源,如下图显示
3)第三阶段在 Beats 和 Logstash 中间添加了消息队列
中间件的加入有以下几点好处
- 降低对日志所在机器的影响,这些机器上一般都部署着反向代理或应用服务,本身负载就很重了,所以尽可能的在这些机器上少做
- 如果有很多台机器需要做日志收集,那么让每台机器都向Elasticsearch持续写入数据,必然会对Elasticsearch造成压力,因此需要对数据进行缓冲,同时,这样的缓冲也可以一定程度的保护数据不丢失
- 将日志数据的格式化与处理放到Indexer中统一做,可以在一处修改代码、部署,避免需要到多台机器上去修改配置
官方分享的 Elastic Stack 最佳实践
日志收集系统
Metric 收集和 APM 性能监控
多数据中心方案
通过冗余实现高可用
两个数据采集中心(比如采集两个工厂的数据),采集数据后的汇聚
数据分散,跨集群的搜索