配置调优
设置索引数为双副本
在迁移时为了保证导入性能,通常建表时可以先指定副本数为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集群已经导入大量数据,在需要重启时,由于节点启动先后顺序不一致等原因,直接重启流程可能带来大量的主副本之间的数据复制,需要消耗大量资源,集群恢复需要很长时间,因此如果集群有重启需求时,建议先调整相关参数,并在重启后恢复。
- 在任意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" } } } }'
- 普通模式:
- 手工触发flush。
- 重启Elasticsearch服务或角色实例。
- 开启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" } } } }'
- 普通模式:
- 执行命令查看集群health的状态变成green,表示自动恢复完成。