Fork me on GitHub

elasticsearch 集群

一、节点

1,Coordination Node

①处理请求的节点,叫Coordination Node,路由请求到正确的节点,例如创建索引的请求,需要路由到master节点

②所有节点默认都是Coordination Node

③通过将其他类型设置false,使其成为Dedicated Coordination Node

2,Data Node

①可以保存数据的节点,叫做Data Node,节点启动后,默认就是数据节点。可以设置node.data:false禁止

②Data Node的职责:保存分片数据。在数据扩展上起到了至关重要的作用(由Master Node决定如何把分片分发到数据节点上)

③通过增加数据节点,可以解决数据水平扩展和解决数据单点问题

3,Master Node

Master Node职责:

①处理创建、删除索引等请求/决定分片被分配到哪个节点/负责索引的创建与删除

②维护并且更新Cluster State

Master Node最佳实践:

①Master 节点非常重要,在部署上需要考虑决绝单点的问题

②为一个集群设置多个Master节点/每个节点只承担Master的单一角色

4,Master Eligible Nodes & 选主流程

①一个集群,支持配置多个Master Eligible节点。这些节点可以在必要时(如Master 节点出现故障,网络故障时)参与选主流程,成为Master节点

②每个节点启动后,默认就是一个Master Eligible节点,可以设置node.master:false 禁止

③单集群内第一个Master Eligible节点启动时,它会将自己选举成Master节点

 

二、分片

1,主分片-提升系统存储容量

分片是elasticsearch分布式存储的基石(主分片/副本分片)

通过主分片,将数据分布在所有节点上

  主分片,可以将一份索引的数据,分散在多个Data Node上,实现存储的水平扩展

  主分片数在索引创建的时候指定,后续默认不能修改,如需修改,需要重建索引

2,副本分片-提高数据可用性

数据可用性

  通过引入副本分片提高数据的可用性。一旦主分片丢失,副本分片可以promote成主分片。副本分片数可以动态调整。每个节点上都有完备的数据。如果不设置副本分片,一旦出现节点硬件故障,就有可能造成数据丢失

提成系统的读取性能

  副本分片由主分片同步。通过支持增加replica个数,一定程度可以提高读取的吞吐量

3,分片数的设定-如何规划一个索引的主分片数和副本分片数

① 主分片数过小:例如创建了1个主分片的索引。如果该索引增长的很快,集群无法通过增加节点实现对这个索引的数据扩展

②主分片数设置过大:导致单个分片容量很小,引发一个节点上有过多的分片,影响性能

③副本分片数设置过多,会降低集群整体的写入性能

4,如何确定主分片数

①从存储物理角度看

  日志类应用,单个分片不要大于50GB

  搜索类应用,单个分片不要超过20GB

②为什么要控制分片大小

  提高update的性能

  Merge时,减少所需的资源

  丢失节点后,具备更快的恢复速度/便于分片在集群内Rebalancing

5,如何确定副本分片数

①副本是主分片的拷贝

  提高系统的可用性:相应查询请求,防止数据丢失

  需要占用和主分片一样的资源

②对性能的影响

  副本会降低数据的索引速度:有几分副本就会有几倍的CPU资源消耗在索引上

  会减缓对主分片的查询压力,但是会消耗同样的内存资源。如果机器资源充分,提高副本数,可以提高整体的查询QPS

 

三、监控elasticsearch集群

# Node Stats:
GET _nodes/stats

#Cluster Stats:
GET _cluster/stats

#Index Stats:
GET kibana_sample_data_ecommerce/_stats

#Pending Cluster Tasks API:
GET _cluster/pending_tasks

# 查看所有的 tasks,也支持 cancel task
GET _tasks


GET _nodes/thread_pool
GET _nodes/stats/thread_pool
GET _cat/thread_pool?v
GET _nodes/hot_threads
GET _nodes/stats/thread_pool


# 设置 Index Slowlogs
# the first 1000 characters of the doc's source will be logged
PUT my_index/_settings
{
  "index.indexing.slowlog":{
    "threshold.index":{
      "warn":"10s",
      "info": "4s",
      "debug":"2s",
      "trace":"0s"
    },
    "level":"trace",
    "source":1000  
  }
}

# 设置查询
DELETE my_index
//"0" logs all queries
PUT my_index/
{
  "settings": {
    "index.search.slowlog.threshold": {
      "query.warn": "10s",
      "query.info": "3s",
      "query.debug": "2s",
      "query.trace": "0s",
      "fetch.warn": "1s",
      "fetch.info": "600ms",
      "fetch.debug": "400ms",
      "fetch.trace": "0s"
    }
  }
}

GET my_index
#案例1
DELETE mytest
PUT mytest
{
  "settings":{
    "number_of_shards":3,
    "number_of_replicas":0,
    "index.routing.allocation.require.box_type":"hott"
  }
}





# 检查集群状态,查看是否有节点丢失,有多少分片无法分配
GET /_cluster/health/

# 查看索引级别,找到红色的索引
GET /_cluster/health?level=indices


#查看索引的分片
GET _cluster/health?level=shards

# Explain 变红的原因
GET /_cluster/allocation/explain

GET /_cat/shards/mytest
GET _cat/nodeattrs

DELETE mytest
GET /_cluster/health/

PUT mytest
{
  "settings":{
    "number_of_shards":3,
    "number_of_replicas":0,
    "index.routing.allocation.require.box_type":"hot"
  }
}

GET /_cluster/health/

#案例2, Explain 看 hot 上的 explain
DELETE mytest
PUT mytest
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1,
    "index.routing.allocation.require.box_type":"hot"
  }
}

GET _cluster/health
GET _cat/shards/mytest
GET /_cluster/allocation/explain

PUT mytest/_settings
{
    "number_of_replicas": 0
}

 

四、提升集群写性能

1,关闭无关的功能

①只需要聚合不需要搜索,index设置成false

②不需要算分,Norms设置成false

③不要对字符串使用默认的dynamic mapping。字段数量过多,会对性能产生比较大的印象

④index_options控制在创建倒排索引时,那些内容会被添加到倒排索引中。优化这些设置,一定程度上可以cpu

⑤关闭_source,减少io操作;(不能被reindex了,适合指标型数据)

PUT index
{
  "mappings": {
    "properties": {
      "foo":{
        "type": "integer",
        "index": false
      }
    }
  }
}

PUT index
{
  "mappings": {
    "properties": {
      "foo":{
        "type": "text",
        "norms": false
      }
    }
  }
}

2,一个索引设定的例子

DELETE myindex
PUT myindex
{
  "settings": {
    "index": {
      "refresh_interval": "30s",//30秒一次refresh
      "number_of_shards": "2"
    },
    "routing": {
      "allocation": {
        "total_shards_per_node": "3"//控制分片,避免数据热点
      }
    },
    "translog": {
      "sync_interval": "30s",//降低translog落盘
      "durability": "async"
    },
    "number_of_replicas": 0
  },
  "mappings": {
    "dynamic": false,//避免不必要的字段索引
    "properties": {}
  }
}

 

posted on 2020-05-01 16:15  *Hunter  阅读(262)  评论(0编辑  收藏  举报

导航

AmazingCounters.com