ElasticSearch使用最佳实践-写入规范
1.客户端的使用规范
1)客户端禁止配置EsMaster节点的IP和Port:EsMaster实例为重要的管理进程,为确保ES集群稳定性,不允许配置EsMaster节点IP和Port在客户端的IP列表中。EsMaster默认端口为24148,检查客户端不允许配置此端口。
2)若未规划EsClient角色,则客户端配置多个EsNode实例的IP和Port列表:客户端需要配置多个EsNode实例的IP和Port列表,实现负荷分担和负载均衡,避免单EsNode性能瓶颈。建议所有的EsNode实例的IP和Port都配置在客户端IP列表中。各EsNode默认端口如下:
EsNode1:24100
EsNode2:24102
EsNode3:24104
EsNode4:24106
EsNode5:24108
EsNode6:24110
EsNode7:24112
EsNode8:24114
EsNode9:24116
若集群中存在以上某些EsNode角色,则根据以上端口对应关系,检查是否配置了这些端口。若规划了EsClient端口,则建议客户端配置上所有EsClient的IP和Port,减轻EsNode的内存压力。
EsClient默认端口为24118,检查客户端是否配置了此端口
3)在应用程序结束时需要调用Client的close()方法。任务运行过程中不要频繁创建和关闭Client。建议一个进程或者一个线程创建一个Client。
2. 多线程并发写入
1)使用多线程方式并发索引数据:应用程序使用多线程并发索引数据,推荐的并发线程数为主机CPU核数的1~2倍。比如32核的主机,可设置线程数为30~60个。
2)运行多个客户端并发执行任务:运行多个客户端并发执行索引/查询任务,提升性能。
3. Bulk批量提交请求
1)使用批量请求,设置合理的数据条数:使用bulk命令进行批量索引数据时,每批次提交的数据大小为5~15MB;比如每条数据大小为1k,那么建议批量提交的数据条数为5000条;当前集群的最佳批量请求大小,可以从5MB开始测试,缓慢增加这个大小,直到写入性能不能提升为止。
2)每个批量请求中只处理一个索引的数据:一个bulk请求只写入一个索引的数据,不建议一个bulk请求同时写入多个索引的数据,不同索引的数据分多个bulk请求提交。
4. 提升写入速度参数设置
1)修改索引刷新时间:默认为1s,可修改为60s。
直接设置:
curl -XPUT "http://ip:httpport/index/_settings?pretty" -H 'Content-Type: application/json' -d' { "refresh_interval" : "60s" }' |
通过索引模板设置:
curl -XPUT --tlsv1.2 --negotiate -k -u : "https://127.0.0.1:24100/_template/template_1" -H 'Content-Type: application/json' -d' { "template": "index*", "settings": { "refresh_interval": "60s" } }' |
其中"template": "index*"表示索引的匹配模式,表示以index开头的索引都会通过此模板生效。
2)修改Translog策略参数:
直接设置(设置此参数时需要先关闭索引,设置成功后再打开索引,会影响业务运行,建议走变更流程):
Curl –XPUT “http://ip:httpport/index/_settings?pretty” –H ‘Content-Type: application/json' -d' { "translog. durability ":" async ", "sync_interval": "180s", "translog.flush_threshold_size":"5gb" }' |
通过索引模板设置:
curl -XPUT --tlsv1.2 --negotiate -k -u : "https://127.0.0.1:24100/_template/template_1" -H 'Content-Type: application/json' -d' { "template": "index*", "settings": { "index": { "translog": { "flush_threshold_size": "500mb", "sync_interval": "120s", "durability": "async" } } } }' |
其中"template": "index*"表示索引的匹配模式,表示以index开头的索引都会通过此模板生效。
3)针对于5机器节点以上,为了让各个实例上的分片均匀分布,添加如下参数,设置每个索引在单个实例上的分片个数,如下所示为每个索引在每个实例上的分片为2个。
直接设置:
curl -XPUT 'http://http:httpport/myindex/_settings?pretty' -H 'Content-Type:application/json' -d ' { "index.routing.allocation.total_shards_per_node":"2" }' |
通过索引模板设置:
curl -XPUT --tlsv1.2 --negotiate -k -u : "https://127.0.0.1:24100/_template/template_1" -H 'Content-Type: application/json' -d' { "template": "index*", "settings": { "index.routing.allocation.total_shards_per_node":"2" } }' |
其中"template": "index*"表示索引的匹配模式,表示以index开头的索引都会通过此模板生效。
5. Indexing Buffer
indexing buffer在为doc建立索引时使用,当缓冲满时会刷入磁盘,生成一个新的 segment,这是除refresh_interval外另外一个刷新索引,生成新segment的机会。每个 shard有自己的indexing buffer,下面的关于这个buffer大小的配置需要除以这个节点上所有的shard数量。
indices.memory.index_buffer_size
默认为整个堆的10%,如30GB堆内存,约占300M,在大量的索引操作时,可以考虑适当增大,但不要超过20%。
- 点赞
- 收藏
- 关注作者
评论(0)