为什么批量更新从不与 Elasticsearch 中的按查询更新请求冲突
Why bulk update never conflicts with update-by-query requests in Elasticsearch
我保留了两个脚本 运行,其中一个向索引发送批量请求:
while true; do
s=$(tr -dc A-Za-z0-9 < /dev/urandom | head -c 10)
curl -s -X POST 'localhost:9200/test/_bulk' -H 'Content-Type: application/x-ndjson' -d \
'{ "update": { "_index": "test", "_id": "1" } }
{ "doc": { "name": "update", "foo": "'$s'" } }
{ "update": { "_index": "test", "_id": "2" } }
{ "doc": { "name": "update", "foo": "'$s'" } }
{ "update": { "_index": "test", "_id": "3" } }
{ "doc": { "name": "update", "foo": "'$s'" } }
'
echo ''
done
另一个发送对这些文档的按查询更新请求(我必须在每个请求后睡觉,因为如果请求发送得太频繁,它可能会与前一个冲突):
while true; do
s=$(tr -dc A-Za-z0-9 < /dev/urandom | head -c 10)
curl -s -X POST 'localhost:9200/test/_update_by_query' -H 'Content-Type: application/json' -d \
'{
"query": {
"match": {
"name": {
"query": "update"
}
}
},
"script": {
"lang": "painless",
"source": "ctx._source['"'foo'"'] = '"'$s'"'"
}
}'
echo ''
sleep 1
done
从两个脚本的输出来看,批量响应没有冲突失败。所有冲突都发生在按查询更新端。
根据冲突错误信息:version conflict, required seqNo [66], primary term [1]. current document has seqNo [67] and primary term [1]
,似乎冲突发生在操作从主分片复制到副本时。但是bulk也需要那样做,增加seqNo对吧?
是否有可能按查询更新成功但批量冲突有时会失败?
您的批量请求始终使用 index
命令,因此覆盖文档(如果有)或创建新文档,因此永远不会发生冲突。
按查询更新请求是...好吧,更新,冲突只能发生在这边。
如果您的更新请求是在批量请求覆盖现有文档之后发出的,则会发生冲突。
如果您的批量请求是在更新请求更新文档之后发出的,则不会发生任何事情,因为批量请求将覆盖更新请求所做的更改,因为它使用 index
命令。
我保留了两个脚本 运行,其中一个向索引发送批量请求:
while true; do
s=$(tr -dc A-Za-z0-9 < /dev/urandom | head -c 10)
curl -s -X POST 'localhost:9200/test/_bulk' -H 'Content-Type: application/x-ndjson' -d \
'{ "update": { "_index": "test", "_id": "1" } }
{ "doc": { "name": "update", "foo": "'$s'" } }
{ "update": { "_index": "test", "_id": "2" } }
{ "doc": { "name": "update", "foo": "'$s'" } }
{ "update": { "_index": "test", "_id": "3" } }
{ "doc": { "name": "update", "foo": "'$s'" } }
'
echo ''
done
另一个发送对这些文档的按查询更新请求(我必须在每个请求后睡觉,因为如果请求发送得太频繁,它可能会与前一个冲突):
while true; do
s=$(tr -dc A-Za-z0-9 < /dev/urandom | head -c 10)
curl -s -X POST 'localhost:9200/test/_update_by_query' -H 'Content-Type: application/json' -d \
'{
"query": {
"match": {
"name": {
"query": "update"
}
}
},
"script": {
"lang": "painless",
"source": "ctx._source['"'foo'"'] = '"'$s'"'"
}
}'
echo ''
sleep 1
done
从两个脚本的输出来看,批量响应没有冲突失败。所有冲突都发生在按查询更新端。
根据冲突错误信息:version conflict, required seqNo [66], primary term [1]. current document has seqNo [67] and primary term [1]
,似乎冲突发生在操作从主分片复制到副本时。但是bulk也需要那样做,增加seqNo对吧?
是否有可能按查询更新成功但批量冲突有时会失败?
您的批量请求始终使用 index
命令,因此覆盖文档(如果有)或创建新文档,因此永远不会发生冲突。
按查询更新请求是...好吧,更新,冲突只能发生在这边。
如果您的更新请求是在批量请求覆盖现有文档之后发出的,则会发生冲突。
如果您的批量请求是在更新请求更新文档之后发出的,则不会发生任何事情,因为批量请求将覆盖更新请求所做的更改,因为它使用 index
命令。