ES分片从新路由解决分片不平衡问题

一、发现问题html

根据kinbana的monitor发现ES集群的索引分片分布不均匀,硬盘使用也不平衡。node

很奇怪分片少的硬盘空间还用得多,而分片多的硬盘反而用得少,还没搞清楚缘由,ES会本身平衡集群分片,因为某个节点分片少,会不停的往这个节点建分片,致使硬盘空间差距愈来愈大,这个问题影响到了存储,必需要解决。shell

二、查找解决方案json

https://www.elastic.co/guide/en/elasticsearch/reference/6.3/cluster-reroute.htmlbash

根据官方文档能够从新路由,移动分片以达到分片平衡,但因为手动执行命令太慢太累了,因而决定写个脚本,app

三、最终解决方案:脚本批量移动curl

shell脚本:查找节点重复分片并从新路由(移动分片)elasticsearch

#!/bin/bash

declare -A node_group=(
  ["es-node-01"]="es-node-02 es-node-03 es-node-04 es-node-05 es-node-06 es-node-07"
  ["es-node-02"]="es-node-01 es-node-03 es-node-04 es-node-05 es-node-06 es-node-07"
  ["es-node-03"]="es-node-01 es-node-02 es-node-04 es-node-05 es-node-06 es-node-07"
  ["es-node-04"]="es-node-01 es-node-02 es-node-03 es-node-05 es-node-06 es-node-07"
  ["es-node-05"]="es-node-01 es-node-02 es-node-03 es-node-04 es-node-06 es-node-07"
  ["es-node-06"]="es-node-01 es-node-02 es-node-03 es-node-04 es-node-05 es-node-07"
  ["es-node-07"]="es-node-01 es-node-02 es-node-03 es-node-04 es-node-05 es-node-06"
)

function get_to_nodes(){
  IFS=', ' read -r -a array <<< "$1"
  count=$2
  size=${#array[@]}

  r=$RANDOM
  start=`expr $r % $size`
  for ((i=0;i<$count;i++))
  do
    idx=`expr $start + $i`
    if [[ $idx -ge $size ]]; then
      idx=`expr $idx % $size`
    fi
    result[$i]=${array[$idx]}
  done

  echo "${result[@]}"
}

pattern=$1

src_file=".index_shards"
re_file=".repeat_shards"

server="http://localhost:9200"
# 根据参数传入的索引pattern获取分片信息
curl -s -XGET "${server}/_cat/shards/${pattern}?v&h=index,node,ip,shard,prirep,state,store,unassigned.reasons" > $src_file
# 调awk脚本提取单节点有重复分片的索引
awk -f extract.awk $src_file |sort > $re_file

index=""
from_node=""
to_node=""

for line in $(cat $re_file)
do 
  #line=${line//,/ }
  IFS=', ' read -r -a line <<< "$line"
  if [[ ${#line[@]} -eq 3 ]]; then
    #printf "${line[0]}, ${line[1]}, ${line[2]} \n"
    index=${line[0]}
    from_node=${line[1]}
    total=${line[2]}
    count=`expr $total - 1`
    to_nodes=($(get_to_nodes "${node_group[$from_node]}" $count))
    
    shards=($(grep -E "${index}\s+${from_node}" $src_file|awk '$5 =="p" {s=s" "$4}END{print s}'))

    for idx in "${!to_nodes[@]}"
    do
      shard=${shards[$idx]}
      to_node=${to_nodes[$idx]}
      cmd="curl -s -XPOST -H 'Content-Type: application/json' '${server}/_cluster/reroute?filter_path=acknowledged' \
-d '{\"commands\":[{\"move\":{\"index\":\"${index}\",\"shard\":${shard},\"from_node\":\"${from_node}\",\"to_node\":\"${to_node}\"}}]}'"
      #echo "${index}\s+${from_node}, $total-${shards[@]}, $to_node: $cmd"
      rs=`eval $cmd`
      echo "move $index shard $shard from $from_node to $to_node: $rs"
      #exit 0
    done
  fi
  #exit 0
done

awk脚本:提取重复分片信息ide

#!/bin/awk -f

$5 == "p" {sum[$1","$2]++}END{for(i in sum) if(sum[i]>1) printf("%s,%d\n",i,sum[i])}

四、执行ui

# 从新路由平衡2019年2月的分片
bash -e ./reroute.sh *-2019.02.*

五、处理结果

还没执行完。。。。后面补处理结果

相关文章
相关标签/搜索