入门elaticsearch

杂谈

     在写这篇博客的时候,我内心经不住要吐槽下我上一家公司, 具体名字不说了. 公司是一家创业公司, 感觉公司不是一家务实的公司. 公司没有一位好的CTO. 你能想象我们的CTO不会敲代码. 公司CTO把大数据平台和算法平台都交给了两位主管, 但是不幸的是,这两个主管也都是磨嘴皮子的,做管理的. 所以说整个公司技术是比较垃圾. 就拿这个ES来说吧, 由于对这个es认识的不够深刻, 导致最后依赖的项目很费力, 费时. 但是他们现在还不知道. 整个公司都是招研究生,高学历的人. 我心里不好说的是, 搞IT行业, 你去找那些没有久经战场的人, 你去找那些高学历的人. 他们除了会玩弄办公室政治,还会什么? 做什么事, 都不尽心尽力, 想办法讨好领导. 关键领导对这种人很喜欢. 你一个创业公司你不重技术, 你重政治. 活该你创业不起来.
     吐槽了 半天, 我来谈谈我的对创业的认识吧 .我觉得作为一个创业公司最重要的是要有一个厉害的CTO, 在这个行业无论技术还是资历都是走在时代的前沿. 殊不知多家公司在一个赛道上赛跑, 没有好的技术支撑, 你会远远的落后于别人. 闲话少说了. 我们来学习学习ES吧. ES全程是Elaticsearch.  在大数据处理中一般作为结果的存储的地方. 提供结果给前段应用. 下面来介绍里面的主要组件

 

近实时(NRT)

 

        Elaticsearch是一个近乎实时的搜索平台。这意味着从你索引文档到可搜索的时间有一点点的延迟。(通常是一秒钟)

 

集群

 

        集群指的是一个或者多个节点(服务器)的集合,这些节点会一起保存数据,并且会在所有的节点上提供联合索引和搜索的功能。一个集群通常会被一个名字所标示,当然,它的默认值是‘Elaticsearch’。这个名字是十分重要的,因为如果一个节点想要加入这个集群那么必须依靠这个名字来加入。 
        值得说明的是,确保不要在不同的环境中使用相同的集群名称。否则你的节点可能会加入错误的集群。例如你可以使用logging-dev、logging-stage和logging-production来给不同的环境的集群命名。 
        请注意,拥有一个节点的集群是有效和完美的。此外,你还可以拥有多个独立的集群,但是每个集群都必须有自己的独立的集群名称。

 

节点

 

        节点指的是一个集群中的单个机器,它存储数据、并且参与集群的索引和搜索功能,实际上就像一个集群。一个节点也是被一个名字所标示,其默认的名称是在节点启动时候的分配给他的唯一标示符(UUID)。你可以任意定义你的节点名称。如果你带着管理的目的的话,那么这些名字无疑是很重要的。当您希望确定网络中的那些服务器对应于Elaticsearch集群中的那些节点得时候。 
        一个节点可以通过一个集群名加入某一个集群。默认情况下,每一个节点都会加入名为elasticseaarch的集群中。这意味着在你的网络环境中当你启动了一些节点,在这里我们假设他们可以互相发现对方,他们将会全部自动的加入和形成一个名为elaticsearch的集群。 
        在一个集群中,你可以拥有您想要的任意多的节点。此外如果当前没有任何的节点在你的网络环境中运行,此时启动的单个节点将会形成名为elaticsearch的新的单节点集群。

 

索引

 

        索引指的是一系列文档的集合,这些文档有着共同的特性和特征。举例来说:你可以拥有客户数据的索引,产品目录的索引以及订单数据的索引。索引由名称,当然在命名时候必须全部为小写字母,该名称的作用是可以针对其中存在的文档执行索引,搜索更新和删除操作时候也可以借用名称引用索引。 
        在单个集群中,你可以根据需要定义任意多的索引。

 

类型

 

        在索引中,你可以定义一种或者多种类型。类型的你的索引的逻辑类别/分区,当然,其中的含义取决于你自己。一般而言,一种类型定义是为了给一个拥有共同的元素的集合。例如,假设你运行一个博客的平台,并且将所有的数据保存在单个的索引中,在此索引中你可以定义用户数据的类型、博客数据的类型以及注释数据的类型。

 

文档

 

        文档可以被索引的基本单元。例如,你可以拥有一个针对单个消费者的文档,另一个用于单个订单信息的文档。该文档以JSON(JavaScript Object Notation)表示,JOSN是一种无处不在的互联网数据的交换格式。 
        在一个索引/类型中,你可以存储任意多的文档。需要注意的是尽管文档在物理上是属于索引的,但是他会被分配给特定的索引类型。

 

分片&副本

 

        一个索引中可能存放非常多的数据,这些数据甚至有可能超越一个单节点机器的资源限制。例如一个索引中如果有十亿个文档的话将会占用多达1Tb的空间,而这些是无法从单个节点提供搜索请求的,因为这将十分缓慢。 
        想要解决这个问题,elaticsearch提供了可以将你的索引分片的能力,这些分片成为切片。每当你创建一个索引的时候,你可以十分轻松的制定这个索引的分片个数。每个分片就是一个功能完整且独立的索引,当然,他们可以分布在集群的任意一个节点上。 
        分片十分重要,主要原因有两个:

 

1 它允许你水平的分割你的内容卷

2 它允许你在分片(可能在多个节点上)分布和并行的操作,从而提高整个集群的性能和吞吐量。

 

        搜素请求分发的机制以及文档最终如何汇总到搜索请求完全由elaticsearch来进行管理,这对于你来说是透明的。

 

        在可能发生故障的网络/云环境中,尤其是故障随时可能发生,我们强烈的建议采用故障转移机制,防止分片或者节点脱机或者消失。为此,elaticsearch允许您将索引的分片的一个甚至多个复制到所谓的复制分片上去,这也别我们成为副本。 
        副本十分重要,主要原因有两个:

 

1 当主分片出现故障的时候,副本即可提供高可用的特性。因此,需要注意的是,复制分片分配的节点绝不会同原始的分片在同一个数据节点上。 
2 它同样可以提升扩展搜索量/吞吐量,因为可以对所有的副本执行并行的搜索请求。

 

        总而言之,每个索引可以分为多个数据分片。索引的复制分片也可以被设置为0,当然,这意味着没有数据分片。一旦复制,每个索引都将具有原始的数据分片以及副本。你可以在创建索引的时候指定副本的数量。 
当你创建索引后,你可随时修改副本数,但是分片数已经固定,无法修改。

 

        默认情况下,Elasticsearch中的每个索引都分配了5个主分片和1个副本,这意味着如果您的集群中至少有两个节点,则索引将具有5个主分片,另外5个复本分片(1个完整副本)。一共是10个数据分片。

 

NOTE 
每一个搜索的数据分片都是一个Lucene索引,在一个Lucene索引所能拥有的最大文档数量为Integer.MAX_VALUE-128。当然,你可以采用_cat/shards api监视数据分片。

 

posted @ 2019-01-22 14:32  Commander·  阅读(607)  评论(0编辑  收藏  举报