原文链接: 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" : [ ]
}

为什么ElasticSearch应用开发者需要了解cluster state相关推荐

  1. es集群节点加入失败join validation on cluster state with a different cluster uuid...than local cluster uuid..

    本来之前已经将es集群搭建完成了,但是不小心使用rm -rf /var/lib把文件删除了,我本来只想删除/var/lib下的一个文件夹的,结果删错了,整个集群没了,这,,,,还好集群上跑的都是一些测 ...

  2. laradock build elasticsearch 报错 unknown setting [cluster.initial_master_nodes] 的解决办法

    laradock build elasticsearch 报错 unknown setting [cluster.initial_master_nodes] please check that any ...

  3. 【Elasticsearch】Failed to process cluster event (put-mapping) within 30s

    1.概述 这个是创建 mapping 的时候超时了,默认是 30s 应该是集群处理不过来了.索引文件太多,使得集群的状态数据过多过大,在每个小时新建索引和设置索引 mapping 的时候,就产生集群状 ...

  4. ElasticSearch搜索引擎API笔记

      ElasticSearch搜索引擎API笔记 1. pom.xml <dependency> <groupId>org.elasticsearch.client</g ...

  5. 5ecsgo启动失败2错误代码2_单机多实例--启动2个Elasticsearch Cluster

    1. 生产环境的集群(标准启动) bin/elasticsearch bin/kibana 启动完成之后,请求 9200 端口. 2. 监控集群(定制启动) bin/elasticsearch -Ec ...

  6. 开始使用 Elasticsearch (1)

    在今天的这篇文章中,我们来主要介绍一下如何使用 REST 接口来对 Elasticsearch 进行操作.为了完成这项工作,我们必须完成如下的步骤: 安装 Elasticsearch.请参阅文章 &q ...

  7. X-pack 为 Elasticsearch 安全保驾护航

    Elasticsearch 本身不提供任何用户认证与授权方面的操作(甚至其中压根没有 "用户" 的概念),此方面工作的责任被让给了开发者与管理员.某些观点看来,这并非功能缺失,而被 ...

  8. elasticsearch优化总结

    一. 硬件环境选择: 如果有条件,尽可能使用SSD硬盘, 不错的CPU.ES的厉害之处在于ES本身的分布式架构以及lucene的特性.IO的提升,会极大改进ES的速度和性能. 二.系统拓朴设计: ES ...

  9. Elasticsearch 5.0 简介(medcl微信直播实录)

    大家好,非常高兴能在这里给大家分享,感谢InfoQ提供的这个微信的平台,首先简单自我介绍一下,我叫曾勇,是Elastic的工程师. Elastic将在今年秋季的时候发布一个Elasticsearch ...

最新文章

  1. 颠覆认知——Redis会遇到的15个「坑」,你踩过几个?
  2. UIActionSheet和UIProgressView的组合
  3. SSH整合(Struts2+hibernate+spring)
  4. [十二省联考2019]皮配
  5. Python中的Number(数字)
  6. 全国高中计算机大赛,2019年含金量最大的中小学全国性竞赛活动——五大学科竞赛...
  7. android 最新写法,详解Android 硬布局item的高级写法
  8. 笨办法学 Python · 续 练习 1:流程
  9. 苹果发布iOS 12.3.1正式版:更有效的屏蔽垃圾短信
  10. IT部领导总结:不想被淘汰,看看快速做报表的技巧,甚至能养老
  11. 【Matlab学习笔记】【数学形态学】数字图像处理(MATLAB版)冈萨雷斯第九章学习笔记
  12. 用Wireshark轻松解密TLS浏览器流量
  13. 小程序影藏溢出的gif_动图制作方法,1分钟教会你如何制作gif表情包!
  14. 【精华】拒绝国外IP海外IP访问的几种方法
  15. matlab里function函数的用法,function函数 function函数的具体用法
  16. 记一次刷票过程的感想
  17. Open Explorer Plugin for Eclipse (eclipse 插件 在ecli
  18. css grid布局中的minmax()函数的使用
  19. 【MATLAB】遗传算法(GA)求解TSP问题
  20. 手摸手带你学移动端WEB开发

热门文章

  1. 如何自己去写一个鼠标驱动_为什么要用哈密顿采样器(Hamiltonian Monte Carlo),以及如何自己写一个...
  2. 请求接受json tp5_关于jq jsonp跨域请求错误处理bug
  3. php验证密码后跳转_php-laravel框架用户验证(Auth)模块解析(四)忘记密码
  4. 同步数据流语言代码生成工具的研究进展
  5. wps表格里面计算机在哪里,WPS的Word居然还有计算神器?在哪里能找到又是怎么进行计算呢?...
  6. iar stm32_STM32延时函数的四种方法
  7. 对tf.nn.softmax的理解
  8. 构建测试的体系化思维(进阶篇)
  9. 【Python】如何选择赋值和拷贝
  10. Ext4文件系统修复