ElasticSearch教程(三)—— 懂原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luo4105/article/details/82501608

懂原理

集群

集群是有一群配置相同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检索倒排索引时,会重最开始的倒排索引一直检索到最后的倒排索引。并把结果最后合并。

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

猜你喜欢

转载自blog.csdn.net/luo4105/article/details/82501608