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 来重新打开它们。

归档旧索引数据
非常旧的索引 可以通过snapshot-restore API归档至长期存储

基于用户的数据

Elasticsearch 支持多租户所以每个用户可以在相同的集群中拥有自己的索引
一个用户一个索引”对大多数场景都可以满足

共享索引

利用别名实现一个用户一个索引

对子文档进行聚合操作

POST product/_search
{
 "size": 0,
 "aggs": {
   "productSource": {
     "terms": {
       "field": "productSource"
     },
     "aggs": {
       "prices": {
         "children": {
           "type": "price"
         },
         "aggs": {
           "minPrice": {
             "terms": {
               "field": "minPrice"
             }
           }
         }
       }
     }
   }
 }
}

posted on 2018-01-02 21:43  王守昌  阅读(2803)  评论(0编辑  收藏  举报

导航