Elasticsearch日常运维

2024-08-29 17:51:25 浏览数 (3)

查看集群状态

代码语言:javascript复制
# 集群状态查看
GET _cluster/health
# 找到对应的索引,health可选值green, yellow, red
GET /_cat/indices?v&health=red
# 详细查看未分配原因
GET _cluster/allocation/explain
# 查看具体的索引,分⽚以及未分配原因
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason&v
# 查看数据分布情况
GET _cat/allocation?v

节点间分⽚移动

⼿动移动分配分⽚。将启动的分⽚从⼀个节点移动到另⼀节点。

代码语言:javascript复制
POST /_cluster/reroute
{
  "commands": [
    {
      "move": {
        "index": "indexname",
        "shard": 1,
        "from_node": "nodename",
        "to_node": "nodename"
      }
    }
  ]
}

POST /_cluster/reroute
{
  "commands": [
    {
      "move": {
        "index": "test",
        "shard": 0,
        "from_node": "node1",
        "to_node": "node2"  # 将test 的shard 0分⽚从node1移动到node2
      }
    },
    {
      "allocate_replica": {
        "index": "test",
        "shard": 1,
        "node": "node3"   # test索引的shard 1 分配到node3
      }
    },
    {
      "cancel": {
        "index": "test",
        "shard": 0,
        "node": "node2"   # 取消在node2上⾯分配test的shard 0 分⽚
      }
    }
  ]
}

allocate_stale_primary:以集群内存在的陈旧的分⽚内容,再次分配。
allocate_empty_primary:分配空内容的分⽚

POST /_cluster/reroute
{
  "commands": [
    {
      "allocate_stale_primary": {
        "index": "dcvs_aps",
        "shard": 3,
        "node": "MYSQL2",
        "accept_data_loss": true
      }
    }
  ]
}

设置分配的最⼤失败重试次数,默认是5次,当然系统分配到达重试次数后,可以⼿动分配分⽚。"index.allocation.max_retries" : "5",

代码语言:javascript复制
POST _cluster/reroute?retry_failed

集群节点优雅下线

保证集群颜⾊绿⾊的前提下,将某个节点优雅下线。

代码语言:javascript复制
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._ip": "192.168.248.1"
  }
}

强制刷新

刷新索引是确保当前仅存储在事务⽇志中的所有数据也永久存储在Lucene索引中。

注意:7.6及之后版本会废弃同步刷新改⽤_flush

代码语言:javascript复制
 # >=7.6版本
 POST /_flush

 # <7.6版本使⽤同步刷新
 POST /_flush/synced

更改并发分⽚的数量以平衡集群

控制在集群范围内允许多少并发分⽚重新平衡。默认值为2。

代码语言:javascript复制
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.cluster_concurrent_rebalance": 2
  }
}

开启和关闭分片自动重均衡

Elasticsearch在业务高峰期进行分片重均衡会造成网络延迟或者io异常等现象,所以可以选择在业务低峰期开启ES分片自动均衡。

代码语言:javascript复制
关闭ES自动重均衡
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.rebalance.enable":"none"
  }
}
开启ES自动重均衡
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.rebalance.enable":"all"
  }
}

注释:

  • transient:临时调整集群配置,整个集群重启后,对应参数失效;
  • persistent: 永久调整集群配置,整个集群重启后,对应参数仍然有效;

更改每个节点同时恢复的分⽚数量

如果节点已从集群断开连接,则其所有分⽚将都变为未分配状态。经过⼀定的延迟后,分⽚将分配到其他

位置。每个节点要恢复的并发分⽚数由该设置确定。

代码语言:javascript复制
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.node_concurrent_recoveries": 6
  }
}

调整恢复速度

为了避免集群过载,Elasticsearch限制了分配给恢复的速度。你可以仔细更改该设置,以使其恢复更快。

如果此值调的太⾼,则正在进⾏的恢复可能会消耗过多的带宽和其他资源,这可能会使集群不稳定。

代码语言:javascript复制
PUT /_cluster/settings
{
  "transient": {
    "indices.recovery.max_bytes_per_sec": "80mb"
  }
}

清除节点上的缓存

如果节点达到较⾼的JVM值,则可以在节点级别上调⽤该API 以使 Elasticsearch 清理缓存。

注意:这会降低性能,但可以使你摆脱OOM(内存不⾜)的困扰。

代码语言:javascript复制
 # 清除所有索引的所有缓存
 POST /_cache/clear

 # 清除特定索引的特定cache
 POST /my-index-000001/_cache/clear?fielddata=true
 POST /my-index-000001/_cache/clear?query=true
 POST /my-index-000001/_cache/clear?request=true

调整断路器

断熔器通过内部检查(字段的类型、基数、⼤⼩等等)来估算⼀个查询需要的内存。它然后检查要求加载的 fielddata 是否会导致 fielddata 的总量超过堆的配置⽐例。

如果估算查询的⼤⼩超出限制,就会触发断路器,查询会被中⽌并返回异常。这都发⽣在数据加载之前,也就意味着不会引起 OutOfMemoryException 。

代码语言:javascript复制
#1.查看断路器
GET /_nodes/stats/breaker?pretty
GET /_cluster/settings?include_defaults&flat_settings

#2.⽗断路器:默认95%,所有断路器的⽗断路器,保证所有的heap使⽤率不会超过该值
indices.breaker.total.limit

#3.fielddata断路器:fielddata断路器可以估算每⼀个field的所有数据被加载到内存中,需要耗费多⼤的内存。
 # 默认40%heap,7.9之前是60%
 indices.breaker.fielddata.limit
 #可以配置估算因⼦,估算出来的值会乘以这个估算因⼦,留⼀些buffer,默认是1.03。
 indices.breaker.fielddata.overhead
