Проверка подлинности elasticsearch read_only_allow_delete

У меня проблема с Elasticsearch. Я попробовал следующее:

 $ curl -XPUT -H "Content-Type: application/json" \
     http://localhost:9200/_all/_settings \
       -d '{"index.blocks.read_only_allow_delete": false}'

Мои настройки:

"settings": {
  "index": {
    "number_of_shards": "5",
    "blocks": {
      "read_only_allow_delete": "true"
    },
    "provided_name": "new-index",
    "creation_date": "1515433832692",
    "analysis": {
      "filter": {
        "ngram_filter": {
          "type": "ngram",
          "min_gram": "2",
          "max_gram": "4"
        }
      },
      "analyzer": {
        "ngram_analyzer": {
          "filter": [
            "ngram_filter"
          ],
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    },
    "number_of_replicas": "1",
    "uuid": "OSG7CNAWR9-G3QC75K4oQQ",
    "version": {
      "created": "6010199"
    }
  }
}

Когда я проверяю настройки, он выглядит нормально, но только через несколько секунд (3-5), и все равно установлен на true. Я не могу добавлять новые элементы и ничего запрашивать, только _search и delete.

У кого-то есть идеи, как решить эту проблему?

ПРИМЕЧАНИЕ: я использую версию Elasticsearch: 6.1.1

Ответы

Ответ 1

Elasticsearch автоматически устанавливает "read_only_allow_delete": "true" когда на жестком диске мало места.

Найдите файлы, которые заполняют ваше хранилище, и удалите/переместите их. Когда у вас будет достаточно свободного места, выполните следующую команду через Dev Tool в Kibana:

PUT your_index_name/_settings
{
 "index": {
   "blocks": {
     "read_only_allow_delete": "false"
    }
  }
}

ИЛИ (через терминал):

$ curl -XPUT -H "Content-Type: application/json" \
   http://localhost:9200/_all/_settings \
     -d '{"index.blocks.read_only_allow_delete": false}'

как уже упоминалось в вашем вопросе.

Ответ 2

Фон

Мы поддерживаем кластер, в котором мы имеем отправителей filebeat, metricbeat, packetbeat и т.д., Которые отправляют данные в кластер. Неизменно некоторый индекс станет горячим, и мы захотим либо временно отключить запись в него, либо выполнить очистку и повторное включение индексов, которые превысили свои низкие пороговые значения водяных знаков и автоматически перешли в read_only_allow_delete: true.

Функции Bash

Чтобы упростить управление нашими кластерами для остальной части моей команды, я написал следующие функции Bash, чтобы помочь в выполнении этих задач без необходимости возиться с помощью curl или через пользовательский интерфейс Kibana.

$ cat es_funcs.bash

### es wrapper cmd inventory
declare -A escmd
escmd[l]="./esl"
escmd[p]="./esp"

### es data node naming conventions
nodeBaseName="rdu-es-data-0"
declare -A esnode
esnode[l]="lab-${nodeBaseName}"
esnode[p]="${nodeBaseName}"

usage_chk1 () {
    # usage msg for cmds w/ 1 arg
    local env="$1"

    [[ $env =~ [lp] ]] && return 0 || \
        printf "\nUSAGE: ${FUNCNAME[1]} [l|p]\n\n" && return 1
}

enable_readonly_idxs () {
    # set read_only_allow_delete flag
    local env="$1"
    usage_chk1 "$env" || return 1
    DISALLOWDEL=$(cat <<-EOM
        {
         "index": {
           "blocks": {
             "read_only_allow_delete": "true"
            }
          }
        }
    EOM
    )
    ${escmd[$env]} PUT '_all/_settings' -d "$DISALLOWDEL"
}

disable_readonly_idxs () {
    # clear read_only_allow_delete flag
    local env="$1"
    usage_chk1 "$env" || return 1
    ALLOWDEL=$(cat <<-EOM
        {
         "index": {
           "blocks": {
             "read_only_allow_delete": "false"
            }
          }
        }
    EOM
    )
    ${escmd[$env]} PUT '_all/_settings' -d "$ALLOWDEL"
}

Пример выполнения

Вышеуказанные функции могут быть получены в вашей оболочке следующим образом:

$ . es_funcs.bash

ПРИМЕЧАНИЕ. Массивы в верхней части файла отображают короткие имена кластеров, если у вас их несколько. У нас есть 2, один для нашей лаборатории и один для нашего производства. Так что я представлял их как l и p.

Затем вы можете запустить их следующим образом, чтобы включить атрибут read_only_allow_delete (true) в вашем кластере l:

$ enable_readonly_idxs l
{"acknowledged":true}

или p:

$ enable_readonly_idxs p
{"acknowledged":true}

Обзор вспомогательных сценариев

Есть еще один скрипт, который содержит команды curl которые я использую для взаимодействия с кластерами. На этот скрипт ссылаются в массиве escmd в верхней части файла es_func.bash. Массив содержит имена символических ссылок на один сценарий оболочки, escli.bash. Ссылки называются esl и esp.

$ ll
-rw-r--r-- 1 smingolelli staff  9035 Apr 10 23:38 es_funcs.bash
-rwxr-xr-x 1 smingolelli staff  1626 Apr 10 23:02 escli.bash
-rw-r--r-- 1 smingolelli staff   338 Apr  5 00:27 escli.conf
lrwxr-xr-x 1 smingolelli staff    10 Jan 23 08:12 esl -> escli.bash
lrwxr-xr-x 1 smingolelli staff    10 Jan 23 08:12 esp -> escli.bash

escli.bash:

$ cat escli.bash
#!/bin/bash

#------------------------------------------------
# Detect how we were called [l|p]
#------------------------------------------------
[[ $(basename $0) == "esl" ]] && env="lab1" || env="rdu1"

#------------------------------------------------
# source escli.conf variables
#------------------------------------------------
# g* tools via brew install coreutils
[ $(uname) == "Darwin" ] && readlink=greadlink || readlink=readlink
. $(dirname $($readlink -f $0))/escli.conf


usage () {
    cat <<-EOF

    USAGE: $0 [HEAD|GET|PUT|POST] '...ES REST CALL...'

    EXAMPLES:

        $0 GET  '_cat/shards?pretty'
        $0 GET  '_cat/indices?pretty&v&human'
        $0 GET  '_cat'
        $0 GET  ''
        $0 PUT  '_all/_settings'   -d "\$DATA"
        $0 POST '_cluster/reroute' -d "\$DATA"


    EOF
    exit 1
}

[ "$1" == "" ] && usage

#------------------------------------------------
# ...ways to call curl.....
#------------------------------------------------
if [ "${1}" == "HEAD" ]; then
    curl -I -skK \
        <(cat <<<"user = \"$( ${usernameCmd} ):$( ${passwordCmd} )\"") \
        "${esBaseUrl}/$2"
elif [ "${1}" == "PUT" ]; then
    curl -skK \
        <(cat <<<"user = \"$( ${usernameCmd} ):$( ${passwordCmd} )\"") \
        -X$1 -H "${contType}" "${esBaseUrl}/$2" "$3" "$4"
elif [ "${1}" == "POST" ]; then
    curl -skK \
        <(cat <<<"user = \"$( ${usernameCmd} ):$( ${passwordCmd} )\"") \
        -X$1 -H "${contType}" "${esBaseUrl}/$2" "$3" "$4"
else
    curl -skK \
        <(cat <<<"user = \"$( ${usernameCmd} ):$( ${passwordCmd} )\"") \
        -X$1 "${esBaseUrl}/$2" "$3" "$4" "$5"
fi

Этот скрипт принимает один файл свойств, escli.conf. В этом файле вы указываете команды для извлечения вашего имени пользователя и пароля из любого места, для этого я использую LastPass, поэтому извлекаю их через lpass а также lpass базовый URL-адрес для доступа к REST API ваших кластеров.

$ cat escli.conf
#################################################
### props used by escli.bash
#################################################

usernameCmd='lpass show --username somedom.com'
passwordCmd='lpass show --password somedom.com'

esBaseUrl="https://es-data-01a.${env}.somdom.com:9200"
contType="Content-Type: application/json"

Я собрал все это в репозитории Github (ссылка ниже), который также включает в себя дополнительные функции, помимо вышеприведенных 2, которые я показываю в качестве примеров для этого вопроса.

Рекомендации

Ответ 3

В попытке добавить разброс значений к принятому ответу (и потому что я буду гуглить это и вернусь в будущем), для моего случая был установлен флаг read_only_allow_delete потому что настройки по умолчанию для водяного знака диска основаны на процентах - что на мой большой диск не имел такого большого смысла. Таким образом, я изменил эти настройки, чтобы они оставались "размерами" на основании документации.

Поэтому, прежде чем установить для read_only_allow_delete значение false, я сначала устанавливаю значения водяных знаков на основе дискового пространства:

(используя пользовательский интерфейс Kibana):

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "20gb",
    "cluster.routing.allocation.disk.watermark.high": "15gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb"
  }
}

PUT your_index_name/_settings
{
 "index": {
   "blocks": {
     "read_only_allow_delete": "false"
    }
  }
}

ИЛИ (через терминал):

$ curl -XPUT -H "Content-Type: application/json" \
   http://localhost:9200/_cluster/_settings \
   -d '{"cluster.routing.allocation.disk.watermark.low": "20gb", 
     "cluster.routing.allocation.disk.watermark.high": "15gb", 
     "cluster.routing.allocation.disk.watermark.flood_stage": "10gb"}'

$ curl -XPUT -H "Content-Type: application/json" \
   http://localhost:9200/_all/_settings \
   -d '{"index.blocks.read_only_allow_delete": false}'