Как поменять количество шардов?

(Dmitriy) #1

Добрый день.

У меня настроен кластер из одного сервера, в нем добавлено несколько паттернов индексов. Каждый день при создании нового индекса в нём появляются 5 лишних шардов.
Первое время я их чистил вручную командой

curl --header "content-type: application/JSON" -XPUT 'localhost:9200/_settings' -d '
{
"index" : {
"number_of_replicas" : 0
}
}'

Но сейчас решил сделать всё правильно и обновить дефолный шаблон индекса. И сразу столкнулся с проблемой.

Если вводить команду

PUT _template/all
{
"template": "*",
"settings": {
"number_of_shards": 5,
"number_of_replicas": 0
}
}

То возвращается PUT: command not found.

POST _template/default
{
"template": ["*"]
"order": -1
"settings": {
"number_of_shards": "5",
"number_of_replicas": "0"
}
}

Позволяет вводить данные, но после ввода последнего символа я могу закончить ввод только через ctrl+c. Похоже что тут я что-то делаю неправильно.

В одном из выводов logstash у меня есть ссылка на шаблон

output {
  if "winsrv" in [tags] {
    elasticsearch {
        hosts     => "localhost:9200"
        index    => "winsrv-%{+YYYY.MM.dd}"
         template => "/etc/logstash/conf.d/index_templates/winlogbeat.template.json"
         template_name => "winlogbeat"
         template_overwrite => true
    }
}

В конце этого шаблона я добавил следующее

"settings": {
"index": {
  "mapping": {
    "total_fields": {
      "limit": 10000
    }
  },
  "number_of_shards": 1,
  "refresh_interval": "5s",
  "number_of_replicas" : 0
}
}
}

Но индексы winsrv все равно продолжают создаваться с 5 лишними шардами.

Извините что несколько сумбурно написано, я только начал изучать ELK.

(Igor Motov) #2

Позволяет вводить данные, но после ввода последнего символа я могу закончить ввод только через ctrl+c. Похоже что тут я что-то делаю неправильно.

Как вы это вводите? С использованием curl или kibana?

Но индексы winsrv все равно продолжают создаваться с 5 лишними шардами.

Про какие шарды идет речь - праймари или реплики? Как вы узнали что у вас лишние шарды?

(Dmitriy) #3

Как вы это вводите? С использованием curl или kibana?

Пытался просто вставить через консоль...надо было через curl -PUT _template/default? У меня выдает curl: (6) Could not resolve host: _template.

Про какие шарды идет речь - праймари или реплики? Как вы узнали что у вас лишние шарды?

Праймари. Если я правильно понимаю, так как у меня один хост, реплик быть не может.
Выглядит это вот так:

Как только формируется новый индекс, в нём остается 5 нерапределенных шардов. Вроде как, в шаблоне elasticsearch по умолчанию, прописано 6 шардов и 1 реплика. И так как у меня один сервер, 5 шардов остаются нераспреленными.

Поправьте, если что-то написал неправильно.

(Igor Motov) #4

Команды в руководстве приведены показаны для кибаны. Для запуска в curl надо нажать на ссылку "COPY TO CURL" под примером. В вашем случае это будет выглядеть как-то так:

curl -XPOST "http://ИМЯ-МАШИНЫ-ИЛИ-IP:9200/_template/default" -H 'Content-Type: application/json' -d'
{
  "template": [ "*" ],
  "order": -1,
  "settings": {
    "number_of_shards": "5",
    "number_of_replicas": "0"
  }
}'

По умолчанию, в старых версиях 5 праймари и 1 реплика для каждой праймари (то есть 10 шард).

(Dmitriy) #5

