reindex_from_remote_tenant_170_to_0.sh
3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/bin/bash
#
# 从远程 ES 的 search_products_tenant_170 同步 10000 条到本机 search_products_tenant_0。
# 请求发往本机 ES,由本机去拉远程数据;需在本机 elasticsearch.yml 配置 reindex.remote.whitelist。
#
# 用法:
# ./scripts/reindex_from_remote_tenant_170_to_0.sh
#
# 环境变量(可选):
# LOCAL_ES_HOST 本机 ES 地址,用于创建索引和发送 _reindex(默认从 .env 的 ES_HOST 读取,应为本机)
# REMOTE_ES_HOST 远程 ES 地址(默认 http://120.76.41.98:9200)
# REMOTE_ES_USER 远程 ES 用户名(默认 essa)
# REMOTE_ES_PASS 远程 ES 密码(默认 4hOaLaf41y2VuI8y)
# MAX_DOCS 同步条数(默认 10000)
#
set -e
cd "$(dirname "$0")/.."
PROJECT_ROOT="$(pwd)"
# 加载 .env
# shellcheck source=scripts/lib/load_env.sh
source "${PROJECT_ROOT}/scripts/lib/load_env.sh"
load_env_file "${PROJECT_ROOT}/.env"
# 本机 ES(发 _reindex 请求的目标)
LOCAL_ES_HOST="${LOCAL_ES_HOST:-${ES_HOST:-http://localhost:9200}}"
ES_USERNAME="${ES_USERNAME:-}"
ES_PASSWORD="${ES_PASSWORD:-}"
ES_INDEX_NAMESPACE="${ES_INDEX_NAMESPACE:-}"
# 远程 ES(数据源)
REMOTE_ES_HOST="${REMOTE_ES_HOST:-http://120.76.41.98:9200}"
REMOTE_ES_USER="${REMOTE_ES_USER:-essa}"
REMOTE_ES_PASS="${REMOTE_ES_PASS:-4hOaLaf41y2VuI8y}"
MAX_DOCS="${MAX_DOCS:-10000}"
SOURCE_INDEX="search_products_tenant_170"
DEST_INDEX="${ES_INDEX_NAMESPACE}search_products_tenant_0"
MAPPING_FILE="${PROJECT_ROOT}/mappings/search_products.json"
# 本机 curl 认证
AUTH_PARAM=""
if [ -n "$ES_USERNAME" ] && [ -n "$ES_PASSWORD" ]; then
AUTH_PARAM="-u ${ES_USERNAME}:${ES_PASSWORD}"
fi
echo "本机 ES: $LOCAL_ES_HOST"
echo "远程 ES: $REMOTE_ES_HOST"
echo "源索引: $SOURCE_INDEX"
echo "目标索引: $DEST_INDEX"
echo "同步条数: $MAX_DOCS"
echo ""
# 1. 若目标索引不存在,则创建
if ! curl -s $AUTH_PARAM "${LOCAL_ES_HOST}/${DEST_INDEX}" -o /dev/null -w "%{http_code}" | grep -q 200; then
echo "创建目标索引: $DEST_INDEX"
if [ ! -f "$MAPPING_FILE" ]; then
echo "错误: mapping 文件不存在: $MAPPING_FILE"
exit 1
fi
curl -X PUT "${LOCAL_ES_HOST}/${DEST_INDEX}" \
-H "Content-Type: application/json" \
$AUTH_PARAM \
-d @"${MAPPING_FILE}" \
-w "\nHTTP: %{http_code}\n" -s | tail -1
echo ""
else
echo "目标索引已存在: $DEST_INDEX,将写入数据(可能覆盖同 id 文档)"
fi
# 2. Reindex from remote(JSON 中的密码用 env 传入,避免 shell 转义)
echo "执行 Reindex from remote(最多 $MAX_DOCS 条)..."
export REMOTE_ES_HOST REMOTE_ES_USER REMOTE_ES_PASS SOURCE_INDEX DEST_INDEX MAX_DOCS
# ES 9.x 将 wait_for_completion 放在 query 参数,不在 body
curl -X POST "${LOCAL_ES_HOST}/_reindex?wait_for_completion=true&pretty" \
-H "Content-Type: application/json" \
$AUTH_PARAM \
-d @- <<EOF
{
"max_docs": ${MAX_DOCS},
"source": {
"remote": {
"host": "${REMOTE_ES_HOST}",
"username": "${REMOTE_ES_USER}",
"password": "${REMOTE_ES_PASS}"
},
"index": "${SOURCE_INDEX}",
"size": 500
},
"dest": {
"index": "${DEST_INDEX}"
}
}
EOF
echo ""
echo "完成。校验条数: curl $AUTH_PARAM '${LOCAL_ES_HOST}/${DEST_INDEX}/_count?pretty' -H 'Content-Type: application/json' -d '{\"query\":{\"match_all\":{}}}'"