Le moteur de recherche Elasticsearch permet d’utiliser des aliases afin de faire référence à des indexes existants. Cela permet notamment d’ajouter des indexes Elasticsearch différents des indexes en cours et de pouvoir changer rapidement à chaud d’index sans interruption de service.
Notre application appèle l’index fruit. Grâce à l’alias, on pointe sur la version du 3 août. Nous effectuons une réindexation à chaud mais créons l’alias fruit_20150806, correspondant à la date du jourA la fin de notre processus, nous pouvons demander à Elasticsearch de migrer cet alias sur le nouvel index
Dans certains processus de mises à jour automatiques il peut être intéressant de vérifier qu’il n’y a pas eu d’échec de suppression de l’ancien alias. Celui-ci peut causer un doublon pouvant poser de gros soucis.
Je vous propose la sonde en python suivante permettant de lister les indexes Elasticsearch présents sur votre cluster et vérifiant qu’ils sont bien uniques. Elle est sous licence BSD 2 clauses
#! /usr/bin/python
import getopt, sys, json
import urllib2
PROG_NAME = "check_els_indexes"
def doELSVerification(url):
req = urllib2.Request(url)
response = urllib2.urlopen(req)
jsonresp = json.loads(response.read())
# Count all elasticsearch server aliases
elsAliases = {}
for index in jsonresp:
if "aliases" in jsonresp[index]:
for idx in jsonresp[index]["aliases"]:
elsAliases["%s" % idx] = elsAliases["%s" % idx] + 1 if idx in elsAliases else 1
# Filter aliases to show only problematic aliases
filteredAliases = []
for alias in elsAliases:
if elsAliases[alias] > 1:
filteredAliases += ["%s (%d occurences)" % (alias, elsAliases[alias]), ]
# Do error message
if len(filteredAliases) > 0:
print "Some aliases are duplicated: %s" % ", ".join(filteredAliases)
return 2
else:
print "No duplicate alias occurence found"
return 0
if __name__ == "__main__":
try:
host = None
port = None
index = None
opts, args = getopt.getopt(sys.argv[1:], "h:p:", ["host=", "port="])
for o, a in opts:
if o in ("-h", "--host"):
host = a
elif o in ("-p", "--port"):
port = a
except getopt.GetoptError:
print "Invalid options passed to %s" % PROG_NAME
sys.exit(3)
if host == None:
print "No option --host given for %s, aborting" % PROG_NAME
sys.exit(3)
if port == None:
print "No option --port given for %s, aborting" % PROG_NAME
sys.exit(3)
els_alias_url = "http://%s:%s/_alias/*" % (host, port)
elsStatus = doELSVerification(els_alias_url)
sys.exit(elsStatus)
Vous pourrez la retrouver sur github ici.