写点什么

ElasticSearch 集群迁移最佳实践

作者:冰心的小屋
  • 2022-11-23
    北京
  • 本文字数:3642 字

    阅读完需:约 12 分钟

ElasticSearch 集群迁移最佳实践

1. 准备工作

为了模拟生产 ES 集群,验证迁移过程中方案的正确性,编写了创建 ES 集群的脚本,脚本内容见资源。


创建集群:1 个 master、8 个 datanode

# 1. 安装sh install.sh  --name ice --ip 172.23.14.159 --hport 9200 --tport 9300 --mnum 1 --dnum 8# 2. 启动sh start.sh --mnum 1 --dnum 8# 3. 停止sh stop.sh --mnum 1 --dnum 8
复制代码


创建索引:patent_cn 64 分片 0 副本

{  "settings": {      "index": {        "routing": {          "allocation": {            "include": {              "_name": "data-1,data-2,data-3,data-4,data-5,data-6,data-7,data-8"            },            "total_shards_per_node": "10"          }        },        "number_of_shards": "64",        "number_of_replicas": "0"      }    }}
复制代码


迁移前状态:

  • master 节点:master-1

  • data 节点:data-1~8

2. 迁移后的目标集群

  • master 节点:master-2

  • data 节点:data-11~18


那么如何保证集群迁移过程中对业务影响最小,是本方案最终的目标。

3. 具体实施步骤

步骤 1:关闭集群自动分片

主要用来防止新增节点引发的分片自动平衡

PUT http://localhost:9200/_cluster/settings{ "transient" : { "cluster.routing.rebalance.enable" : "none" }}
复制代码

步骤 2:依次将 data-11~18 加入到原有 ES 集群中

# 模拟sh install.sh  --name ice --ip 172.23.14.159 --hport 9210 --tport 9310 --master master-1 --seed 172.23.14.159:9300 --dstart 11 --dnum 18
# 启动新集群datash start.sh --dstart 11 --dnum 18
复制代码

新集群加入后的状态:

步骤 3:重新调整索引路由节点

PUT http://localhost:9200/patent_cn/_settings{  "settings": {      "index": {        "routing": {          "allocation": {            "include": {              "_name": "data-1,data-2,data-3,data-4,data-5,data-6,data-7,data-8,data-11,data-12,data-13,data-14,data-15,data-16,data-17,data-18"            }          }        }      }    }}
复制代码

步骤 4:手动迁移分片

为了保证迁移过程对线上业务影响最小,务必一个分片一个分片迁移,迁移完毕后方可迁移下一个分片

POST http://localhost:9200/_cluster/reroute{  "commands": [    {      "move": {        "index": "patent_cn",        "shard": 5,        "from_node": "data-1",        "to_node": "data-11"      }    }  ]}
复制代码



等待当前分片完全迁移后,方可进行下步操作,最终效果:

步骤 5:下线历史数据节点 data-1~8

下线后的效果:

步骤 6:新增 master-2 加入到现有集群中

步骤 7:下线 master-1

请确保 master-2 已经在所有新集群的 seed 中

步骤 8:恢复集群自动平衡

PUT http://localhost:9200/_cluster/settings{  "transient" : {    "cluster.routing.allocation.enable": "all",    "cluster.routing.rebalance.enable" : "all"  }}
复制代码

4. 资源

install.sh

