Blame view

scripts/reindex_from_remote_tenant_170_to_0.sh 3.29 KB
d71e20f0   tangwang   索引同步,用于性能测试
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\":{}}}'"