indices.breaker.fielddata.limit 必须⼤于 indices.fielddata.cache.size,否则只会触发fielddata
circuit breaker,⽽不会剔除旧的fielddata。

#4.request circuit breaker
request circuit breaker可以阻⽌由于某个请求对应的⼀些数据结构造成的OOM(⽐如⼀个聚合请求可能
会⽤jvm内存来做⼀些汇总计算)。
indices.breaker.request.limit # 默认 60%

#5.in flight request circuit breaker
flight request circuit breaker可以限制当前所有进来的transport或http层的请求所使⽤内存总量,这个
内存的使⽤量就是请求⾃⼰本身的⻓度。
network.breaker.inflight_requests.limit # 默认100%
设置方法如下:
PUT /_cluster/settings
{
  "persistent": {
    "indices.breaker.total.limit": "40%"
  }
}

ElasticSearch 使⽤低速设备的 Tips

单个分⽚上⼀次合并的最⼤线程数。该参数影响lucene后台的合并线程数量,默认设置只适合SDD。如果多个合并线程可能导致io压⼒过⼤。

代码语言:javascript复制
PUT movies/_settings
{
  "index.merge.scheduler.max_thread_count":1
}

限制每个节点分⽚数

index级别上设置index.routing.allocation.total_shards_per_node 避免同⼀个index的多个shard分配到同⼀个node

代码语言:javascript复制
# index级别
index.routing.allocation.total_shards_per_node

# node级别,所有索引
cluster.routing.allocation.total_shards_per_node

查看任务tasks

返回集群中⼀个或多个节点上当前执⾏的任务信息。

代码语言:javascript复制
 GET _tasks
 GET _tasks?nodes=nodeId1,nodeId2
 GET _tasks?nodes=nodeId1,nodeId2&actions=cluster:*


 # task详情
 GET /_tasks/<task_id>
 GET _tasks/oTUltX4IQMOUUVeiohTt8A:124
 GET _tasks?actions=*search&detailed

取消任务

代码语言:javascript复制
 POST _tasks/oTUltX4IQMOUUVeiohTt8A:12345/_cancel
 POST _tasks/_cancel?nodes=nodeId1,nodeId2&actions=*reindex

查看pending tasks

返回尚未执⾏的集群级更改列表,如创建索引、更新映射、分配碎⽚等。

代码语言:javascript复制
 GET /_cluster/pending_tasks
 GET /_cat/pending_tasks

集群级别分⽚分配

代码语言:javascript复制
# 启⽤或禁⽤对特定种类的分⽚的分配
cluster.routing.allocation.enable: all # 默认all
all -(默认值)允许为所有类型的分⽚分配分⽚。
primaries -仅允许为主分⽚分配。
new_primaries -仅允许为新索引的主分⽚分配。
none -不允许对任何索引进⾏任何类型的分⽚分配。
# ⼀个节点上允许进⾏多少并发的传⼊分⽚恢复
 cluster.routing.allocation.node_concurrent_incoming_recoveries #
认2
 # ⼀个节点上允许进⾏多少并发的传出分⽚恢复
 cluster.routing.allocation.node_concurrent_outgoing_recoveries #
认2
 # 同时设置以上两个值
 cluster.routing.allocation.node_concurrent_recoveries
 # 节点初始化主分⽚数
 cluster.routing.allocation.node_initial_primaries_recoveries #
默认4

分⽚平衡配置

群集的平衡仅取决于每个节点上的分⽚数量以及这些分⽚所属的索引

代码语言:javascript复制
 # 为特定种类的分⽚启⽤或禁⽤重新平衡
 cluster.routing.rebalance.enable
 all -(默认值)允许所有种类的分⽚进⾏分⽚平衡。
 primaries -仅允许对主要分⽚进⾏分⽚平衡。
 replicas -仅允许对副本分⽚进⾏分⽚平衡。
 none -任何索引都不允许任何形式的分⽚平衡。

 # 允许控制在集群范围内允许多少并发分⽚重新平衡。默认为2
 cluster.routing.allocation.cluster_concurrent_rebalance

基于磁盘的分⽚分配

代码语言:javascript复制
# 默认为true。设置为false禁⽤磁盘分配决定器。
cluster.routing.allocation.disk.threshold_enabled
cluster.routing.allocation.disk.threshold_enabled # 默认true,启⽤磁盘空间阈值检查
cluster.routing.allocation.disk.watermark.low # 默认85%,分⽚不会分配(除新建的索引的主分⽚不受影响)
cluster.routing.allocation.disk.watermark.high # 默认90%,达到该值,ES会做relocate,影响所有分⽚
cluster.routing.allocation.disk.watermark.flood_stage # 默认95%, index.blocks.read_only_allow_delete,当磁盘使⽤率低于95%,(>=7.4)⾃动释放index.blocks
cluster.info.update.interval # 默认30s设置多久检查⼀次磁盘
# 可以配置具体⼤⼩
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m"
  }
}

 # 或者使⽤百分⽐
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "85%",
    "cluster.routing.allocation.disk.watermark.high": "90%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "95%",
    "cluster.info.update.interval": "1m"
  }
}
 # 当磁盘使⽤率超过flood_stage阈值是索引被设置为只读,可通过以下命令⼿动恢复读写
 PUT /my-index-000001/_settings
 {
 "index.blocks.read_only_allow_delete": null
 }

Segment查看段/合并段

代码语言:javascript复制
GET /twitter/_segments
POST /twitter/_forcemerge?max_num_segments=1

关闭模糊_all / *删除(避免误删)

代码语言:javascript复制
 PUT _cluster/settings
{
"persistent": {
"action.destructive_requires_name":true
}
}

0 人点赞