一、集群分布式模型及选主与脑裂问题
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
}
来源:oschina
链接:https://my.oschina.net/hanchao/blog/3161908