更新时间:2024-11-29 GMT+08:00

配置调优

设置索引数为双副本

在迁移时为了保证导入性能,通常建表时可以先指定副本数为0,代表只有单副本。待数据导入完成,可设置为1,以保证数据可靠性副本分片会自动从主分片复制数据。当副本数较多时,可能需要较长的时间复制,可以调整资源控制参数,使用节点的资源进行复制。

在任意Elasticsearch节点执行curl命令,curl命令的使用请参考Linux下curl命令的使用

  • 普通模式:
    curl -XPUT "http://EsNode节点的IP:EsNode端口/_cluster/settings" -H 'Content-Type: application/json' -d' 
    { 
    "transient": { 
        "cluster.routing": { 
          "allocation.cluster_concurrent_rebalance": 36, 
          "allocation.node_concurrent_recoveries": 3 
    } 
    }, 
      "indices.recovery.max_bytes_per_sec": "1GB" 
    }'
  • 安全模式:
    curl -XPUT --tlsv1.2 --negotiate -k -u : "https://EsNode节点的IP:EsNode端口/_cluster/settings" -H 'Content-Type: application/json' -d' 
    { 
    "transient": { 
        "cluster.routing": { 
          "allocation.cluster_concurrent_rebalance": 36, 
          "allocation.node_concurrent_recoveries": 3 
    } 
    }, 
      "indices.recovery.max_bytes_per_sec": "1GB" 
    }'

增加索引刷新时间

默认每秒都会强制生成1个新的segments文件,增大索引刷新时间,可以生成更大的segments文件,有效降低I/O并减少segments merge的压力,该配置项可以建索引时指定。

如果只是单纯导入数据,不需要做实时查询,可以把refresh禁用(即设置参数值为“-1”),并设置副本数为0,在数据完成导入后,再把参数设置为合适的值。

在任意Elasticsearch节点执行curl命令,例如:

  • 普通模式:
    curl -XPUT "http://EsNode节点的IP:EsNode端口/myindex/_settings" -H 'Content-Type: application/json' -d'
    {"number_of_replicas": 0,
     "refresh_interval": "180s"}'
  • 安全模式:
    curl -XPUT --tlsv1.2 --negotiate -k -u : "https://EsNode节点的IP:EsNode端口/myindex/_settings" -H 'Content-Type: application/json' -d'
    {"number_of_replicas": 0,
     "refresh_interval": "180s"}'

修改事务日志translog参数

默认情况下,translog的持久化策略是每个请求都从内存保存,以能保证写入操作的可靠性,但是对性能会有明显的影响,例如导数磁盘I/O会持续占满。

如果可以接受一定几率的数据丢失,实际上在迁移场景中,数据先批量导入集群,完全可以接受意外导致的数据丢失,只需另外补录数据。调整translog持久化策略为周期性和指定大小数据量时进行flush,提升导入性能。该配置项可以建索引时指定。

在任意Elasticsearch节点执行curl命令,例如:

  • 普通模式:
    curl -XPUT "http://EsNode节点的IP:EsNode端口/_all/_settings" -H 'Content-Type: application/json' -d'
    {
      "index": {
        "translog": {
          "flush_threshold_size": "1GB",
          "sync_interval": "120s",
          "durability": "async"
        }
      }
    }'
  • 安全模式:
    curl -XPUT --tlsv1.2 --negotiate -k -u : "https://EsNode节点的IP:EsNode端口/_all/_settings" -H 'Content-Type: application/json' -d'
    {
      "index": {
        "translog": {
          "flush_threshold_size": "1GB",
          "sync_interval": "120s",
          "durability": "async"
        }
      }
    }'

优化Elasticsearch重启配置

如果Elasticsearch集群已经导入大量数据,在需要重启时,由于节点启动先后顺序不一致等原因,直接重启流程可能带来大量的主副本之间的数据复制,需要消耗大量资源,集群恢复需要很长时间,因此如果集群有重启需求时,建议先调整相关参数,并在重启后恢复。

  1. 在任意Elasticsearch节点执行curl命令,关闭shard allocation。
    • 普通模式:
      curl -XPUT "http://EsNode节点的IP:EsNode端口/_cluster/settings" -H 'Content-Type: application/json' -d'
      {
        "transient": {
      "cluster": {
      "routing": {
      "allocation.enable": "none"
       }
      }
      }
      }'
    • 安全模式:
      curl -XPUT --tlsv1.2 --negotiate -k -u : "https://EsNode节点的IP:EsNode端口/_cluster/settings" -H 'Content-Type: application/json' -d'
      {
        "transient": {
      "cluster": {
      "routing": {
      "allocation.enable": "none"
       }
      }
      }
      }'
  2. 手工触发flush。
    • 普通模式:

      curl -XPOST "http://EsNode节点的IP:EsNode端口/_flush/synced"

    • 安全模式:

      curl -XPOST --tlsv1.2 --negotiate -k -u : "http://EsNode节点的IP:EsNode端口/_flush/synced"

  3. 重启Elasticsearch服务或角色实例。
  4. 开启shard allocation。
    • 普通模式:
      curl -XPUT "http://EsNode节点的IP:EsNode端口/_cluster/settings" -H 'Content-Type: application/json' -d'
      {
      "transient": {
      "cluster": {
      "routing": {
      "allocation.enable": "all"
            }
       }
      }
      }'
    • 安全模式:
      curl -XPUT --tlsv1.2 --negotiate -k -u : "https://EsNode节点的IP:EsNode端口/_cluster/settings" -H 'Content-Type: application/json' -d'
      {
      "transient": {
      "cluster": {
      "routing": {
      "allocation.enable": "all"
            }
       }
      }
      }'
  5. 执行命令查看集群health的状态变成green,表示自动恢复完成。
    • 普通模式:

      curl -XGET "http://EsNode节点的IP:EsNode端口/_cluster/health?pretty"

    • 安全模式:

      curl -XGET --tlsv1.2 --negotiate -k -u : "https://EsNode节点的IP:EsNode端口/_cluster/health?pretty"