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
# 启动新集群data
sh 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/bash
POSITIONAL_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
;;
esac
done
set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters
if [ -z $IP ]
then
echo "--ip参数为空"
exit 0
fi
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.options
echo "-Xmx256m" >> elasticsearch-7.17.7/config/jvm.options
# 写入master
for 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.yml
cluster.name: $NAME
node.name: master-$i
node.master: true
node.data: false
path.data: ./data
network.host: $IP
http.port: $HPORT
transport.tcp.port: $TPORT
discovery.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
# 写入data
for i in $(seq $DSTART $DNUM);
do
cat << EoF > elasticsearch-7.17.7/config/elasticsearch.yml
cluster.name: $NAME
node.name: data-$i
node.master: false
node.data: true
path.data: ./data
network.host: $IP
http.port: $HPORT
transport.tcp.port: $TPORT
discovery.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/bash
POSITIONAL_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
;;
esac
done
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);
do
master-$i/bin/elasticsearch -d
done
for i in $(seq $DSTART $DATA);
do
data-$i/bin/elasticsearch -d
done
复制代码
stop.sh
#!/bin/bash
POSITIONAL_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
;;
esac
done
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);
do
ps -ef | grep master-$i | grep -v grep | awk '{print $2}' | xargs kill -9
done
for i in $(seq $DSTART $DATA);
do
ps -ef | grep data-$i | grep -v grep | awk '{print $2}' | xargs kill -9
done
复制代码
划线
评论
复制
发布于: 2022-11-23阅读数: 29
版权声明: 本文为 InfoQ 作者【冰心的小屋】的原创文章。
原文链接:【http://xie.infoq.cn/article/9d3324130f3611158f58e6b32】。文章转载请联系作者。
冰心的小屋
关注
分享技术上的点点滴滴! 2013-08-06 加入
一杯咖啡,一首老歌,一段代码,欢迎做客冰屋。
评论