ElasticSearch 学习记录之如任何设计可扩容的索引结构
ElasticSearch 系列文章
1 ES 入门之一 安装ElasticSearcha
2 ES 记录之如何创建一个索引映射
3 ElasticSearch 学习记录之Text keyword 两种基本类型区别
4 ES 入门记录之 match和term查询的区别
5 ElasticSearch 学习记录之ES几种常见的聚合操作
6 ElasticSearch 学习记录之父子结构的查询
7 ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询
8 ElasticSearch 学习记录之ES高亮搜索
9 ElasticSearch 学习记录之ES短语匹配基本用法
10 ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
11 ElasticSearch 学习记录之集群分片内部原理
12 ElasticSearch 学习记录之ES如何操作Lucene段
13 ElasticSearch 学习记录之如任何设计可扩容的索引结构
14 ElasticSearch之 控制相关度原理讲解
扩容设计
扩容的单元
-
一个分片即一个 Lucene 索引 ,一个 Elasticsearch 索引即一系列分片的集合
-
一个分片即为 扩容的单元 。 一个最小的索引拥有一个分片。
-
一个只有一个分片的索引无扩容因子
- -
如何判断一个请求过来,我的信息在哪个分片上面
- shard = hash(routing) % number_of_primary_shards
- routing 大致是指文档的id
分片预分配
-
一个分片存在于单个节点, 但一个节点可以持有多个分片
-
一个拥有两个分片的索引可以利用第二个节点来存储数据
- -
Elasticsearch 中新添加的索引默认被指定了五个主分片
-
为何不使用分片的分裂而是分片复制转移
- 分裂分片是重新索引数据,比复制更重
- 分裂是指数级的
- 分裂需要足够大的空间
海量分片
- 如何控制分片的数量
- 分片的数据模型是什么
- 一个分片的底层是Lucene索引,会消耗文件的句柄 内存 CPU 等
- 每个搜索请求都会命中索引的每个分片,多个分片咋同一个节点上会竞争资源
- 基于相关度的词频信息计算是基于分片的
容量规划
- 如何根据自己的自身情况,来判断分片的多少
- 可以根据下面的步骤,在特定环境中测定分片的多少
- 基于生产的单个节点集群
- 和生产相同的索引,知识他只有一个主分片无副本分片
- 索引实际文档
- 查询或聚合实际文档
- 在真实的环境上运行,直到它挂掉。
- 然后根据上面的信息,来进行分片的数量的计算
副本分片
-
副本分片的主要目的就是为了故障转移
-
如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片
-
新文档首先被索引进主分片然后再同步到其它所有的副本分片
-
副本分片可以服务于读请求
-
可以通过增加副本的数目来提升查询性能
-
一个拥有两个主分片一份副本的索引可以在四个节点中横向扩展
-
过调整副本数来均衡节点负载
- 原则上一个主分片不会它索引的副本分片在一起
多索引
- 如何不停服务来增加容量
- 创建一个新的索引存储数据
- 同时搜索两个索引来获取新数据和旧数据
- 使用索引别名来同时查询两个索引的数据
索引模板‘
-
使用模板可以创建有用的索引
创建索引模板PUT /_template/my_logs 创建一个名为 my_logs 的模板
{
"template": "logstash-*",
将这个模板应用于所有以 logstash- 为起始的索引
"order": 1, 这个模板将会覆盖默认的 logstash 模板,因为默认模板的 order 更低。
"settings": {
"number_of_shards": 1 限制主分片数量为 1
},
"mappings": {
"default": { 为所有类型禁用 _all 域
"_all": {
"enabled": false
}
}
},
"aliases": {
"last_3_months": {}
添加这个索引至 last_3_months 别名中。
}
}
数据过期
-
一次删除多个索引
- DELETE /logs_2013* //使用通配符
关闭旧的索引
POST /logs_2014-01-/_flush 刷写(Flush)所有一月的索引来清空事务日志
POST /logs_2014-01-/_close
关闭所有一月的索引.
POST /logs_2014-01-*/_open当你需要再次访问它们时,使用 open API 来重新打开它们。 - DELETE /logs_2013* //使用通配符
归档旧索引数据
非常旧的索引 可以通过snapshot-restore API归档至长期存储
基于用户的数据
Elasticsearch 支持多租户所以每个用户可以在相同的集群中拥有自己的索引
一个用户一个索引”对大多数场景都可以满足
共享索引
利用别名实现一个用户一个索引
对子文档进行聚合操作
POST product/_search
{
"size": 0,
"aggs": {
"productSource": {
"terms": {
"field": "productSource"
},
"aggs": {
"prices": {
"children": {
"type": "price"
},
"aggs": {
"minPrice": {
"terms": {
"field": "minPrice"
}
}
}
}
}
}
}
}