Elasticsearch - что делать с неназначенными осколками
мой кластер с желтым статусом, потому что некоторые осколки не назначены. что с этим делать?
Я попытался установить cluster.routing.allocation.disable_allocation = false
для всех индексов, но я думаю, что это не работает, потому что я использую версию 1.1.1.
Я также попытался перезапустить все машины, но это произойдет.
Любая идея?
EDIT:
-
Статистика кластера:
{
cluster_name: "elasticsearch",
status: "red",
timed_out: false,
number_of_nodes: 5,
number_of_data_nodes: 4,
active_primary_shards: 4689,
active_shards: 4689,
relocating_shards: 0,
initializing_shards: 10,
unassigned_shards: 758
}
Ответы
Ответ 1
Эти неназначенные осколки - это фактически неназначенные реплики ваших реальных осколков от мастера node.
Чтобы назначить эти осколки, вам нужно запустить новый экземпляр elasticsearch для создания вторичного node для переноса реплик данных.
РЕДАКТИРОВАТЬ: Иногда неназначенные осколки относятся к индексам, которые были удалены, что делает их чересчурными черепами, которые никогда не будут назначаться независимо от добавления узлов или нет. Но это не тот случай!
Ответ 2
Существует много возможных причин, по которым распределение не произойдет:
- Вы используете разные версии Elasticsearch на разных узлах.
- У вас есть только один node в вашем кластере, но у вас есть количество реплик, установленных на что-то отличное от нуля.
- Недостаточно места на диске.
- У вас выделено выделение осколков.
- У вас включен брандмауэр или SELinux. Если SELinux включен, но не настроен должным образом, вы увидите, что навсегда застряли черепа в INITIALIZING или RELOCATING.
Как правило, вы можете устранить такие проблемы:
- Посмотрите на узлы в вашем кластере:
curl -s 'localhost:9200/_cat/nodes?v'
. Если у вас есть только один node, вам нужно установить number_of_replicas
в 0. (См. Документацию по ES или другие ответы).
- Посмотрите на дисковое пространство, доступное в вашем кластере:
curl -s 'localhost:9200/_cat/allocation?v'
- Проверьте настройки кластера:
curl 'http://localhost:9200/_cluster/settings?pretty'
и найдите настройки cluster.routing
- Посмотрите, какие осколки UNASSIGNED
curl -s localhost:9200/_cat/shards?v | grep UNASS
-
Попробуйте принудительно назначить осколок
curl -XPOST -d '{ "commands" : [ {
"allocate" : {
"index" : ".marvel-2014.05.21",
"shard" : 0,
"node" : "SOME_NODE_HERE",
"allow_primary":true
}
} ] }' http://localhost:9200/_cluster/reroute?pretty
-
Посмотрите на ответ и посмотрите, что он говорит. Там будет куча ДА, которые в порядке, а затем НЕТ. Если нет NO, это, вероятно, проблема с брандмауэром /SELinux.
Ответ 3
Это обычная проблема, связанная с настройкой индекса по умолчанию, в частности, при попытке репликации на одном node. Чтобы исправить это с помощью настройки временного кластера, сделайте следующее:
curl -XPUT http://localhost:9200/_settings -d '{ "number_of_replicas" :0 }'
Затем включите кластер для перераспределения осколков (вы всегда можете включить это после того, как все сказано и сделано):
curl -XPUT http://localhost:9200/_cluster/settings -d '
{
"transient" : {
"cluster.routing.allocation.enable": true
}
}'
Теперь откиньтесь назад и наблюдайте, как кластер очищает неназначенные осколки реплик. Если вы хотите, чтобы это вступило в силу с будущими индексами, не забудьте изменить файл elasticsearch.yml со следующей настройкой и отказом кластера:
index.number_of_replicas: 0
Ответ 4
Единственное, что сработало для меня, - это изменить номер_объектива (у меня было 2 реплики, поэтому я изменил его на 1, а затем снова изменил на 2).
Во-первых:
PUT /myindex/_settings
{
"index" : {
"number_of_replicas" : 1
}
}
Тогда:
PUT /myindex/_settings
{
"index" : {
"number_of_replicas" : 2
}
}
Ответ 5
Первые два пункта ответа от Alcanzar сделали это для меня, но мне пришлось добавить
"allow_primary" : true
так
curl -XPOST http://localhost:9200/_cluster/reroute?pretty -d '{
"commands": [
{
"allocate": {
"index": ".marvel-2014.05.21",
"shard": 0,
"node": "SOME_NODE_HERE",
"allow_primary": true
}
}
]
}'
Ответ 6
Убедитесь, что версии ElasticSearch для каждого node совпадают. Если это не так, то ES не будет выделять копии копий индекса на "более старые" узлы.
Используя @Alcanzar ответ, вы можете получить некоторые сообщения об ошибках диагностики:
curl -XPOST 'http://localhost:9200/_cluster/reroute?pretty' -d '{
"commands": [
{
"allocate": {
"index": "logstash-2016.01.31",
"shard": 1,
"node": "arc-elk-es3",
"allow_primary": true
}
}
]
}'
результат:
{
"error" : "ElasticsearchIllegalArgumentException[[allocate] allocation of
[logstash-2016.01.31][1] on node [arc-elk-es3]
[Xn8HF16OTxmnQxzRzMzrlA][arc-elk-es3][inet[/172.16.102.48:9300]]{master=false} is not allowed, reason:
[YES(shard is not allocated to same node or host)]
[YES(node passes include/exclude/require filters)]
[YES(primary is already active)]
[YES(below shard recovery limit of [2])]
[YES(allocation disabling is ignored)]
[YES(allocation disabling is ignored)]
[YES(no allocation awareness enabled)]
[YES(total shard limit disabled: [-1] <= 0)]
*** [NO(target node version [1.7.4] is older than source node version [1.7.5]) ***
[YES(enough disk for shard on node, free: [185.3gb])]
[YES(shard not primary or relocation disabled)]]",
"status" : 400
}
Как определить номер версии ElasticSearch:
[email protected]:/var/log/kibana$ curl -XGET 'localhost:9200'
{
"status" : 200,
"name" : "arc-elk-web",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.7.5",
"build_hash" : "00f95f4ffca6de89d68b7ccaf80d148f1f70e4d4",
"build_timestamp" : "2016-02-02T09:55:30Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}
В моем случае я неправильно установил репозиторий apt-get
, и они перестали синхронизироваться на разных серверах. Я исправил его на всех серверах:
echo "deb http://packages.elastic.co/elasticsearch/1.7/debian stable main" | sudo tee -a /etc/apt/sources.list
а затем обычный:
sudo apt-get update
sudo apt-get upgrade
и окончательная перезагрузка сервера.