ElasticSearch 集群迁移最佳实践
作者:冰心的小屋
- 2022-11-23 北京
本文字数:3642 字
阅读完需:约 12 分钟

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
版权声明: 本文为 InfoQ 作者【冰心的小屋】的原创文章。
原文链接:【http://xie.infoq.cn/article/9d3324130f3611158f58e6b32】。文章转载请联系作者。
冰心的小屋
关注
分享技术上的点点滴滴! 2013-08-06 加入
一杯咖啡,一首老歌,一段代码,欢迎做客冰屋。









评论