生产运维技巧

一起来玩Elasticsearch,加我微信:wx1250134974

Elasticsearch认证复习准备

 

 

生产运维技巧:

PUT _cluster/settings #设置整各类熔断器限制,避免发生OOM

{

  "persistent": {

    "indices.breaker.total.limit": "40%"

  }

}

 

 

PUT _cluster/settings #增加搜索队列,防止出现reject报错。有些版本不是动态的

{

  "transient": {

    "threadpool.search.queue_size":2000

  }

}

 

POST _cache/clear  #临时清空节点上的缓存,降低OOM概率

 

PUT _cluster/settings #再平衡移动分片的并发数,防止对集群性能的影响

{

  "transient": {

    "cluster.routing.allocation.cluster_concurrent_rebalance": 2

  }

}

PUT _cluster/settings #每个节点恢复的并发分片数控制,防止对集群性能影响

{

  "transient": {

    "cluster.routing.allocation.node_concurrent_recoveries": 5

  }

}

 

PUT _cluster/settings #分片恢复时每秒的最大字节数

{

  "transient": {

    "indices.recovery.max_bytes_per_sec": "80mb"

  }

}

 

 

PUT _cluster/settings  #单个节点上恢复的并发流,有些版本不支持动态修改

{

  "transient": {

    "indices.recovery.concurrent_streams": 6

  }

}

 

 

PUT _cluster/settings #下线某个节点或者维护某个节点前执行,可提前将该节点数据移走,防止集群变黄、红

{

  "transient": {

    "cluster.routing.allocation.exclude._ip": "127.0.0.1"

  }

}

 

 

POST _cluster/reroute  #热点分片移动

{

  "commands": [

    {

      "move": {

        "index": "index_name",

        "shard": 0,

        "from_node": "node_name_1",

        "to_node": "node_name_2"

      }

    }

  ]

}

 

POST _cluster/reroute # Fore the allocation of an unassinged shard with a reason

{

  "commands": [

    {

      "move": {

        "index": "index_name",

        "shard": 0,

        "from_node": "node_name_1",

        "to_node": "node_name_2"

      }

    }

  ]

}

 

 

POST _flush/synced # Force a synced flush

 

 

##full restart################################

暂停数据写入

关闭集群的shard allocation

PUT _cluster/settings

{

  "transient": {

    "cluster.routing.allocation.enable":"none" #关闭分片在分配

  }

}

 

手动执行 POST /_flush/synced

重启节点

重新开启集群的shard allocation

PUT _cluster/settings

{

  "transient": {

    "cluster.routing.allocation.enable":"all" #开启分片在分配

 

  }

}

等待recovery完成,当集群的health status是green后

重新开启数据写入

##full restart##########################

 

 

 

 

 

PUT _cluster/settings  #关闭自动映射

{

  "persistent": {

    "action.auto_create_index": false

  }

}

 

PUT _cluster/settings #可明确开启需要自动创建的索引

{

  "persistent": {

    "action.auto_create_index": ".monitoring-*,logstash-*"

  }

}

 

#ES7.x可以使用ES6.X的索引,ES5.X可以使用ES2.X的索引 。备份恢复的时候注意

 

GET _nodes/stats/breaker?  #查看集群当前熔断器的触发情况

 

 

#内存和存储比例建议,内存只得是jvm,因此最大是31G

1:16 搜索类应用 因此磁盘大约为500G性能最佳,若存储数据量1T,副本1T则2T/500 约5个节点

1:48~1:96  日志类应用 因此磁盘大约为 1600G性能最佳,若存储数据量1T,副本1T则2T/1600 约2个节点

 

#磁盘建议

推荐使用ssd,

推荐使用raid0,可以不用raid10

在旋转磁盘上建议设置index.merge.scheduler.max_thread_count:1

trim SSD硬盘:

https://www.elastic.co/cn/blog/is-your-elasticsearch-trimmed

 

#认证和授权

推荐搭建认证和授权功能x-package或者search_guard

如果内网使用ES可以不配置https及节点间加密通信

audit logs审计日志按需打开

 

#建议开启慢查询日志,支持索引模板统一设定、query和fetch分开定义

PUT twitter/_settings

{

  "settings": {

    "index.search.slowlog.threshold": {

      "query.warn": "10s",

      "query.info": "3s",

      "query.debug": "1s",

      "query.trace": "0s",

      "fetch.warn": "1s",

      "fetch.info": "600ms",

      "fetch.debug": "400ms",

      "fetch.trace": "0s"

    }

  }

}

 

 

############集群非绿色的处理方式#############

https://mp.weixin.qq.com/s/7pWdS_zPDNiXKzrUOCTVfg

#查看不同状态索引

GET _cat/indices?v&health=red

GET _cat/indices?v&health=yellow

GET _cat/indices?v&health=green

#查看所有索引分片或者指定索引分片的状态信息

GET /_cat/shards?v&h=node,index,shard,prirep,state,store,sc,unassigned.reason,unassigned.details&s=sto,index&index=chat,allfoods&

 

#查看某分片未正常分配的原因

GET /_cluster/allocation/explain

{

  "index": "chat",#索引

  "shard": 0, #分片

  "primary": false #不是主分片

}

 

#将副本设置为0。删除所有副本,针对场景:也许你无法修复副本或手动移动或分配它。

在这种情况下,只要拥有主分片(健康状态为黄色,而不是红色),就可以始终使用以下命令将副本数设置为0,等待一分钟,然后再设置为1或任意你业务场景需要设置的值。

