ElasticSearch教程(三)—— 懂原理
- 2019 年 10 月 30 日
- 筆記
懂原理
集群
集群是有一群配置相同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的倒排索引,除了特定词项出现的文档列表,还会加上词项出现总次数,词项在文档中的顺序,每个文档的长度,所有文档的平均长度等。
全文检索时,会为所有的文档集合建立一个很大的倒排索引表。这个倒排索引表很大,且不可修改,一旦新的索引就绪,就会替换旧的索引。
不变性:倒排索引是不会能被修改的,这样避免了一下问题。
- 多线程修改文档时,需要对文档加锁
- 倒排索引一旦加载就会被放入内存中,就会留在那里,只要有内存,大部分读请求直接命中内存,而不会命中磁盘,性能更高。
- ES的其他缓存(filter),在倒排索引的有效期内始终有效,不会因为数据的变化而变化,因为数据(倒排索引)是不变的。
- 写入单个大数据量的倒排索引允许被压缩。
缺点是倒排索引的不变性,当索引发生修改时,需要重新的重新生成倒排索引,它限制了倒排索引更新的频率。
对于实时,动态的更新倒排索引,实际的方法是用更多的倒排索引,即对于修改的部分,新增一个倒排索引。ES检索倒排索引时,会重最开始的倒排索引一直检索到最后的倒排索引。并把结果最后合并。
这里段是一个很重要的概念。