为什么ElasticSearch应用开发者需要了解cluster state

原文链接: https://www.loggly.com/blog/p...

在前面的文章(ES vs Solr)中我们提到, ES构建了Loggly的很多核心功能. 在把这项通用搜索技术用于我们的日志管理系统, 并为超过5000多客户提供准实时服务的过程中, 我们在技术上成长颇多. 按照我们对开源社区的尊重, 在此希望能把我们所学到的知识回馈到社区.

本文将探讨对ES扩展过程中的性能有深远影响的关键概念: cluster state.

什么是cluster state

ES的一个突出优点是其无模型规则约束. 起初, 你可以把一个包含任意字段数目的文档添加到索引中, 而并不需要提前在ES中定义这些字段的类型. 能把这些字段添加到索引并随后进行搜索是件让人兴奋的事情. 但这些字段的名称, 类型以及它们被添加到的索引信息则会自动添加到ES的cluster state信息中(假设你使用了默认的动态mapping设置. 当然像ES的其他配置一样, 你可以调整或禁用该行为).

当然,这里还有些秘密: 如果你向一个已存在的字段(例如integer)中试图添加另外一种类型(例如string)的字段值时, ES将会失败. 同一个索引中的相同字段不能同时具有两种不同类型. 这称为mapping冲突. ES的处理取决于涉及的具体类型. 例如:

  • 如果向一个字符串类型中添加整数值, 则会进行强制类型转换

  • 如果向一个整数类型中添加字符串值, 则会遇到异常, ES拒绝接收该文档.

所以关注下你的ES响应,尤其在使用bulk做批量索引时.

cluster state是你的重要参考

像其他倒排索引一样, 当你搜索数据时, ES需要知道这些数据的元信息及其存储位置. 当节点接收到查询请求, 首先要做的就是你要查询的对象在哪些分片上, 然后判断这个索引上有哪些字段以及它们的类型.(你不能在一个字符串类型的字段上进行数字范围查询). 而这些信息都记录在cluster state之中.

顾名思义, cluster state是全局性信息, 包含了整个群集中所有分片的元信息(规则, 位置, 大小等信息), 并保持每个每节的信息同步.

在一个包含众多节点的集群中, ES是如何做到信息同步的呢? 原来ES的cluster state信息是由master节点维护的, 当它收到data节点的状态更新变化后, 就把这些信息依次广播到其他节点, 仅此而已.

假如你的cluster state每2½分钟更新300磅

请记住: cluster state是你的群集中每个节点上的每个索引包含的每个分片的所有字段信息. 如果你有大量的字段, 例如把ES作为大量易变且无固定规则文档的存储, 那么cluster state将会变得庞大. 在Loggly服务中恰恰如此. 因为客户发送给我们的文档格式随意, 包含任意数据的唯一字段, 并且数量跨度较大. 我们每秒处理数十万次请求, 所以Loggly的cluster state可达数百兆大小.

希望你看到光明之门

也许警告声已在你脑海中响起: "你是说当有任何变化时, ES会广播数百兆的数据到不同节点?". 也许事实并不像你想像的那么糟糕. 在cluster state管理方面, ES已经做了几个优化:

  • 从ES2.0以来, 只有变化的cluster state信息才会被广播. 相比以前的版本, 这带来了巨大的性能提升.

  • 在ES节点前传递信息之前, ES对cluster state做了效果显明的压缩.

  • ES在合并cluster state更新以及批量处理上相当明智, 特别是最近的ES版本中.(在后面的文章Pending Tasks会介绍前期版本中未做这些优化时的内部处理)

即便如此, 经常关注你的cluster state也是很有必要的. 另外, 我们发现在规模化运行ES集群早期, 索引大量数据之前要做的第一件事, 就是为ES的cluster state数据量设置上限, 以避免超出ES处理能力而导致集群故障. 关于cluster state更严重的问题--以及在Loggly, 我们是如何解决cluster state问题的--将会在以后的文章出介绍, 希望能对你有所帮助.

cluster state示例

下面是一个具有两个节点的集群, 其中包含了只有一条文档的一个索引的cluster state信息. 当然这与我们真实场景中的数据有很大区别, 因为在我们的集群中有很多机器和大量的索引节点以及超出你想象的mapping数量. 但这个例子已经足够让你了解cluster state所包含的信息了.

