报错现象
代码语言:javascript复制number of documents in the index cannot exceed 2147483519
报错解析
ES单个分片最大的文档数是21个亿。如果写入的doc总量超过这个值,就会写入拒绝!!
为防止因分片满导致写入拒绝,一定要提前做好监控告警,分片文档数大于19亿及时告警。平时控制分片大小在30-50G健康水位,防止单个分片过大。防止倾斜数据产生。
解决方案
方案1:
新建新索引写入,并且规划好分片大小。
方案2:
reindex索引,新索引做好分片规划
首先关闭索引自动创建,防止旧索引删除后,自动创建同名索引。
代码语言:javascript复制PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": false
}
}
其次:先去掉副本,索引设置只读,禁写。
代码语言:javascript复制PUT indexname/_settings
{
"blocks.write": true
}
第三步,创建目标索引,包括settingsmappings(此处省略创建步骤)
执行拷贝
代码语言:javascript复制POST _reindex?wait_for_completion=false&slices=auto&refresh
{
"source": {
"index": "indexname"
},
"dest": {
"index": "indexname_new"
}
}
第四步:查看进度 自定义拷贝
代码语言:javascript复制获取reindex任务列表
GET _tasks?detailed=true&actions=*reindex
根据任务ID查看任务
GET /_tasks/r1A2WoRbTwKZ516z6NEs5A:36619
若想取消任务
POST _tasks/r1A2WoRbTwKZ516z6NEs5A:36619/_cancel
第五步:删除旧索引delete source index
第六步:添加别名
代码语言:javascript复制POST /_aliases
{
"actions": [
{
"add": {
"index": "indexname_new",
"alias": "indexname" //这里可以用老索引名字,就不需要业务侧修改写入索引名了
}
}
]
}