Elasticsearch简单学习9:分布式特性以及分布式搜索机制

邮差的信 提交于 2020-02-27 20:51:45

一、集群分布式模型及选主与脑裂问题

https://www.elastic.co/cn/blog/a-new-era-for-cluster-coordination-in-elasticsearch

1.分布式特性

2.节点

3.Coordinating Node

4.Cerebro 介绍

https://github.com/lmenezes/cerebro/releases

./bin/elasticsearch.bat -E node.name=node0 -E cluster.name=beehive -E path.data=node0_data -E http.port=9200

./bin/elasticsearch.bat -E node.name=node1 -E cluster.name=beehive -E path.data=node1_data -E http.port=9201

cerebro下载很慢啊!可以用kibana看。

5.Data Node

6.Master Node

7.Master Eligible Nodes & 选主流程

8.集群状态

9.Master Eligible Nodes & 选主的过程

10.脑裂问题

11.如何避免脑裂问题

12.配置节点类型

二、分⽚片与集群的故障转移

三、文档分布式存储

● 可以通过设置 Index Settings,控制数据的分片
● Primary Shard 的值不能修改,修改需要重新 Index。默认值是 5, 从 7 开始,默认值改为 1
● 索引写入数据后,Replica 的值可以修改。增加副本,可提高大并发下的读取性能
● 通过控制集群的节点数,设置 Primary Shard 数,实现水平扩展

1.文档存储在分片上

2.文档到分片的路路由算法

3.更新一个文档

4.删除⼀个文档

四、分片及其生命周期

1.分片的内部原理

2.倒排索引不可变性

3.Lucene Index

4.什么是 Refresh

5.什么是 Transaction Log

6.什么是 Flush

7.Merge

五、剖析分布式查询及相关性算分

1.分布式搜索的运行机制

2.Query 阶段

3.Fetch阶段

4.Query Then Fetch 潜在的问题

5.解决算分不准的方法

6.相关性算分问题 Demo

#ES7默认是一个分片,我们添加3条数据
POST message/_doc
{
  "content":"good"
}

POST message/_doc
{
  "content":"good morning"
}

POST message/_doc
{
  "content":"good morning everyone"
}

#查询,都在同一个分片,文档1排在最前面
POST message/_search
{
  "query": {
    "term": {
      "content": {
        "value": "good"
      }
    }
  }
}


#################### 设置分片为20个,并且某一个文档路由到不同的分片 ####
DELETE message
PUT message
{
  "settings": {
    "number_of_shards": 20
  }
}

GET message

##添加测试数据
POST message/_doc?routing=1
{
  "content":"good"
}

POST message/_doc?routing=2
{
  "content":"good morning"
}

POST message/_doc?routing=3
{
  "content":"good morning everyone"
}

POST message/_search
{
  "explain": true,
  "query": {
    "match_all": {}
  }
}

##查询结果:分数和之前的不一样,并且文档3排在第一位。
POST message/_search
{
  "explain": true,
  "query": {
    "term": {
      "content": {
        "value": "good"
      }
    }
  }
}

##使用dfs_query_then_fetch查询,和一个分片的查询结果类似!!
POST message/_search?search_type=dfs_query_then_fetch
{

  "query": {
    "term": {
      "content": {
        "value": "good"
      }
    }
  }
}

六、排序及 Doc Values & Field Data

1.排序

#单字段排序
POST /kibana_sample_data_ecommerce/_search
{
  "size": 5,
  "query": {
    "match_all": {

    }
  },
  "sort": [
    {"order_date": {"order": "desc"}}
  ]
}

2.多字段进行排序

#多字段排序
POST /kibana_sample_data_ecommerce/_search
{
  "size": 5,
  "query": {
    "match_all": {

    }
  },
  "sort": [
    {"order_date": {"order": "desc"}},
    {"_doc":{"order": "asc"}},
    {"_score":{ "order": "desc"}}
  ]
}

