原创

Elasticserch学习之路(1)一一概念篇

最近工作太忙,也没遇到什么特别复杂的问题,小问题也都解决了,只是在中途因项目需要,学习Es全文检索,对于一些概念总结以及如何分片做了一些笔记,为了更好的学习,放在我的博客里,如果有这方面的大佬看到了也可以给老弟一点意见,感激不尽,相互学习共创程序带来的乐趣。嘿嘿,后面我会将我学习的时候做的一些测试方法给写上来供大家参考

Elasticsearch
一、    重要几个定义
1.    集群(cluster)
a)    由一个或多个节点组成, 并通过集群名称与其他集群进行区分
2.    节点(node)
a)    单个ElasticSearch实例. 通常一个节点运行在一个隔离的容器或虚拟机中
3.    索引(index)
a)    在ES中, 索引是一组文档的集合
4.    分片(shard)
a)    因为ES是个分布式的搜索引擎, 所以索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. ES自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 所以用户基本上不用担心分片的处理细节,一个分片默认最大文档数量是20亿.

5.    副本(replica)
a)    ES默认为一个索引创建5个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由5个主分片成本, 而每个主分片都相应的有一个copy.
6.    注意点
对于分布式搜索引擎来说, 分片及副本的分配将是高可用及快速搜索响应的设计核心.主分片与副本都能处理查询请求, 它们的唯一区别在于只有主分片才能处理索引请求,索引的number_of_shards参数只对当前索引有效而不是对整个集群生效.对每个索引来讲, 该参数定义了当前索引的主分片数(而不是集群中所有的主分片数).
二、    关于分片(shard)
        当在ElasticSearch集群中配置好索引后,集群运行中无法调整分片设置. 既便以后发现需要调整分片数量, 也只能新建创建并对数据进行重新索引(reindex)(虽然reindex会比较耗时, 但至少能保证不会停机)。
        主分片的配置与硬盘分区很类似, 在对一块空的硬盘空间进行分区时, 会要求用户先进行数据备份, 然后配置新的分区, 最后把数据写到新的分区上。
        分配分片时主要考虑的是数据集的增长趋势。(稍有富余是好的, 但过度分配分片却是大错特错. 具体定义多少分片很难有定论, 取决于用户的数据量和使用方式. 100个分片, 即便很少使用也可能是好的;而2个分片, 即便使用非常频繁, 也可能是多余的。)
1.    分片的顾虑
1.    每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源。
2.    每个搜索请求会调度到索引的每个分片中. 如果分片分散在不同的节点倒是问题不太. 但当分片开始竞争相同的硬件资源时, 性能便会逐步下降。
3.    ES使用词频统计来计算相关性. 当然这些统计也会分配到各个分片上. 如果在大量分片上只维护了很少的数据, 则将导致最终的文档相关性较差


2.    分片磁盘容量策略
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "80%",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.info.update.interval": "1m"
  }
}
Elasticsearch使用两个配置参数决定分片是否能存放到某个节点上。
cluster.routing.allocation.disk.watermark.low:控制磁盘使用的低水位。默认为85%,意味着如果节点磁盘使用超过85%,则ES不允许在分配新的分片。当配置具体的大小如80MB时,表示如果磁盘空间小于80MB不允许分配分片。
cluster.routing.allocation.disk.watermark.high:控制磁盘使用的高水位。默认为90%,意味着如果磁盘空间使用高于90%时,ES将尝试分配分片到其他节点。
上述两个配置可以使用API动态更新,ES每隔30s获取一次磁盘的使用信息,该值可以通过cluster.info.update.interval来设置。
3.    大规模以及日益增长的数据场景
对大数据集, 每个分片最好不超过30GB的原则依然使用.不过,根据节点数量按照1.5~3倍的原则来创建分片. 例如,如果有3个节点, 则推荐创建的分片数最多不超过9(3x3)个.
随着数据量的增加,如果通过集群状态API发现了问题,或者遭遇了性能退化,则只需要增加额外的节点即可. ES会自动完成分片在不同节点上的分布平衡.
再强调一次, 虽然这里我们暂未涉及副本节点的介绍, 但上面的指导原则依然使用: 是否有必要在每个节点上只分配一个索引的分片. 另外, 如果给每个分片分配1个副本, 你所需的节点数将加倍. 如果需要为每个分片分配2个副本, 则需要3倍的节点数
4.    分片
1.    一般分片大小根据堆内存1GB对应20-25个分片考虑,并且每个分片大小按照分配的堆内存来进行划分,如:划分给ES的内存为4G,则每个分片的大小为4G。并且最多可划分80-100个分片。
根据我们的业务需求,恰巧比较时候以索引拆分来分片,根据时间段进行储存,也可以根据冷热规则进行分片,将长时间不需要查询的数据存于冷区,经常要查或实时数据存于热分区。
综合上述一些概念性问题,提出分片规则如下。根据月建立索引,每个索引一个分片,1个副本,一年下来也就24个分片,因为粗略算了下每天数据量顶峰值也就1G(100个终端,每个终端100个测点),而一个分片所储存容量顶峰30G,完全满足现阶段。
5.    模板代码
{
  "order": 0,
  "index_patterns": [
    "test-*"
  ],
  "settings": {},
  "mappings": {
    "numeric_detection": true,
    "properties": {
      "postDate": {
        "format": "yyyy-MM-dd HH:mm:ss||epoch_millis||yyyy",
        "type": "date"
      },
      "value": {
        "type": "text"
      },
      "tid": {
        "type": "keyword"
      }
    }
  },
  "aliases": {
    "bipms": {}
  }
}
tid编号    value值    time时间戳
keyword    float    date
正文到此结束
本文目录