Linux入门攻坚——86、ELK Stack-1-基本概念
ELK 技术栈ElasticsearchLogstashKibana‌核心组件‌‌Elasticsearch‌分布式搜索和分析引擎负责日志存储和检索基于 Lucene 实现倒排索引。‌Logstash‌数据收集管道负责日志的收集、过滤和格式化包含 input、filter、output 三个处理阶段。‌Kibana‌可视化界面将 Elasticsearch 数据通过图表展示提供实时分析功能。‌工作原理‌日志从各服务器收集后经 Logstash 处理格式化。存储到 Elasticsearch 进行索引和检索。通过 Kibana 仪表盘进行可视化展示和分析。‌应用场景‌日志分析处理、应用监控、安全分析、业务数据可视化。适合需要集中化管理分散日志的场景可将数小时排查工作缩短到几分钟。超大规模日志的收集、存储、搜索/分析都是一个现实面临的问题也是一个需要迫切解决的问题。延伸推广网络爬虫爬到的信息需要存储和检索与日志问题类似也需要一个收集、存储、搜索/分析过程。这类应用涉及海量数据以及全文搜索与分析。这就是搜索引擎\索引所涉及的技术。一个搜索引擎/程序数据结构算法关系型数据库系统就是由关系型数据存储模型和SQL算法组成。全文搜索也需要两个层次数据要保存下来需要一定的数据结构一定的搜索算法用户查询接口。搜索组件索引链搜索组件就是算法索引链就是数据结构。一个完整的全文搜索引擎其架构大体如下一个完整的搜索引擎系统用户需要一个接口与其交互即UI用户在UI中输入查询的内容获得查询的结果用户输入的查询内容需要经过构建查询的组件形成一个合规的查询然后由执行查询组件运行这个查询执行查询的组件需要借助索引从索引中查找具体的内容将找到的内容反馈给读取结果组件这个组件负责获取内容输出前的整理然后按照一定格式通过UI接口反馈给用户。查询的内容是从索引中获取的索引的建立要从获取原始内容开始通过一定的方式将原始数据如各服务器上的日志信息网络爬虫获取的网页信息等汇集后由获取内容组件进行分析整理然后通过构建文档组件创建文档通过分析文档组件对文档进行分析主要是将文本分割成一系列语汇单元还可能进行一些其他操作如语法修正、是否插入同义词、单词合并等最后由创建索引组件根据分析文档的结果创建索引。这个过程可以类比关系型数据库的过程索引组件完成的功能相当于数据的收集通过事务操作通过外部数据导入等方式在数据库中建立表并插入数据然后用户可以通过SQL交互工具从数据库中查找需要的结果就类似搜索组件完成的功能。全文搜索引擎是应对大数据时代信息检索需求的产物大数据时代的特征用4个V概括Volume数据量大数据规模从 TB 级跃升至 PB、EB 甚至 ZB 级Variety类型繁多‌涵盖结构化、半结构化和非结构化数据文本、图像、音视频、日志等Velocity‌处理速度快数据流速快对数据处理的实时性要求高Value价值密度低‌海量数据蕴含的巨大价值需算法挖掘提炼才能释放高整体价值。ElasticSearchElasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它是一个完整的搜索引擎实现了上图中的搜索组件和索引组件功能并能够实现对索引的分布式存储和处理扩展性好高可靠性。不过Elasticsearch的搜索和索引核心功能是借助于Lucene实现的是对Lucene的二次包装并提供更抽象的功能调用即Elasticsearch使Lucene更加易于使用。上图中的紫色部分就是Lucene实现的功能也就是搜索引擎核心的索引和搜索功能都是Lucene实现的。Elasticsearch在Lucene的基础上提供了分布式存储和处理实现高可用性提供了RESTful API扩展了多语言客户端驱动支持等。LuceneLucene是一款高性能、可扩展的信息检索IR工具库。IR —— Information Retrieval retrieve侧重从存储中“取回、调出”数据或信息常用于计算机、数据库语境可见这里的检索是要求数据提前准备好了的。信息检索库与Web搜索引擎是不同的两个概念。Lucene是一种搜索工具只是一个Java类库提供了一套简单而强大的核心API使用它们时不必深入理解全文索引和搜索机制。其本质是一个软件类库或者说是一个工具箱一个开源的全文搜索引擎工具包而并不是一个完整的搜索程序人们通常将Lucene误解为一个完整的搜索程序而实际上它只是搜索程序的核心索引和搜索模块而已。lucene专注于文本索引和搜索功能。Lucene主要实现的是全文检索是具有完整的查询引擎和索引引擎的全文检索库。Lucene能够把从文本中解析出来的数据进行索引和搜索其不关心数据来源、格式、语种只要能把它转换为文本格式即可可以索引和搜索存储在文件中的如下数据远程Web服务器上的网页、本地文件系统中的文档、简单的文本文件、Word文档、XML文档、HTML文档或PDF文档或其他能够从中提取文本信息的数据格式。信息检索IR常用的术语用户需求User Need简称UN用户需要获得的信息有时也称为主题Topic查询QueryUN提交给IR系统时称为查询文档Document是信息检索的对象可以是文本、图像、音视频等文档集Crops若干文档构成的集合文档集有时也称语料库文件系统中的文本文件、海量互联网网页、大量日志文件等都是文档集文档编号Document ID给文档集中的每个文档赋予的唯一标识符通过文档ID来区分不同的文档缩写为docID词条化tokenization将给定的字符序列拆分成一系列子序列的过程拆分的每个子序列称为一个词条词项Term是经过语言学预处理之后归一化的词条词项是索引的最小单位词项-文档关联矩阵Incidence matrix是表示词项和文档之间所具有的一种包含关系的概念模型。如从纵向即文档维度看每列代表一个文档包含的词项信息从横向即词项维度看每行代表该词项在文档中的分部信息。这个是一个很重要的术语实际上以纵向做索引即对文档做索引由文档找到词项就是正派索引以横向做索引即以词项做索引由词项找到所在文档就是倒排索引。词项频率Term frequency同一个词项在某个文档中出现的频率文档频率Document frequency出现某词项的文档的数目倒排记录表Posting lists用于记录出现过某个词项的所有文档的文档列表以及词项在该文档中出现的位置信息每条记录称为一个倒排项倒排文件Inverted file倒排记录表在磁盘中的物理存储文件分词算法就是词条化的算法将短语或句子切分的算法中文分词主要有3中方法词典匹配分词法、语义理解分词法、词频统计分词法倒排索引Inverted index索引是构成搜索引擎的核心技术之一倒排索引也被称为反向索引是一种索引的方法被用来存储在全文搜索下某个词项在一个文档或一组文档中的存储位置的映射。假设两个文档doc1和doc2doc1包含3个关键词苹果、香蕉、桃子doc2包含4个关键词苹果、香蕉、橘子、西瓜则文档和词语的包含关系即正排索引如下词语所属文档的关系就是倒排索引检索模型是判断文档内容与用户查询相关性的核心技术主要有以下几种布尔检索模型利用布尔运算符连接各个检索词进行逻辑运算找出所需信息的一种检索方法数学基础是集合论每篇文档被看成一系列词的集合tf-idf权重计算模型tf-idf称为词频-逆文档频率用以计算词项对于一个文档集或一个语料库中的一份文件的重要程度。词项的重要性随着它在文档中出现的次数成正比增加但同时会随着它在文档集中出现的频率成反比例下降。向量空间模型Vector Space ModelVSM把对文本内容的处理简化为向量空间中的向量计算以空间上的相似度表达语义的相似度其数学理论基础是余弦相似性理论向量Ax1x2...xn向量By1y2...ynSimA,Bcosθ 夹角余弦值cosθ 是与向量的长度无关的仅仅与向量的指向方向相关。概率检索模型从概率排序原理推导而来基本思想是给定一个查询返回的文档能够按照查询和用户需求的相关性得分高低来排序目前最成功的概率检索模型是BM25Best Match 25模型改进的是Okapi BM25模型。其数学基础是贝叶斯决策理论其在机器学习、自然语言处理等领域被广泛应用核心思想是选择高概率对应的类别。二值独立模型Binary Independence ModelBIM也是一种概率检索模型。Lucene深入了解Lucene实现了索引和搜索两种组件即一个完整的搜索引擎框架。上面的搜索引擎框架图的下半部分展现了所有搜索引擎的首要部分叫做索引操作负责将原始数据引入可被高效查找的对照表中以便能进行快速搜索。索引组件如需要搜索大量文件找出其中包含某词语的文件初级方法是顺序扫描每个文件看其是否包含这个词语此方法存在的问题是不能对太大或太多的文件进行处理。于是就需要引入索引建立针对文本的索引将文本内容转换为能够进行快速搜索的格式消除慢速顺序扫描处理带来的影响这个过程就叫做索引操作indexing它的输出就叫做索引index。搜索引擎使用的是倒排索引。索引的建立步骤获取内容 建立文档 文档分析 文档索引建立文档是在获取原始内容后需要对内容进行索引则首先必须将这些内容转换成部件通常称为文档。文档Document是包含了一个或多个域的容器fieldvalue field叫做域类似关系型数据库中的字段是键值对只是这里的键叫做域 真正搜索时搜索的是value的内容。并且文档中的域不像关系型数据库关系型数据库是有固定的Schema的字段是固定的而文档的域是不固定的。在这里文档这个词是一个很容易让人迷惑的术语没有接触搜索引擎前认为文档就是一个个文件文件系统中的一个个文件但在搜索引擎语境里文档更像是关系型数据库中表的一条记录文件系统中的一个文档在搜索引擎的建立文档过程中可能会生成多个文档即类似关系型数据库中插入多条记录。域field有很多选项索引选项、存储选项、域向量使用选项索引选项用于通过倒排索引来控制文本是否可被搜索IndexANYLYZED #分析(切词)并单独作为索引项Index.Not_ANYLYZED不分析(不切词)把整个内容当一个索引项Index.ANYLYZED_NO_NORMS类似ANALYZED但不存储token的Norms(加权基准)信息Index.Not_ANYLYZED_NO_NORMS类似于Not_ANALYZED但不存储值的Norms(加权基准)信息Index.NO: 不对此域的值进行索引因此不能被搜索存储选项是否需要存储域的真实值store.YES存储真实值store.NO不存储真实值域向量选项用于在搜索期间该文档所有的唯一项都能完全从文档中检索时使用文档和域的加权操作 加权计算标准文档分析搜索引擎不能直接对文本进行索引必须将文本分割成一系列词汇单元的独立原子元素这就是文档分析。分析Analysis在Lucene中指将域Field文本转换为最基本的索引表示单元——项Term的过程。将文本转换为语汇单元操作可能包括提取单词、去除标点符号、将字母转为小写也称规范化、去除常用词、将单词还原为词干形式等这个处理过程称为语汇单元化过程tokenization而从文本流中提取的文本块称为语汇单元token。语汇单元与它的域名结合后就形成了项/词项Term。使用Lucene时合适的分析器是非常关键的。文档索引在索引步骤中文档将被加入到索引列表。搜索查询Lucene索引时它返回的是一个有序的scoreDoc对象查询时Lucene会为每个文档计算出其scoreLucene是一个软件包或者叫类库提供的是一系列完成相关功能的接口即API搜索功能的API有如下几种IndexSearcher搜索索引入口Query及其子类QueryParserTopDocsScoreDocLucene的多样化查询 IndexSearcher中的search方法TermQuery对索引中的特定项进行搜索Term是索引中的最小索引片段每个Term包含了一个域名和一个文本值如new Term“title”“中国”。TermRangeQuery在索引中的多个特定项中进行搜索能搜索指定的多个域NumericRangeQuery做数值范围搜索PrefixQuery用于搜索以指定字符串开头的项BooleanQuery用于实现组合查询组合逻辑有: AND, OR, NOTPhraseQuery多关键字搜索WildcardQuery通配符搜索FuzzyQuery模糊查询LevenshteinElasticsearch深入理解从Lucene到ElasticsearchElasticsearch是一个基于Lucene实现的开源、分布式、Restful的全文本搜索引擎是一个搜索服务器使用Lucene构建索引、提供搜过功能、开放源码的企业级搜索引擎。Lucene只是一个Java语言编写的库Elasticsearch在Lucene基础上做了改进提供了多种语言接口专注于企业应用。此外它还是一个分布式实时文档存储其中每个文档的每个field均是被索引的数据且可被搜索也是一个带实时分析功能的分布式搜索引擎能够扩展至数以百计的节点实时处理PB级的数据。Elasticsearch的目标是让全文搜索变得简单通过简单的RESTFul API轻松实现搜索功能。基于Elasticsearch衍生出来的一系列开源软件统称为Elastic Stack主要包括分布式搜索引擎Elasticsearch、日志采集与分析工具Logstash、可视化分析平台Kibana、数据采集工具Beats家族等。没有引入Beats前Elasticsearch、Logstash、Kibana三者简称ELK stack。还有一个Tika是一个具有内置解析器用于处理各种文档类型的程序框架用于实现从各种文档中提取文本信息如从word、excel、PDF、RTF、TAR、ZIP等类型中提取文本信息。Elasticsearch简称为ES其是一个集群结构也可以单节点运行核心概念集群cluster一个或多个安装Elasticsearch的服务器节点组织在一起就是集群它们共同持有整个数据并提供索引和搜索功能。一个集群由一个唯一的名字标识称为cluster name集群名称非常重要具有相同集群名称的节点才会组成一个集群。可在配置文件中指定节点node一个节点就是集群中的一台服务器存储数据参与集群的索引和搜索功能。一个节点通过配置集群名称的方式加入一个指定的集群。运行了单个ES实例的主机。节点的标识靠节点名。索引index一个索引就是一个拥有几个相似特征的文档的集合文档容器换句话说索引是具有类似属性的文档的集合。类似于表。索引名必须使用小写字母类型type在一个索引中可以定义一种或多种类型一个类型是索引的一个逻辑上的分类或分区。文档Document一个文档是一个可被索引的基础信息单元。它包含了一个或多个域是域的容器基于JSON格式表示。每个域的组成部分一个名字一个或多个值拥有多个值的域通常称为多值域分片shard一个索引可以存储超出单个节点硬件限制的大量数据。这时就可以将索引划分成多份即分片。每个分片本身也是一个功能完善且独立的子索引这个子索引可被放置到集群中的任何节点上。分片很重要因为允许水平分割/扩展内容容量允许在分片上进行分布式的、并行的操作可以说分片是Elasticsearch集群的基础。副本集群环境中某个节点/分片可能会突然崩溃这时一个故障转移机制非常重要Elasticsearch允许创建分片的一份或多份拷贝这些拷贝叫做复制分片或副本。副本的作用一是在分片/节点失败情况下保证高可用因此副本不能与主分片在同一节点上二是扩展搜索量/吞吐量因为搜索可在副本上并行运行。映射(mapping)原始内容存储为文档之前需要事先进行分析例如切词、过滤掉某些词等映射用于定义此分析机制该如何实现除此之外ES还为映射提供了诸如将域中的内容排序等功能。每个索引可被分成多个分片一个索引可以有一份或多份副本一旦有了副本每个索引就有了主分片和副本分片之分。相关概念与关系型数据库的对比Elasticsearch可以看成一个数据库。RDMSElasticsearch数据库Database索引index表table类型type行row文档document列column域field表结构Schema映射Mapping索引全文索引SQL查询DSLSELECT * from tablenameGET http://......UPDATE table SETPUT http://......DELETEDELETE http://......ES Cluster工作过程启动时通过多播(默认)或单播方式在9300/tcp查找同一集群中的其它节点并与之建立通信。集群中的所有节点会选举出一个主节点负责管理整个集群状态以及在集群范围内决定各shards的分布方式。站在用户角度而言每个均可接收并响应用户的各类请求。集群有状态green, red, yellow文档结构Elasticsearch中的文档是用JSON来表示的JSONJavaScript Object Notation是一种轻量级的数据交换格式。JSON对象在花括号中书写对象包含多个名称/值对。