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": {} } }