{"cluster_name" : "elasticsearch","version" : 11,"master_node" : "-mq1SRuuQoeEq-3S8SdHqw","blocks" : { },"nodes" : {"sIh5gQcFThCcz3SO6txvvQ" : {"name" : "Max","transport_address" : "inet[/162.245.23.194:9301]","attributes" : { }},"-mq1SRuuQoeEq-3S8SdHqw" : {"name" : "Llyron","transport_address" : "inet[/162.245.23.194:9300]","attributes" : { }}},"metadata" : {"templates" : { },"indices" : {"blog" : {"state" : "open","settings" : {"index" : {"uuid" : "UQMz5vbXSBqFU_8U3u4gYQ","number_of_replicas" : "1","number_of_shards" : "5","version" : {"created" : "1030099"}}},"mappings" : {"user" : {"properties" : {"name" : {"type" : "string"}}}},"aliases" : [ ]}}},"routing_table" : {"indices" : {"blog" : {"shards" : {"4" : [ {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 4,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 4,"index" : "blog"} ],"0" : [ {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 0,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 0,"index" : "blog"} ],"3" : [ {"state" : "STARTED","primary" : false,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 3,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 3,"index" : "blog"} ],"1" : [ {"state" : "STARTED","primary" : false,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 1,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 1,"index" : "blog"} ],"2" : [ {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 2,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 2,"index" : "blog"} ]}}}},"routing_nodes" : {"unassigned" : [ ],"nodes" : {"sIh5gQcFThCcz3SO6txvvQ" : [ {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 4,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 0,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 3,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 1,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "sIh5gQcFThCcz3SO6txvvQ","relocating_node" : null,"shard" : 2,"index" : "blog"} ],"-mq1SRuuQoeEq-3S8SdHqw" : [ {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 4,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 0,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 3,"index" : "blog"}, {"state" : "STARTED","primary" : true,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 1,"index" : "blog"}, {"state" : "STARTED","primary" : false,"node" : "-mq1SRuuQoeEq-3S8SdHqw","relocating_node" : null,"shard" : 2,"index" : "blog"} ]}},"allocations" : [ ]
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给 MySQL 增加 Sequence 管理功能

-- Sequence 管理表 DROP TABLE IF EXISTS sequence; CREATE TABLE sequence ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 1, PRIMARY KEY (name) ) ENGINEInnoDB; -- 取当前值的函数 DROP FUNCTION IF EXISTS currval; DE…

最优化学习笔记(六)——牛顿法性质分析

一、牛顿法存在的问题 在单变量的情况下&#xff0c;如果函数的二阶导数f′′<0&#xff0c;牛顿法就无法收敛到极小点。类似的&#xff0c;在多变量的情况下&#xff0c;目标函数的hessian矩阵F(x(k))非正定&#xff0c;牛顿法的搜索方向并不一定是目标函数值的下降方向。甚…

从FLC中学习的设计模式系列-创建型模式(3)-工厂方法

工厂方法是一组方法&#xff0c; 他们针对不同条件返回不同的类实例&#xff0c;这些类一般有共同的父类。 工厂方法模式 来自&#xff1a; http://zh.wikipedia.org/wiki/工厂方法模式 工厂方法模式 是一种面向对象的设计模式。通过调用不同的方法返回需要的类&#xff0c;而不…

Elasticsearch索引的数据存储路径是如何确定的

Elasticsearch中&#xff0c;在node的配置中可以指定path.data用来作为节点数据的存储目录&#xff0c;而且我们可以指定多个值来作为数据存储的路径&#xff0c;那么Elasticsearch是如何判断应该存储到哪个路径下呢&#xff1f;今天我就记录一下这个问题。 Elasticsearch的索…

带分页码的分页算法

int start 1, end 10;//如果总页数小于结束页码if (PageCount < end){//则结束页码为总页数end PageCount;}else{//当前页大于5后开始重新计算起始页,否则起始页为1start PageIndex > 5 ? PageIndex - 5 : start;//起始页码加9减去总页数,用于查看是否超过了总页数i…

最优化学习笔记(七)——Levenberg-Marquardt修正(牛顿法修正)

上节末尾谈到牛顿法中隐含的另外一个问题在于hessian矩阵可能不是正定的。因此&#xff0c;d(k)−F(x(k))−1g(x(k))\boldsymbol{d}^{(k)} = -\boldsymbol{F}(\boldsymbol{x}^{(k)})^{-1}\boldsymbol{g(x^{(k)})} 可能不会是下降方向。Levenberg-Marquardt修正可以解决这个问…

Elasticsearch内存

核心概念 基于LuceneJava应用 内存使用分析 Lucene的内存消耗 倒排索引。&#xff08;堆内存&#xff09; Lucene中&#xff0c;索引是存储在磁盘中&#xff0c;一个索引&#xff08;Index&#xff09;由多个段&#xff08;Segment&#xff09;组成。当启动IndexSearcher时&…

Canal数据堆积

记录一下canal的问题。数据同步一直使用阿里开源的canal&#xff0c;最近使用过程中遇到一些问题&#xff0c;在这里记录一下。 原因 我们使用canal监听MySQL&#xff0c;然后通过client获取发送到mq&#xff08;自定义格式&#xff09;。最近数据组的同事批量更新了一次数据…

