专栏首页代码人生ElasticSearch教程(三)—— 懂原理

ElasticSearch教程(三)—— 懂原理

懂原理

集群

集群是有一群配置相同cluster.name的节点组成。它们通过广播通信,所以要放在一个网段的内网。

集群节点和身份

master :master管理集群范围内所有索引,和索引所在节点。当有节点加入和删除时,重新平均分布所有数据。

data :存储文档

集群状态

通过GET /_cluster/health查看集群状态。

{
    "cluster_name": "elasticsearch",
    "status": "yellow",
    "timed_out": false,
    "number_of_nodes": 1,
    "number_of_data_nodes": 1,
    "active_primary_shards": 5,
    "active_shards": 5,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 5,
    "delayed_unassigned_shards": 0,
    "number_of_pending_tasks": 0,
    "number_of_in_flight_fetch": 0,
    "task_max_waiting_in_queue_millis": 0,
    "active_shards_percent_as_number": 50.0
}

主要看的是status,有green,yellow,red三种情况。green是所有主分片和副本分片都在运行,yellow是主分片都在运行,有部分副本副片没有运行,red是有主分片没有运行。

分片内部

索引指向一个或多个物理分片。一节点上可以分配多个分片。一个分片是一个底层的工作单元,它就是一个Lucene实例。一个分片就是一个完整的搜索引擎。它存储实际的数据。分片有两个角色,主分片和副分片。主分片插入修改文档,副分片同步主分片。主副分片都能提供检索功能。

创建一个索引并分配3个主分片,并分配一个副分片。

curl -X PUT "localhost:9200/blogs" -H "content-type:application/json" -d '
{
"settings":{         
"number_of_shards":3,
"number_of_replicas":1
}
} 
' 

分片内部是如何检索文档呢?是用倒排索引。ES的倒排索引,除了特定词项出现的文档列表,还会加上词项出现总次数,词项在文档中的顺序,每个文档的长度,所有文档的平均长度等。

全文检索时,会为所有的文档集合建立一个很大的倒排索引表。这个倒排索引表很大,且不可修改,一旦新的索引就绪,就会替换旧的索引。

不变性:倒排索引是不会能被修改的,这样避免了一下问题。

  1. 多线程修改文档时,需要对文档加锁
  2. 倒排索引一旦加载就会被放入内存中,就会留在那里,只要有内存,大部分读请求直接命中内存,而不会命中磁盘,性能更高。
  3. ES的其他缓存(filter),在倒排索引的有效期内始终有效,不会因为数据的变化而变化,因为数据(倒排索引)是不变的。
  4. 写入单个大数据量的倒排索引允许被压缩。

缺点是倒排索引的不变性,当索引发生修改时,需要重新的重新生成倒排索引,它限制了倒排索引更新的频率。

对于实时,动态的更新倒排索引,实际的方法是用更多的倒排索引,即对于修改的部分,新增一个倒排索引。ES检索倒排索引时,会重最开始的倒排索引一直检索到最后的倒排索引。并把结果最后合并。

这里段是一个很重要的概念。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • xml解析系列(一)——用dom4j解析xml

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • easyui 获得选中tree节点的层数

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • NIO系列(五)——Udp协议(DatagramChannel)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • elasticsearch-分片思想

    最好的情况是,我们能知道自己对单个分片的要求,比如单个分片对用户的响应时间不能长于哪个值,测试的方法是使用历史数据,压入到一个测试的分片中

    执生
  • 有人问你Elasticsearch分布式架构原理,将这篇文章丢过去

    Elasticsearch用于构建高可用和可扩展的系统。扩展的方式可以是购买更好的服务器(纵向扩展(vertical scale or scaling up))...

    架构师修炼
  • Elasticsearch性能优化实战指南

    在当今世界,各行各业每天都有海量数据产生,为了从这些海量数据中获取想要的分析结果,需要对数据进行提取、转换,存储,维护,管理和分析。 这已然远远超出了普通处理工...

    铭毅天下
  • ES能为你解决什么问题,又会带来什么问题?

    S主要运用于全文搜索、数据分析, 底层使用开源库Lucene,拥有丰富的REST API。内部分布式的数据存储、倒排索引等设计,使其可以快速存储、搜索、分析海量...

    写PHP的老王
  • Elasticsearch性能优化实战指南

    在当今世界,各行各业每天都有海量数据产生,为了从这些海量数据中获取想要的分析结果,需要对数据进行提取、转换,存储,维护,管理和分析。 这已然远远超出了普通处理工...

    程序员追风
  • 源码分析ElasticJob分片机制

    ElasticJob分片工作机制: 1、ElasticJob在启动时,首先会启动是否需要重新分片的监听器。 代码入口如下:

    丁威
  • MySQL的分库分表1分库分表的几种形式2分片前的准备

    JavaEdge

扫码关注云+社区

领取腾讯云代金券