ELK技术栈
- 概述
- elk是一套通用的日志收集处理展现的一套技术解决方案。包括3个部分:日志采集系统,日志存储系统,可视化展现系统。
Lucene搜索技术
-
概述
- 全文检索引擎工具包
-
检索方式
- 顺序扫描
- 按照顺序逐个扫描,没有索引情况的数据库记录
- 倒排索引扫描(全文检索) – Lucene
- 先创建索引的结构,通过索引结构定位位置,再提取数据
- 顺序扫描
-
传统查找
- 先找到文档,然后看是否匹配
-
倒排索引
- 先找到词条,然后看看哪些文档包含这些词条
-
Field域(字段)类型
-
DoubleField、FloatField、IntField、LongField、StringField、TextField(需要分词)
-
属性:Store.YES/NO代表存储/不存储,在搜索结果中也会展示/不展示出来
-
分词器
-
分类
- 标准分词器 StandardAnalyzer 中文支持不好
- SmartChineseAnalyzer 英文支持不好
- KAnalyzer 第三方中文分词器 2006年推出四个版本后,2012年12月稳定后没有更新
支持中英文分词、支持扩展词、支持停用词
-
引入
1.引入坐标
<dependency> <groupId>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> </dependency>
2.将ext.dic扩展词典、IKAnalyzer.cfg.xml配置文件、stopword.dic停用词典拷贝到resources
3.将分词器StandardAnalyzer替换成IKAnalyzer即可
4.重新运行createIndex方法生成索引库
ElasticSearch
简介
-
高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性
-
ElasticSearch对比solr
- Solr 利用 Zookeeper 进行分布式管理(zookeeper比较稳定),而 Elasticsearch 自身带有分布式协调管理功能(zen);
- Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
- Solr 官方提供的功能更多(only one),而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
- Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch
- 传统搜索:数据量可控,搜的内容在一段时间内是静态的
- 实时搜索:例如日志信息,实时会增加新的内容,日志信息量大
启动
- elasticsearch集群
- 当ElasticSearch的节点启动后,它会利用多播(multicast,一种网络广播方式)寻找集群中的其它节点,并与之建立连接。
- 发现机制
- Zen 发现机制是ElasticSearch中默认的用来发现新节点的功能模块,而且集群启动后默认生效。
- Zen发现机制引入了第二种发现节点的方法:单播模式。
- 多播发现机制可能会产生太多不必要的流量开销,这是不使用多播的一个充分理由
- 集群配置
- name: 主机名
- cluster_name: 集群名
- 该节点就会自动添加到与节点中集群名字(cluster.name)一样的集群
- cluster_uuid: 集群UUID
核心概念
- 概述
- ElasticSearch是面向文档(document)的,意味着他可以存储整个对象或者文档,还会对文档的内容进行索引的创建,使文档可以被搜索到。
- 核心概念
- 接近实时的NRT
- ES是一个近实时的搜索平台,也就是索引一个文档到这个文档能被搜索到会有轻微延迟(通常为1秒)。
索引会先写入内存,然后在写入磁盘。
- ES是一个近实时的搜索平台,也就是索引一个文档到这个文档能被搜索到会有轻微延迟(通常为1秒)。
- 集群 cluster
- 一个集群就是由一个或多个节点组织在一起,他们共同持有整个数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。集群的名字很重要,集群内的节点只能通过制定集群的名字来加入集群。
- 节点 node(相当于数据库服务器)
- 一个节点就是集群中的一个服务器,作为集群的一部分,节点存储数据,参与集群的索引和搜索功能。一个节点是由一个【节点名】来标识的,节点名一个随机字符串。默认情况下,节点名是由ElasticSearch服务在节点第一次启动的时候随机生成,之后这个节点就会一直使用这个节点名。
- 节点通过配置集群名字来加入集群,默认情况下,节点会寻找集群名为“elasticSearch”的集群中。意味着:如果同一网络中启动了若干个节点,并且没有修改默认配置,那么这些节点可以互相发现彼此,并形成一个叫做“elasticSearch”的集群
- 索引 index (相当于库) 名词
- 一个索引实际上是一个“逻辑命名空间”,是文档的集合。一个索引由索引名字来标识,名字必须【小写字母】。我们在进行文档的索引(动词)、搜索、更新、删除的时候,都要用索引名。在一个集群中,可以定义多个索引
- 索引存储在多个分片中,其中每一个分片都是一个独立的 Lucene Index。这就应该能提醒你,添加新 index 应该有个限度:每个 Lucene Index 都需要消耗一些磁盘,内存和文件描述符。因此,一个大的 index 比多个小 index 效率更高:Lucene Index 的固定开销被摊分到更多文档上了
- 在搜索时,每个分片都需要搜索一次, 然后 ES 会合并来自所有分片的结果。例如,你要搜索 10 个 index,每个 index 有 5 个分片,那么协调这次搜索的节点就需要合并 5x10=50 个分片的结果。这也是一个你需要注意的地方:如果有太多分片的结果需要合并,或者你发起了一个结果巨大的搜索请求,合并任务会需要大量 CPU 和内存资源。
- 类型 type (相当于表)
- 在一个索引中,可以定义多个类型。类型是对文档的【逻辑】分类
在ElasticSearch5.X的版本中支持一个索引下有多个type
- 在一个索引中,可以定义多个类型。类型是对文档的【逻辑】分类
- 文档 document (相当于一条数据)
- 文档是ElasticSearch的基本单位。在Es中文档以JSON格式来表示
- 属性 field (相当于字段)
- 属性是文档中的各个内容,需要对每一个属性定义索引和被搜索的方式
- 数据类型
- 字符串类型:string、text
- 数值类型:字节(byte)、2字节(short)、4字节(integer)、8字节(long)、float、double;
- 布尔类型:boolean,值是true或false;
- 时间/日期类型:date,用于存储日期和时间;
- 二进制类型:binary;
- IP地址类型:ip,以字符串形式存储IPv4地址;
- 特殊数据类型:token_count,用于存储索引的字数信息
- 公共属性
- index:该属性控制字段是否编入索引被搜索,该属性共有三个有效值:analyzed、no和not_analyzed:
- analyzed:表示该字段被分析,编入索引,产生的token能被搜索到;
- not_analyzed:表示该字段不会被分析,使用原始值编入索引,在索引中作为单个词;
- no:不编入索引,无法搜索该字段;
- 其中analyzed是分析,分解的意思,默认值是analyzed,表示将该字段编入索引,以供搜索。
- store:指定是否将字段的原始值写入索引,默认值是no,字段值被分析,能够被搜索,但是,字段值不会存储,这意味着,该字段能够被查询,但是不会存储字段的原始值。
- index:该属性控制字段是否编入索引被搜索,该属性共有三个有效值:analyzed、no和not_analyzed:
- 接近实时的NRT
分片 和 复制
- 分片:就是把索引数据切分成多个小的索引块,这些小的索引块能够分发到同一个集群中的不同节点。
- lasticSearch集群通过把数据分发到多个存储Lucene索引的物理机上,达到能够存储超出单机容量的信息这一目的。这个分发的过程称为索引分片(Sharding)。
- 在ElasticSearch集群中,索引分片(Sharding)是自动完成的,而且所有分片索引(Shard)是作为一个整体呈现给用户的。
- 当你查询的索引分布在多个分片上时, Elasticsearch会把查询发送给每个相关的分片,并将结果【合并】在一起,而应用程序并不知道分片的存在。
- 索引数据的操作只会发生在主分片上(primary shard)上,不会发生在分片的副本上。
- 复制
- Elasticsearch索引是由一个或多个分片组成的,每个分片包含了文档集的一部分。
- 采用Elasticsearch默认设置时,索引结束后将得到5个分片及对应的副本。
- “副本”(replica)意味着每一个分片都有自己的分片副本(copy),所以实际上有5个分片和5个相应分片副本。
mapping映射
- apping定义了文档中的每一个field如何被索引和被查询到
IK分词器和ElasticSearch集成
-
集成
- 把IK分词器压缩包放在plugins中,解压缩并改名为ik
-
分词方式
-
“ik_smart” 最小分词
-
“ik_max_word” 最大分词
-
POST _analyze { "analyzer": "ik_max_word", //“ik_smart” "text": "我是中国人" }
-
Kibana 客户端
-
概述(相当于SQLyog)
- Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等。
- 而且还提供了操作Elasticsearch索引数据的控制台,并且提供了一定的API提示,非常有利于我们学习Elasticsearch的语法
-
运行配置
-
修改elasticsearch服务器的地址:
elasticsearch.url: "http://127.0.0.1:9200"
-
双击运行 kibana.bat
-
监听端口是5601
-
DevTools菜单,即可进入控制台页面
-
聚合aggregations
- **桶(bucket)**对比分组
- Date Histogram Aggregation:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
- Histogram Aggregation:根据数值阶梯分组,与日期类似,需要知道分组的间隔(interval)
- Terms Aggregation:根据词条内容分组,词条内容完全匹配的为一组
- Range Aggregation:数值和日期的范围分组,指定开始和结束,然后按段分组
- **度量(metrics)**对比聚合函数
- Avg Aggregation:求平均值
- Max Aggregation:求最大值
- Min Aggregation:求最小值
- Percentiles Aggregation:求百分比
- Stats Aggregation:同时返回avg、max、min、sum、count等
- Sum Aggregation:求和
- Top hits Aggregation:求前几
- Value Count Aggregation:求总数
Logstash
-
概念
- 是elastic旗下的一款轻量级日志搜索处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置
-
将MySQL数据导入Elasticsearch中
-
在logstash-5.6.8目录下建立文件夹 mysqletc (文件夹名随意)
-
在 mysqletc文件下创建 mysql.conf 文件 (名称随意)内容模板如下:
input { jdbc { # mysql jdbc connection string to our backup databse jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/crawler?characterEncoding=UTF8" # the user we wish to excute our statement as jdbc_user => "root" jdbc_password => "admin" # the path to our downloaded jdbc driver jdbc_driver_library => "F:\logstash\logstash-5.6.8\mysqletc\mysql-connector-java-5.1.46.jar" # the name of the driver class for mysql jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_paging_enabled => "true" jdbc_page_size => "2000" #以下对应着要执行的sql的绝对路径。 #statement_filepath => "" statement => "select * from job_info" #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出) schedule => "* * * * *" } } output { elasticsearch { #ESIP地址与端口 hosts => "127.0.0.1:9200" #ES索引名称(自己定义的) index => "job" #自增ID编号,指定表ID列 document_id => "%{id}" document_type => "jobInfo" } stdout { #以JSON格式输出 codec => json_lines } }
-
将模板中的 内容 指定完之后,就可以在 logstash-5.6.8 的bin目录下打开cmd窗口来运行 mysql.conf 文件了
执行 logstash -f …/mysqletc/mysql.conf 命令! 等待执行结果…
-
数据可以根据设置的更新corn表达式更新,所有新增修改可以更新,删除无法更新,但是删除可以改为逻辑删除
-