最优化学习笔记(八)——共轭方向法

从这节开始&#xff0c;将学习共轭方向法的相关内容&#xff0c;本篇先做一个简短的开篇。共轭方向法的计算效率不如之前的牛顿法&#xff0c;但是也优于最速下降法。它有以下优势&#xff1a; 对于n维二次型问题,能够在n步之内得到结果&#xff1b;作为共轭方向的典型代表&am…

解决PhoneGap在Android手机上的全屏问题

目前&#xff0c;结合PhoneGap 框架使用HTML5JavaScriptCSS3开发Android或IOS系统上的应用和游戏已经成为可能性&#xff0c;这两天自己使用HTML5开发了一款小型悠闲游戏&#xff0c;使用PhoneGap打包成APK运行在Android手机上&#xff0c;却遇到不能全屏&#xff0c;想了好久&…

ES学习笔记之-ClusterState的学习

前面研究过ES的get api的整体思路&#xff0c;作为编写ES插件时的借鉴。当时的重点在与理解整体流程&#xff0c;主要是shardOperation()的方法内部的调用逻辑&#xff0c;就弱化了shards()方法。实际上shards()方法在理解ES的结构层面&#xff0c;作用更大一些。我们还是从get…

最优化学习笔记(九)——基本的共轭方向算法

一、基本共轭方向算法 对于n维二次型函数的最小化问题: f(x)=12xTQx−xTb f(x)=\frac{1}{2}\boldsymbol{x^TQx-x^Tb}其中&#xff0c;QQT>0,x∈Rn。因为Q>0,所以函数f有一个全局极小点,可以通过求解Qx=b得到。 基本共轭方向算法 给定初始点x(0)和一组关于Q共轭的方向…

HTML简单实例加表单的显示效果

HTML可以说是一种十分简单的标记语言&#xff0c;但是对于Web开发还是必不可少的&#xff0c;所以对HTML的标记进行适当的了解 还是十分有必要的。下面我们来演示一下基本的HTML效果和一些简单的标签&#xff0c;以及在表单界面的各种提交方式。 首先是HTML的常用简单标签。 &l…

机器学习笔记(十二)——马尔科夫模型

马尔科夫模型是一种概率图模型&#xff0c;它描述了一类重要的随机过程(随机过程又称为随机函数&#xff0c;是随时间而随机变化的过程)。我们常常需要考察一个随机变量序列&#xff0c;这些随机变量序列并不是相互独立的&#xff0c;每个随机变量的值都依赖于这个序列前边的状…

用Java代码在ElasticSearch中索引PDF文件?

以下是我的代码&#xff1a; InputStream inputStream new FileInputStream(new File("mypdf.pdf"));try {byte[] fileByteStream IOUtils.toByteArray(inputStream );String base64String new String(Base64.getEncoder().encodeToString(fileByteStream).getBy…

美国影视演员协会选择了Windows Azure

娱乐行业的主要组织之一的美国影视演员协会&#xff08;SAG&#xff09;最近因云计算的需要选择Windows Azure解决方案。美国影视演员协会将他们的网站从基于Linux的服务器迁移到支持他们的最大年度事件——美国演员工会奖的Windows Azure上。 每年的年度颁奖典礼的到来标志着一…

最优化学习笔记(十)——对偶线性规划

一、对偶问题 每个线性规划问题都有一个与之对应的对偶问题。对偶问题是以原问题的约束条件和目标函数为基础构造而来的。对偶问题也是一个线性规划问题&#xff0c;因此可以采用单纯形法&#xff08;有关单纯形法会在以后的笔记中补充&#xff09;求解。对偶问题的最优解也可以…

elasticsearch基本查询二(英文分词)term和terms查询

term和terms查询(查找zhaoliu这个人的信息) term query会去倒排索弓|中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword、numeric. date. term:查询某个字段里含有某个关键词的文档 GET /lib3/user/_search/ { "query":{ "term": {interests&…

Iphone开发之音频101(part 2):转换和录音

iPhone开发之音频101(Part 2)&#xff1a;转换和录音 译者&#xff1a;大侠自来也 免责申明&#xff08;必读&#xff01;&#xff09;&#xff1a;本博客提供的所有教程的翻译原稿均来自于互联网&#xff0c;仅供学习交流之用&#xff0c;切勿进行商业传播。同时&#xff0c;转…

机器学习笔记(十三)——隐马尔科夫模型

一、隐马尔科夫模型 在马尔科夫模型中&#xff0c;每一个状态代表了一个可以观察的事件&#xff0c;所以&#xff0c;马尔科夫模型有时称为可视马尔科夫模型&#xff08;visible Markov model&#xff0c;VMM&#xff09;&#xff0c;这在某种程度上限制了模型的适应性。在隐马…