Возвращается ошибка

 {"error":{"root_cause":[{"type":"action_request_validation_exception","reason":"Validation 
Failed: 1: index patterns are missing;"}],"type":"action_request_validation_exception","reason":"Validation Failed: 1: index 
patterns are missing;"},"status":400}

По умолчанию, в старых версиях 5 праймари и 1 реплика для каждой праймари (то есть 10 шард).

Спасибо за информацию. Версия 6.6. Она уже считается старой?

(Dmitriy) #6

Если я правильно понял, у меня отсутствует такой шаблон. Команда

curl -get "http://localhost:9200/_template/*"

Возвращает довольно большой список, в котором много шаблонов, но шаблона с именем default там нет. Все шаблоны имеют вот такие параметры number_of_shards и number_of_replicas

".monitoring-beats":{"order":0,"version":6050399,"index_patterns":[".monitoring-beats-6-*"],"settings":{"index":{"format":"6","codec":"best_compression","number_of_shards":"1","auto_expand_replicas":"0-1","number_of_replicas":"0"}}

(Igor Motov) #7

Да, по памяти писал, напутал немного. В 6.6 должно быть так:

curl -XPUT "http://ИМЯ-МАШИНЫ-ИЛИ-IP:9200/_template/default" -H 'Content-Type: application/json' -d'
{
  "index_patterns": [
    "*"
  ],
  "order": -1,
  "settings": {
    "number_of_shards": "5",
    "number_of_replicas": "0"
  }
}'

6.6 - это самое то на данный момент, ничего новее пока не выпустили. Но, поскольку, я над 8-й версией в данной момент работаю, то для меня 6-я уже старая :slight_smile: . Правильнее было бы сказать, "в текущих версиях". Начиная с 7.0.0 это изменится.

1 Like
(Dmitriy) #8

Круто! Все получилось! Во всяком случае результат {"acknowledged":true}

6.6 - это самое то на данный момент, ничего новее пока не выпустили. Но, поскольку, я над 8-й версией в данной момент работаю, то для меня 6-я уже старая :slight_smile: . Правильнее было бы сказать, "в текущих версиях". Начиная с 7.0.0 это изменится.

Удивительное время. Только начинаешь вникать в актуальную версию продукта, а она уже устарела.

Если вас не затруднит, расскажите еще пожалуйста, почему у меня параметры количества реплик не применяются из шаблона winlogbeat.template.json?

(Igor Motov) #9

Посмотрите на все шаблоны, которые применимы к вашему индексу и посмотрите на установки в шаблоне, где order больше всех остальных. Эти установки должны быть применены, если вы ничего не задаете при создании самого индекса. И еще - изменение шаблонов на уже созданные индексы никак не влияют.

1 Like
(Dmitriy) #10

Шаблоны я не добавлял, поэтому кроме дефолта больше ничего применяться не должно.
Сейчас заметил что в шаблоне winlogbeat.template.json не был указан order. Добавил "order": 1, и для проверки поставил 6 шард. Если все правильно, то при создании следующего индекса у меня должен быть 1 unassigned shard?

(Igor Motov) #11

Это как? Я что-то логику не очень понимаю. Если у вас

    "number_of_shards": "6",
    "number_of_replicas": "0"

то у вас будет 6 assigned primary и 0 unassigned replicas

Если у вас

    "number_of_shards": "6",
    "number_of_replicas": "1"

то у вас будет 6 assigned primary и 6 unassigned replicas (1 копия для каждой праймари)

Соответственно

    "number_of_shards": "6",
    "number_of_replicas": "2"

приведет к 6 assigned primary и 12 unassigned replicas (2 копии для каждой праймари - 6*2=12 ).

1 Like
(Dmitriy) #12

Да, я неправильно написал. Неназначенные шарды будут зависеть от общего количества шард и реплик.
Чтобы проверить работает ли шаблон для winsrv, нужно поменять количество реплик и тогда в новых индексах должны появиться неназначенные шарды, либо посмотреть текущее количество шард командой

curl GET http://localhost:9200/_cat/shards/winsrv-2019.03.1*

Сейчас показывает 5 в индексах за последние дни, а в шаблоне 6. Что-то не работает. Но тема уже ушла от основного вопроса, думаю тут можно не продолжать. В крайнем случае открою новую.

Большое спасибо за помощь!

(Igor Motov) #13

Если вы пришлете все шаблоны, которые выводятся по

curl -XGET "http://ИМЯ-МАШИНЫ-ИЛИ-IP:9200/_template"

я смогу, скорее всего, объяснить, почему оно не работает. Сюда вывод скорее всего не поместиться, так что лучше положить куда-нибудь вроде gist.github.com и прислать сюда ссылку.

(Dmitriy) #14

Вот что получилось https://gist.github.com/KOTOXJle6/77cd2568a9e831cb27b0028e65ed6ec9

(Igor Motov) #15

У вас кусок вывода отрезан. Нужен весь вывод.

(Dmitriy) #16

Извините. Обновил.

(Igor Motov) #17

У вас нет темплетов для индекса winsrv. Единственный темплейт, который будет работать для этого индекса это default и в нем 5 шард:

{
  "default": {
    "order": -1,
    "index_patterns": [
      "*"
    ],
    "settings": {
      "index": {
        "number_of_shards": "5",
        "number_of_replicas": "0"
      }
    },
}
(Dmitriy) #18

А разве к нему не должен применяться шаблон, который я указываю в Output Logstash'а?

template => "/etc/logstash/conf.d/index_templates/winlogbeat.template.json"
(Igor Motov) #19

А разве к нему не должен применяться шаблон, который я указываю в Output Logstash'а?

К нему должен применяться шаблон, у которого совпадает маска, и о котором elasticsearch знает. О шабоне в logstash elasticsearch очевидно не знает. Это очевидно по списку шаблонов, который вы мне прислали. Почему это происходит? Это уже совсем другой вопрос. Надо смотреть на конфигурацию logstash и разбираться в чем проблема.

1 Like
(system) closed #20

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.