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 索引即一系列分片的集合
  • 一个分片即为 扩容的单元 。 一个最小的索引拥有一个分片。
  • 一个只有一个分片的索引无扩容因子
    -html

  • 如何判断一个请求过来,个人信息在哪一个分片上面
    • shard = hash(routing) % number_of_primary_shards
    • routing 大体是指文档的idapp

      分片预分配

  • 一个分片存在于单个节点, 但一个节点能够持有多个分片
  • 一个拥有两个分片的索引能够利用第二个节点来存储数据
    -elasticsearch

  • 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归档至长期存储rest

基于用户的数据

Elasticsearch 支持多租户因此每一个用户能够在相同的集群中拥有本身的索引
一个用户一个索引”对大多数场景均可以知足日志

共享索引

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

对子文档进行聚合操做code

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