3.对 Text 类型排序

一般我们不会对Text类型的字段进行排序,除非聚合时!!

GET kibana_sample_data_ecommerce/_mapping

#对 text 字段进行排序。默认会报错,需打开fielddata
POST /kibana_sample_data_ecommerce/_search
{
  "size": 5,
  "query": {
    "match_all": {

    }
  },
  "sort": [
    {"customer_full_name": {"order": "desc"}}
  ]
}

#打开 text的 fielddata
PUT kibana_sample_data_ecommerce/_mapping
{
  "properties": {
    "customer_full_name" : {
          "type" : "text",
          "fielddata": true,
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
  }
}

4.排序的过程

5.Doc Values vs Field Data

6.打开 Fielddata

7.关闭 Doc Values

8.获取 Doc Values & Fielddata 中存储的内容

● 对 Text 字段设置 fielddata,支持随时修改
● Doc Values 可以在 Mapping 中关闭。但是需要重新索引
● Text 不支持 Doc Values
● 使用 docvalue_fields 查看存储的信息

七、分页与遍历 – From,Size,Search After & Scroll API

1.From / Size

2.分布式系统中深度分页的问题

### From + Size 必须⼩小与 10000
### 默认最大可以查询10000条记录
POST kibana_sample_data_ecommerce/_search
{
  "from": 10000,
  "size": 1,
  "query": {
    "match_all": {

    }
  }
}

3.Search After 避免深度分页的问题

#Ssearch After
DELETE users

######## 添加测试数据
POST users/_doc
{"name":"user1","age":10}

POST users/_doc
{"name":"user2","age":11}


POST users/_doc
{"name":"user2","age":12}

POST users/_doc
{"name":"user2","age":13}

##查询总的数据量
POST users/_count

##第一次搜索
POST users/_search
{
    "size": 1,
    "query": {
        "match_all": {}
    },
    "sort": [
        {"age": "desc"} ,
        {"_id": "asc"}    
    ]
}

#使用上一次返回的sort值进行搜索,不支持指定from,只能一直向下翻
POST users/_search
{
    "size": 1,
    "query": {
        "match_all": {}
    },
    "search_after":
        [
          13,
          "JzjG9m8B2iQ7ZaIrCHfR"
        ],
    "sort": [
        {"age": "desc"} ,
        {"_id": "asc"}    
    ]
}

4.Search After 是如何解决深度分页的问题

5.Scroll API

#Scroll API的例子
DELETE users

#插入数据
POST users/_doc
{"name":"user1","age":10}

POST users/_doc
{"name":"user2","age":20}

POST users/_doc
{"name":"user3","age":30}

POST users/_doc
{"name":"user4","age":40}

#创建快照
POST /users/_search?scroll=5m
{
    "size": 1,
    "query": {
        "match_all" : {
        }
    }
}

#查询数量
POST users/_count

#再插入一条数据
POST users/_doc
{"name":"user5","age":50}

##首次查询
POST users/_search?scroll=5m
{
  "size": 1,
  "query": {
    "match_all": {}
  }
}

#根据scroll_id进行查询
POST /_search/scroll
{
    "scroll" : "1m",
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAF5oWZUluWkw2R2tRYWVqMGVnMXRYemlZZw=="
}

6.不同的搜索类型和使用场景

八、处理并发读写操作

1.ES 的乐观并发控制

● ES 采用的是乐观并发控制
● 在需要控制并发的场景,通过指定 If_seq_no 和 If_primary_term
● 外部版版本 version & version_type=external

DELETE products
PUT products

PUT products/_doc/1
{
  "title":"iphone",
  "count":100
}



GET products/_doc/1

PUT products/_doc/1?if_seq_no=1&if_primary_term=1
{
  "title":"iphone",
  "count":100
}



PUT products/_doc/1?version=30000&version_type=external
{
  "title":"iphone",
  "count":100
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!