Здравствуйте. Ситуация следующая, есть две 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?
Магия 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