mon cluster est au statut jaune car certains fragments ne sont pas attribués. Que faire avec ceci?
J'ai essayé de définir cluster.routing.allocation.disable_allocation = false
sur tous les index, mais je pense que cela ne fonctionne pas car j'utilise la version 1.1.1.
J'ai également essayé de redémarrer toutes les machines, mais la même chose se produit.
Une idée?
MODIFIER :
Cluster stat:
{
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
}
Ces fragments non attribués sont en réalité des réplicas non attribués de vos fragments réels à partir du nœud maître.
Pour affecter ces fragments, vous devez exécuter une nouvelle instance de elasticsearch afin de créer un noeud secondaire pour transporter les réplicas de données.
EDIT: Parfois, les fragments non attribués appartiennent aux index supprimés, ce qui en fait des fragments orphelins qui ne seront jamais attribués, que des noeuds soient ajoutés ou non. Mais ce n'est pas le cas ici!
Il y a plusieurs raisons possibles pour lesquelles l'allocation ne se produira pas:
En règle générale, vous pouvez résoudre les problèmes suivants:
curl -s 'localhost:9200/_cat/nodes?v'
. Si vous n'avez qu'un seul nœud, vous devez définir number_of_replicas
sur 0. (Voir la documentation de ES ou d'autres réponses).curl -s 'localhost:9200/_cat/allocation?v'
curl 'http://localhost:9200/_cluster/settings?pretty'
et recherchez les paramètres cluster.routing
curl -s localhost:9200/_cat/shards?v | grep UNASS
Essayez de forcer un fragment à être assigné
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
Regardez la réponse et voyez ce qu'elle dit. Il y aura un tas de OUI qui sont ok, puis un NON. S'il n'y a pas de NON, c'est probablement un problème de pare-feu/SELinux.
Il s'agit d'un problème courant lié au paramètre d'index par défaut, en particulier lorsque vous essayez de répliquer sur un seul nœud. Pour résoudre ce problème avec le paramètre de cluster transitoire, procédez comme suit:
curl -XPUT http://localhost:9200/_settings -d '{ "number_of_replicas" :0 }'
Ensuite, activez le cluster pour réaffecter des fragments (vous pouvez toujours l'activer une fois que tout est dit et fait):
curl -XPUT http://localhost:9200/_cluster/settings -d '
{
"transient" : {
"cluster.routing.allocation.enable": true
}
}'
Maintenant, asseyez-vous et regardez le cluster nettoyer les fragments de répliques non attribués. Si vous souhaitez que cela prenne effet avec les index futurs, n'oubliez pas de modifier le fichier elasticsearch.yml avec le paramètre suivant et de faire rebondir le cluster:
index.number_of_replicas: 0
La seule chose qui a fonctionné pour moi a été de changer le nombre de répliques (j'avais 2 répliques, alors je l'ai changé en 1, puis de nouveau en 2).
Premier:
PUT /myindex/_settings
{
"index" : {
"number_of_replicas" : 1
}
}
Ensuite:
PUT /myindex/_settings
{
"index" : {
"number_of_replicas" : 2
}
}
Les deux premiers points de la réponse d'Alcanzar l'ont fait pour moi, mais je devais ajouter
"allow_primary" : true
ainsi
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
}
}
]
}'
Avec les nouvelles versions ES, cela devrait faire l'affaire (exécuté dans Kibana DevTools):
PUT /_cluster/settings
{
"transient" : {
"cluster.routing.rebalance.enable" : "all"
}
}
Cependant, cela ne résoudra pas la cause première. Dans mon cas, il y avait beaucoup de fragments non attribués car la taille du réplica par défaut était de 1, mais en réalité je n'utilisais qu'un seul nœud. J'ai donc ajouté à ma elasticsearch.yml
cette ligne:
index.number_of_replicas: 0