#!/bin/bashPOSITIONAL_ARGS=()
while [[ $# -gt 0 ]]; do case $1 in --name) NAME="$2" shift # past argument shift # past value ;; --ip) IP="$2" shift # past argument shift # past value ;; --hport) HPORT="$2" shift # past argument shift # past value ;; --tport) TPORT="$2" shift # past argument shift # past value ;; --mnum) MNUM="$2" shift # past argument shift # past value ;; --dnum) DNUM="$2" shift # past argument shift # past value ;; --mstart) MSTART="$2" shift # past argument shift # past value ;; --dstart) DSTART="$2" shift # past argument shift # past value ;; --master) MASTER="$2" shift # past argument shift # past value ;; --seed) SEED="$2" shift # past argument shift # past value ;; -*|--*) echo "Unknown option $1" exit 1 ;; *) POSITIONAL_ARGS+=("$1") # save positional arg shift # past argument ;; esacdone
set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters
if [ -z $IP ]then echo "--ip参数为空" exit 0fi
echo "输入参数如下:"echo "name: $NAME"echo "ip: $IP"echo "hport: $HPORT"echo "tport: $TPORT"echo "mnum: $MNUM"echo "mstart: $MSTART"echo "dnum: $DNUM"echo "dstart: $DSTART"echo "master: $MASTER"echo "seed: $SEED"

NNAME=${NAME:-test}HPORT=${HPORT:-9200}TPORT=${TPORT:-9300}MNUM=${MNUM:-0}DNUM=${DNUM:-0}MSTART=${MSTART:-1}DSTART=${DSTART:-1}
tar -xvf elasticsearch-7.17.7-linux-x86_64.tar.gz
echo "-Xms256m" >> elasticsearch-7.17.7/config/jvm.optionsecho "-Xmx256m" >> elasticsearch-7.17.7/config/jvm.options
# 写入masterfor i in $(seq $MSTART $MNUM);do
if [ -z $master ] then MASTER=master-$i SEED=$IP:$TPORT fi
cat << EoF > elasticsearch-7.17.7/config/elasticsearch.ymlcluster.name: $NAMEnode.name: master-$inode.master: truenode.data: falsepath.data: ./datanetwork.host: $IPhttp.port: $HPORTtransport.tcp.port: $TPORTdiscovery.seed_hosts: ["$SEED"]cluster.initial_master_nodes: ["$MASTER"]EoF
cp -R elasticsearch-7.17.7 master-$i
HPORT=`expr $HPORT + 1`TPORT=`expr $TPORT + 1`
done
# 写入datafor i in $(seq $DSTART $DNUM);do
cat << EoF > elasticsearch-7.17.7/config/elasticsearch.ymlcluster.name: $NAMEnode.name: data-$inode.master: falsenode.data: truepath.data: ./datanetwork.host: $IPhttp.port: $HPORTtransport.tcp.port: $TPORTdiscovery.seed_hosts: ["$SEED"]cluster.initial_master_nodes: ["$MASTER"]EoF
cp -R elasticsearch-7.17.7 data-$i
HPORT=`expr $HPORT + 1`TPORT=`expr $TPORT + 1`done
rm -r elasticsearch-7.17.7
复制代码

start.sh

#!/bin/bashPOSITIONAL_ARGS=()
while [[ $# -gt 0 ]]; do case $1 in --mnum) MASTER="$2" shift # past argument shift # past value ;; --mstart) MSTART="$2" shift # past argument shift # past value ;; --dnum) DATA="$2" shift # past argument shift # past value ;; --dstart) DSTART="$2" shift # past argument shift # past value ;; -*|--*) echo "Unknown option $1" exit 1 ;; *) POSITIONAL_ARGS+=("$1") # save positional arg shift # past argument ;; esacdone
set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters
echo "输入参数如下:"echo "mnum: $MASTER"echo "dnum: $DATA"echo "mstart: $MSTART"echo "dstart: $DSTART"
MASTER=${MASTER:-0}DATA=${DATA:-0}MSTART=${MSTART:-1}DSTART=${DSTART:-1}
for i in $(seq $MSTART $MASTER);domaster-$i/bin/elasticsearch -ddone
for i in $(seq $DSTART $DATA);dodata-$i/bin/elasticsearch -ddone
复制代码

stop.sh

#!/bin/bashPOSITIONAL_ARGS=()
while [[ $# -gt 0 ]]; do case $1 in --mnum) MASTER="$2" shift # past argument shift # past value ;; --mstart) MSTART="$2" shift # past argument shift # past value ;; --dnum) DATA="$2" shift # past argument shift # past value ;; --dstart) DSTART="$2" shift # past argument shift # past value ;; -*|--*) echo "Unknown option $1" exit 1 ;; *) POSITIONAL_ARGS+=("$1") # save positional arg shift # past argument ;; esacdone
set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters
echo "输入参数如下:"echo "mnum: $MASTER"echo "dnum: $DATA"echo "mstart: $MSTART"echo "dstart: $DSTART"
MASTER=${MASTER:-0}DATA=${DATA:-0}MSTART=${MSTART:-1}DSTART=${DSTART:-1}
for i in $(seq $MSTART $MASTER);dops -ef | grep master-$i | grep -v grep | awk '{print $2}' | xargs kill -9done
for i in $(seq $DSTART $DATA);dops -ef | grep data-$i | grep -v grep | awk '{print $2}' | xargs kill -9done
复制代码


发布于: 2022-11-23阅读数: 29
用户头像

分享技术上的点点滴滴! 2013-08-06 加入

一杯咖啡,一首老歌,一段代码,欢迎做客冰屋。

评论

发布
暂无评论
ElasticSearch 集群迁移最佳实践_elasticsearch_冰心的小屋_InfoQ写作社区