PUT chat/_settings

{

  "index": {

    "number_of_replicas": 0

  }

}

 

#手动分配分片,借助 reroute API。move 移动分片 和 allocate_replica 分配副本两个操作。

POST /_cluster/reroute

{

  "commands": [

    {

      "move": {

        "index": "test",

        "shard": 0,

        "from_node": "node1",

        "to_node": "node2"

      }

    },

    {

      "allocate_replica": {

        "index": "test",

        "shard": 1,

        "node": "node3"

      }

    }

  ]

}

 

#设置分片优先分配到hot类型的 机器s 上去

PUT mytest

{

  "settings": {

    "number_of_shards": 2,

    "number_of_replicas": 1,

    "index.routing.allocation.require.box_type": "hot"

  }

}

 

 

 

 

#分片没有分配的一些原因

INDEX_CREATE:正在创建索引没有完成之前,会有短暂的red,其实没问题

CLUSTER_RECOVER:集群重启完成前,会有这个问题

INDEX_REOPEN:重新open一个之前close的索引

DANGLING_INDEX_IMPORTED:一个节点离开集群期间,有索引被删除,节点重返会会有Dangling问题,直接删除Dangling的索引即可

是否有节点离线,重启离线的节点即可

索引配置是否有问题,比如错误的box_type、错误的副本数等

磁盘空间是否过高,比如85%的使用率。增加节点或者调整下磁盘水位

是在找不到原因,重新导入数据

 

 

 

 

############集群非绿色的处理方式#############

 

 

 

#Elasticsearch监控实现参考

https://help.aliyun.com/document_detail/90391.html

 

 

#提高集群写入性能

1客户端:用bulk并且多并发,需要亲自测试并发线程数和bulk大小,并且需要处理失败的重试操作。同时轮询所有节点不要只用一个节点

2服务端:服务器硬件越好越快,一般瓶颈在磁盘,可使用ssd

3mapping:禁用动态mapping,防止不规范的mappint对性能影响大; 可参看“2-Elasticsearch基础入门-优化点”进行index属性设置、refresh、translog设置;

4尽量不用嵌套和父子关系提升读性能

5不使用script查询计算,可提前处理

6多使用filter避免算分

7聚合操作尽量降低聚合的文档数量

8尽量避免使用通配符查询

9避免分片过多

10控制单个分片大小20-40G

11基于时序的索引进行merge降低segment数量提升查询性能

 

#ES缓存类型

  1. Node Query Cache

每个节点一个且所有shard共享,只缓存Filter Context,缓存采用LRU算法。缓存的是Segment的命中结果,Segment合并后失效,

静态配置参考:

indices.querys.cache.size:”10%”

index.queries.cache.enabled:true

 

 

  1. Shard Query Cache

缓存每个分片的查询结果,之缓存size=0的结果,且使用LRU算法,以查询JSON为key。分片ReFresh时失效,因此对于实时性要求不高的场景,尽量降低ReFresh操作

静态配置参考:

indices.requests.cache.size:”1%”

 

  1. Fielddata Cache

除了Text类型,默认都采用doc_values数据结构解决内存,Text只有打开Fielddata才能进行聚合操作。Segment合并后会失效

配置参考:

indices.fielddata.cache.size  尽量配置小写,防止出现GC(默认无限制)

 

 

#内存诊断

GET _cat/nodes?v  #查看内存cpu等使用情况

GET _cat/nodes?help #查看内存cpu等使用情况

 

#常见内存问题

  1. Segments过多,导致full GC

现象:集群整体响应缓慢,但没有过多的读写操作,并且发现持续进行full GC

分析:查看ES内存使用情况,发现segments.memory占用空间大

解决:通过force merge,把segments合并成一个

建议:merge后问题未能解决,可以考虑扩容

merge操作:index没有写入操作后进行MERGE可提升查询速度减少内存开销

POST INDEX/_forcemerge?max_num_segments=1

GET _cat/segments/INDEX?v

index.merge.policy.max_merged_segment配置合理些默认5G超过大小后,不在进行merge,可以降低merge时间。

index.merge.policy.segments_per_tier,默认10,越小合并月频繁,增大可降低合并频率。

 

  1. Field data cache 过大,导致full GC

现象:集群整体响应缓慢,读写不到,但节点持续FULL GC

分析:查看ES内存使用,发现fielddata.memory.size 占用空间很大

解决:将indices.fielddata.cache.size设小,重启节点,堆内存恢复正常

建议:Field data cache尽量设置小一些,如果业务有需要,可以通过库容解决

 

 

  1. 复杂嵌套聚合,导致集群full GC

现象:节点响应缓慢,持续进行FUll GC

分析:Dump分析,发现内存中存在大量bucket对象,查看日志发现复杂嵌套聚合

解决:优化聚合

建议:尽量降低进行嵌套聚合的数据量。如果业务确实需要,则进行扩容并且设置熔断器和search.max_buckets的数值保证集群稳定性

 

 

#各种断路器设置,保证集群稳定性

  1. Parent circuit breaker:设置所有熔断器可用内存总量
  2. Fielddata circuit breaker:预加载fielddata所需内存
  3. Request circuit breaker:请求内存限制,例如聚合
  4. in flight circuit breaker:Request的断路器
  5. Accounting request circuit breaker:请求结束后不能释放的对象所长用内存

 

 

 

 

#ES性能压测,附赠下方几个截图进行学些使用

 

 

 

 

一起来玩Elasticsearch,加我微信:wx1250134974

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值