@deudron

Как правильно сделать hot-warm кластер?

Здравствуйте. Ситуация следующая, есть две elastisearch ноды в кластере (одна на быстром, но маленьком ssd, другая на большом, но медленном hdd). Хочу сделать hot-warm архитектуру, т.е на ssd храним логи за последние N дней, а по истечению этих N преносим их на HDD-ноду, освобождая место на SSD. Успешно это реализовал через shard allocation filtering и curator, но столкнулся с пробелмой, что некоторые shard для новых index-ов (тех, которые не старше N дней) начали распологаться на HDD-ноде, и из-за этого сильно ухудшилась производительность. Вопрос, как правильно сконфигурировать кластер так, чтобы индексы не старше N дней распологались ТОЛЬКО на ssd-ноде (или на нескольких ssd нодах в будущем), а по истечению срока в N дней переносились на HDD ноду? И стоит ли делать hdd ноду master или только data?
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
Магия bash + jq, можно крутить кроном/AWX/любимым таск менеджером.
ES_URL='http://elasticsearch_address:port' #URL эластика
ATTR_NAME="storage_type" #аттрибут ноды, устанавливается в elasticsearch.yml
ATTR_WARM="hdd" #значение аттрибута, соответствующий "тёплой" ноде
N=3 #количество календарных дней до передвижения индекса

END_DATE=$(date --date="$N days ago" -I)
for INDEX in $(curl -s "$ES_URL"'/_cat/indices?h=index,creation.date.string&format=json' |
  jq -rc '.[] | select(."creation.date.string" < "3*") | .index')
do
  curl -s -XPUT "${ES_URL}/${INDEX}/_settings" -d "{\"index.routing.allocation.require.${ATTR_NAME}\":\"{ATTR_WARM}\"}"
  if [ $& -eq]
  then
    echo "$INDEX has been set up"
  else
    echo "Error while setting up $INDEX"
    ERRORS=
  fi
done
if [[ -v $ERRORS ]]
then
  exit 1
fi
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы