Skip to content

Category archive for: Astuces

Elasticsearch : MasterNotDiscoveredException et discovery.zen.minimum_master_nodes

elasticsearch-logo-icon-lg
On ne présente plus Elasticsearch, ce moteur de recherche open source distribué et surtout très accessible.

Elasticsearch est très simple à mettre en oeuvre et à utiliser, mais la mise en place d’un cluster peut tout de même poser problème, en particulier pour la gestion du « master node ».

Le master node est le noeud du cluster qui est chargé de l’allocation des « shards » parmi les différents noeuds. Il est donc important qu’à un instant T, il y ait un et un seul master node.

————— Les master nodes et le split-brain —————

Imaginons qu’une interruption réseau empêche temporairement les noeuds de votre cluster de communiquer entre eux.
Certains noeuds ne pouvant plus parler au « master node » vont déclencher spontanément l’élection d’un nouveau master.

Le résultat de cette élection sera ce qu’on appelle un split-brain : le cluster se trouve séparé en deux avec deux « master node » différents (et donc une désynchronisation des indexations).

Il s’agit bien sûr d’une situation à éviter absolument. Heureusement, il existe une solution : modifier le paramètre discovery.zen.minimum_master_nodes, défini de la manière suivante :

The discovery.zen.minimum_master_nodes allows to control the minimum number of master eligible nodes a node should « see » in order to operate within the cluster.

La solution au « split-brain » consiste donc à définir discovery.zen.minimum_master_nodes avec le nombre de noeuds du cluster / 2 + 1. S’il y a 8 noeuds dans votre cluster, vous renseignerez alors cette valeur à 5.
Ainsi, 5 noeuds votants sont nécessaires à l’élection d’un nouveau master. 2 machines ne peuvent donc pas obtenir suffisamment de votes pour être élues en simultané.

————— MasterNotDiscoveredException —————

Voilà, tout va pour le mieux dans le meilleur des mondes, votre cluster fonctionne et … vous souhaitez déconnecter une partie de vos noeuds.

Imaginons que nous ayons 8 noeuds sur notre cluster et que nous souhaitions passer sur 4 noeuds. Le paramètre discovery.zen.minimum_master_nodes de départ vaut 5.

Il faut alors modifier à nouveau le paramètre discovery.zen.minimum_master_nodes pour prendre en compte le nouveau nombre de noeuds nécessaires à l’élection (4 / 2 + 1, donc 3). Cette modification peut s’effectuer avec curl via l’API settings :

curl -XPUT localhost:9200/_cluster/settings -d '{
    "persistent" : {
        "discovery.zen.minimum_master_nodes" : 3
    }
}'

Voilà. Si on stoppe maintenant nos noeuds, le cluster continuera de tourner, n’est-ce pas ?
Oui … seulement si on ne coupe pas le master.

Si jamais le master node fait partie des noeuds arrêtés, les requêtes que vous effectuerez retourneront MasterNotDiscoveredException :

curl -XGET "http://localhost:9200/_cluster/health?pretty=true"
{
  "error" : "MasterNotDiscoveredException[waited for [30s]]",
  "status" : 503
}

————— Mais que se passe-t-il ? —————

Résumons :

  • Notre cluster comprenait 8 noeuds
  • Le « discovery.zen.minimum_master_nodes » vaut 5
  • Nous souhaitons passer à 4 noeuds
  • Nous avons modifié le « discovery.zen.minimum_master_nodes » à 3 (4 / 2 + 1)
  • On stoppe des noeuds quelconques pour se ramener à 4 noeuds => pas de soucis
  • Si le master est parmi les noeuds stoppés => MasterNotDiscoveredException

Tout se passe comme si le cluster n’appliquait plus le bon quota, puisqu’un nouveau master n’a pas été élu.

Voici mon analyse du problème :

  • La modification dynamique du paramètre « discovery.zen.minimum_master_nodes » via l’API « /_cluster/settings » est prise en compte par le master. C’est lui qui est chargé de redispatcher ce paramètre entre les noeuds
  • Si le master est stoppé, il ne peut plus servir de référence pour les paramètres dynamiques « /_cluster/settings », les noeuds utilisent donc le paramétrage par défaut (issu du elasticsearch.yml)

Bref, dans la mesure du possible, il est préférable de passer par le elasticsearch.yml pour modifier le « discovery.zen.minimum_master_nodes ».

Sikuli : faire des macros avec des captures d’écran

Voici un outil impressionnant et utile : SIKULI.

Sikuli est un outil de création de script d’automatisation et de test d’IHMs basé sur des captures d’écran.

Sikuli automatise tout ce que vous pouvez voir à l’écran sans utiliser d’API interne du système.
Vous pouvez contrôler une page web, une application Windows/Linux/OS X ou encore une appli iphone ou android via VNC.

Le plus simple pour bien comprendre est de regarder une démo :

Sikuli est un projet de recherche open source développé au User Interface Design Group du MIT Computer Science and Artificial Intelligence Laboratory (CSAIL) .

[Project SIKULI ]

Jongler avec les backslashes dans les regexps Java

Un des gros problèmes lorsqu’on utilise des regexp en Java est que le backslash doit être quadruplé.

En effet, pour représenter un backslash dans une String, il faut le doubler (échappement). De plus, ce caractère doit aussi être échappé dans une regexp ce qui nous amène à un total de 4 backslashes au lieu d’un.

Il existe cependant une méthode qui peut grandement vous simplifier la tâche :

Pattern.quote(String)

Cette méthode se charge d’échapper tous les caractères spéciaux liés aux regexps. Par exemple, pour séparer une chaîne contenant des « – » :

String[] result = "a-b-c-d".split(Pattern.quote("-"));

Dans le cas des backslashes, il faut toujours les doubler dans la chaîne mais ça reste plus compréhensible.

Se déconnecter à distance de GMail

Si un soir vous rentrez chez vous et que vous vous demandez si vous n’avez pas laissé votre compte GMail ouvert dans un autre navigateur, par exemple au travail, voici l’astuce qu’il vous faut.

  • Depuis la boîte de réception GMail, suivez le lien “Details”, situé en bas de page à côté de “Last Account Activity”.

gmaildetails

  • Dans la popup qui s’ouvre, vous trouverez le lien qui vous sauvera, nommé : “Sign out of all other sessions”.

signout

Bonus : vous savez d’où viennent les derniers accès à votre compte

[ Quick Tip: Remotely Log Out of Gmail ]