You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _posts/2012-08-21-au-coeur-d-elasticsearch.markdown
+27-27Lines changed: 27 additions & 27 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ title: Au coeur d'ElasticSearch
4
4
author: filirom1
5
5
tags: [index, elasticsearch, lucene]
6
6
---
7
-
Au cœur d'[ElasticSearch](http://www.elasticsearch.org/) il y a le moteur d'indexation [Lucene](http://lucene.apache.org/), et autours de Lucene il y a plusieurs mécanismes afin de rendre le système scalable et tolèrent aux pannes. Commençons par comprendre comment Lucene fonctionne, et nous finirons par les mécanismes de distributions et de tolérances aux pannes mis en place dans ElasticSearch:
7
+
Au cœur d'[ElasticSearch](http://www.elasticsearch.org/) il y a le moteur d'indexation [Lucene](http://lucene.apache.org/), et autour de Lucene il y a plusieurs mécanismes afin de rendre le système scalable et tolérant aux pannes. Commençons par comprendre comment Lucene fonctionne, et nous finirons par les mécanismes de distribution et de tolérance aux pannes mis en place dans ElasticSearch:
@@ -14,25 +14,25 @@ Au cœur d'[ElasticSearch](http://www.elasticsearch.org/) il y a le moteur d'ind
14
14
15
15
## Analyser
16
16
17
-
Pour comprendre Lucene, il faut comprendre ce qui se passe lorsque l'on index un texte.
17
+
Pour comprendre Lucene, il faut comprendre ce qui se passe lorsque l'on indexe un texte.
18
18
19
19
Prenons une phrase :
20
20
21
21
Doc1 = 'Road to a Distributed Search Engine'.
22
22
23
23
24
-
Avant d'indexer cette phrase nous allons lui faire subir quelques modifications
24
+
Avant d'indexer cette phrase Lucène lui faire subir quelques modifications
25
25
26
26
[Transformons la en minuscule](http://www.elasticsearch.org/guide/reference/index-modules/analysis/lowercase-tokenizer.html) : Doc1 = 'road to a distributed search engine'
27
27
28
28
[Enlevons les mots de liaisons](http://www.elasticsearch.org/guide/reference/index-modules/analysis/stop-tokenfilter.html) : Doc1 = 'road distributed search engine'
29
29
30
-
Ce type d'analyse est très basique mais nous pourrions imaginer des choses plus complexe :
30
+
Ce type d'analyse est très basique mais nous pourrions imaginer des choses plus complexes :
31
31
32
32
*[enlever les balises HTML présentes](http://www.elasticsearch.org/guide/reference/index-modules/analysis/htmlstrip-charfilter.html)
33
33
*[remplacer certains mots par un synonyme](http://www.elasticsearch.org/guide/reference/index-modules/analysis/synonym-tokenfilter.html)
34
34
*[remplacer les mots par un équivalent phonétique](http://www.elasticsearch.org/guide/reference/index-modules/analysis/phonetic-tokenfilter.html)
35
-
*[remplacer les mots par leur racine](http://www.elasticsearch.org/guide/reference/index-modules/analysis/stemmer-tokenfilter.html)
35
+
*[remplacer les mots par leurs racines](http://www.elasticsearch.org/guide/reference/index-modules/analysis/stemmer-tokenfilter.html)
36
36
* Supprimer les numéros de carte bancaire à l'aide d'une expression régulière.
37
37
38
38
Vous aurez compris que le rôle des `Analyser` est de transformer un texte avant l'indexation.
@@ -42,7 +42,7 @@ NB: avec ElasticSearch il est possible de [tester les Analysers simplement](http
42
42
43
43
## Index Inversé
44
44
45
-
Une fois le texte analysé et transformé, il faut maintenant le stocker dans une structure de donnée: l'index inversé.
45
+
Une fois le texte analysé et transformé, il faut maintenant le stocker dans une structure de données: l'index inversé.
46
46
47
47
[Créons un index inversé](http://fr.wikipedia.org/wiki/Index_invers%C3%A9) à partir du document précédent après analyse (Doc1 = 'road distributed search engine'):
48
48
@@ -83,7 +83,7 @@ Les IDs des documents nous sont retournés.
83
83
84
84
## Indexer != Stocker
85
85
86
-
Si nous souhaitons que se soit le document et non l'ID qui soit retourné, il faut stocker le document à côté.
86
+
Si nous souhaitons que ce soit le document et non l'ID qui soit retourné, il faut stocker le document à côté.
87
87
88
88
Storage:
89
89
@@ -101,14 +101,14 @@ Mais le fait de stocker le document en plus de l'index est couteux en mémoire.
101
101
102
102
## Requêtes et Analysers
103
103
104
-
Lors de l'indexation du premier document : 'Road to a Distributed Search Engine', seulement les mots suivant avait été indexé 'road distributed search engine'.
104
+
Lors de l'indexation du premier document : 'Road to a Distributed Search Engine', seulement les mots suivant avaient été indexés 'road distributed search engine'.
105
105
106
106
Si nous recherchons les mots initiaux dans l'index inversé, nous n'obtiendrons aucun résultat:
107
107
108
108
Get from index: "Road" => {}
109
109
Get from index: "Distributed" => {}
110
110
111
-
Les mots avaient été indexé en minuscule.
111
+
Les mots avaient été indexés en minuscule.
112
112
113
113
Il est donc important d'appliquer les mêmes Analysers pour l'indexation et la recherche. C'est le comportement par défaut dans ElasticSearch.
114
114
@@ -148,7 +148,7 @@ Mais ce n'est rien comparé à ce que Lucene est capable de faire.
148
148
## Lucene
149
149
150
150
Nous venons de voir les bases d'un moteur d'indexation.
151
-
Lucene est un moteur d'indexation écrit en Java qui supporte l'ensemble des fonctionnalités vu précédemment et bien plus encore.
151
+
Lucene est un moteur d'indexation écrit en Java qui supporte l'ensemble des fonctionnalités vues précédemment et bien plus encore.
152
152
153
153
### Indexation d'un objet
154
154
@@ -168,8 +168,8 @@ Mais en réalité Lucene permet d'indexer des objets complexes, et faire des rec
168
168
"anArray": ["tata", "toto", "titi"]
169
169
}
170
170
171
-
Lucene permet d'indexer du texte mais pas que; il permet aussi d'indexer des nombres, des tableaux, des objets de géo-distances, ...
172
-
Voici la liste des [types primitifs](http://lucene.apache.org/core/3_6_1/fileformats.html#Primitive Types) indexable dans Lucene.
171
+
Lucene permet d'indexer du texte mais pas seulement; il permet aussi d'indexer des nombres, des tableaux, des objets de géo-distances, ...
172
+
Voici la liste des [types primitifs](http://lucene.apache.org/core/3_6_1/fileformats.html#Primitive Types) indexables dans Lucene.
173
173
174
174
175
175
### Structuration des fichiers Lucene
@@ -196,21 +196,21 @@ Une base Lucene est constituée d'un certain nombre de [fichiers](http://lucene.
196
196
* .tii : Fichier complètement chargé en mémoire qui permettra de lire le fichier .tis
197
197
* .tis : Dictionnaire des termes
198
198
199
-
Si le nombre de fichier ouvert devient trop important (supérieur à la limite indiquée par 'ulimit -n' ) il est possible de grouper la plupart de ces fichiers: [compound_format avec ElasticSearch](http://www.elasticsearch.org/guide/reference/index-modules/index.html).
199
+
Si le nombre de fichiers ouverts devient trop important (supérieur à la limite indiquée par 'ulimit -n' ) il est possible de grouper la plupart de ces fichiers: [compound_format avec ElasticSearch](http://www.elasticsearch.org/guide/reference/index-modules/index.html).
200
200
201
201
[Un aperçu du format des fichiers Lucene](http://lucene.apache.org/core/3_6_1/fileformats.html#Overview) nous permet de comprendre les possibilités offertes par Lucene:
202
202
203
203
* Donner de l'importance à certains champs
204
204
* Prendre en compte la proximité des mots lors de la recherche
205
-
* Prendre en compte le nombre d'occurrence d'un mot dans un texte
205
+
* Prendre en compte le nombre d'occurrences d'un mot dans un texte
206
206
* Prendre en compte la longueur du texte
207
207
208
208
209
209
### Notion de segments
210
210
211
211
La structure des fichiers Lucene est complexe mais elle permet de garantir de bonnes performances de recherche et d'indexation.
212
212
213
-
Ces fichiers qui constituent [un segment](http://lucene.apache.org/core/3_6_0/fileformats.html#Segments) sont immuables, c'est à dire, il n'est pas possible de les modifier.
213
+
Ces fichiers qui constituent [un segment](http://lucene.apache.org/core/3_6_0/fileformats.html#Segments) sont immuables, c'est-à-dire qu'il n'est pas possible de les modifier.
214
214
215
215
Tout ajout de données sera fait dans un nouveau segment.
216
216
@@ -220,7 +220,7 @@ Lorsque le nombre de segments devient trop important, il devient nécessaire de
220
220
221
221
Lorsqu'un document doit être supprimé, le segment n'est pas modifié, une entrée est ajoutée dans un autre fichier afin d'ignorer ce document pendant les recherches. Pendant les merges, les documents marqués comme à supprimer sont enlevés.
222
222
223
-
Dans cet exemple je liste les différents segments trouvé dans un index Lucene (en n'affichant que les .tis)
223
+
Dans cet exemple je liste les différents segments trouvés dans un index Lucene (en n'affichant que les .tis)
224
224
225
225
$ ls -lh *.tis
226
226
-rw------- 1 www server 20M Jul 19 18:17 _1a.tis
@@ -269,15 +269,15 @@ C'est pour cela qu'il est préférable de le faire [périodiquement](http://www.
269
269
ElasticSearch est une solution permettant de distribuer Lucene sur plusieurs serveurs et d'interagir avec via une API REST.
270
270
271
271
272
-
### Mécanisme de tolérances aux pannes: Translog
272
+
### Mécanisme de tolérance aux pannes: Translog
273
273
274
274
Nous avons vu précédemment que la création de segment est bufferisée en RAM. Mais que se passe-t-il s'il y a une coupure de courant à ce moment-là ? Toute la donnée en RAM est perdue.
275
275
276
276
Pour pallier à ce problème-là, ElasticSearch utilise un [WAL (Write Ahead Log)](http://en.wikipedia.org/wiki/Write-ahead_logging) ou [Translog (Transaction Log)](http://es-cn.medcl.net/guide/concepts/scaling-lucene/transaction-log/).
277
277
278
278
La donnée est d'abord écrite dans un fichier de log avant d'être indexée en RAM. Lorsqu'un commit est effectué pour persister la donnée en RAM, l'ancien Translog est supprimé, et un nouveau est utilisé à la place.
279
279
280
-
Ainsi, si une coupure de courant à lieu lorsque des données sont en RAM, au redémarrage, ElasticSearch charge en RAM le contenu du Translog. Ainsi, le nœud se retrouve dans le même état qu'avant.
280
+
Ainsi, si une coupure de courant a lieu lorsque des données sont en RAM, au redémarrage, ElasticSearch charge en RAM le contenu du Translog. Ainsi, le nœud se retrouve dans le même état qu'avant.
281
281
282
282
ElasticSearch a des [options](http://www.elasticsearch.org/guide/reference/index-modules/Translog.html) pour configurer la fréquence des commits en fonction de l'état du Translog.
283
283
@@ -308,7 +308,7 @@ Lorsque l'on interroge un index ElasticSearch, on interroge un nœud en particul
308
308
Avoir beaucoup de shards implique interroger beaucoup de serveurs à chaque requête ce qui peut fortement augmenter la latence. Pour éviter cela, il est possible d'interroger seulement certains nœuds [suivant des critères](http://www.elasticsearch.org/guide/reference/api/search/preference.html). Une autre technique consiste à créer beaucoup d'index, par exemple un index par jours, et de faire [des requêtes sur un groupement d'index](http://www.elasticsearch.org/guide/reference/api/multi-index.html).
309
309
310
310
311
-
Lorsque l'on index une nouvelle donnée dans ElasticSearch, on lui [spécifie un index, un type, et un ID](http://www.elasticsearch.org/guide/reference/api/index_.html).
311
+
Lorsque l'on indexe une nouvelle donnée dans ElasticSearch, on lui [spécifie un index, un type, et un ID](http://www.elasticsearch.org/guide/reference/api/index_.html).
312
312
313
313
C'est à partir d'un hash sur le type et sur l'ID que l'on va définir quel shard lui sera attribué (shard = HASH(type, id) MOD nodes ). L'ID étant unique la répartition sur les shards est relativement uniforme.
314
314
Il est également possible de forcer l'emplacement de la donnée sur un nœud en fonction de [plusieurs](http://www.elasticsearch.org/guide/reference/modules/cluster.html)[critère](http://www.elasticsearch.org/guide/reference/api/index_.html#Parents & Children)[s](http://www.elasticsearch.org/guide/reference/api/index_.html#Routing).
@@ -317,11 +317,11 @@ Il est également possible de forcer l'emplacement de la donnée sur un nœud en
317
317
318
318
#### Ajout d'un nœud
319
319
320
-
Lorsque l'on ajoute un nœud, ElasticSearch va répartir ses shards de manière équilibrés sur l'ensemble des machines disponibles. C'est ce qu'ElasticSearch appelle du rebalancing.
320
+
Lorsque l'on ajoute un nœud, ElasticSearch va répartir ses shards de manière équilibrée sur l'ensemble des machines disponibles. C'est ce qu'ElasticSearch appelle du rebalancing.
321
321
322
-
Pendant la phase de rebalancing, lorsque l'on veut déplacer un shard d'un nœud A à un nœud B, ElasticSearch ne va pas supprimer les segments, il va désactiver les flushs et ainsi empêcher les commits Lucene de se faire. Le shard en cours de rebalancing n'est pas bloqué, les opérations sur ce shard sont simplement écrites dans le Translog, indexé en RAM mais pas persisté. Lorsque le transfert du shard est terminé (tous les segments Lucene ont été copié) le Translog est rejoué sur le nouveau nœud, puis ensuite est effectué le changement.
322
+
Pendant la phase de rebalancing, lorsque l'on veut déplacer un shard d'un nœud A à un nœud B, ElasticSearch ne va pas supprimer les segments, il va désactiver les flushs et ainsi empêcher les commits Lucene de se faire. Le shard en cours de rebalancing n'est pas bloqué, les opérations sur ce shard sont simplement écrites dans le Translog, indexé en RAM mais pas persisté. Lorsque le transfert du shard est terminé (tous les segments Lucene ont été copié) le Translog est rejoué sur le nouveau nœud.
323
323
324
-
Pendant tout le temps de rebalancing, on peut continuer à indexer et rechercher de la donnée, il y a seulement une courte période de temps ou l'on bloque Lucene pour finaliser le changement.
324
+
Pendant tout le temps de rebalancing, on peut continuer à indexer et rechercher de la donnée, il y a seulement une courte période de temps où l'on bloque Lucene pour finaliser le changement.
@@ -354,7 +354,7 @@ Un réplica est simplement une copie d'un shard.
354
354
On distingue donc les shards primaires des réplicas.
355
355
Les shards primaires et les réplicas répondent aux recherches ce qui permet d'améliorer les performances.
356
356
357
-
Par contre, lors de l'indexation d'une nouvelle données, c'est le shard primaire qui récupère la requête d'indexation, index la donnée en locale et transfert la requête d'indexation aux réplicas. Chaque shards (primaire et réplicas) index la donnée.
357
+
Par contre, lors de l'indexation d'une nouvelle données, c'est le shard primaire qui récupère la requête d'indexation, index la donnée en locale et transfert la requête d'indexation aux réplicas. Chaque shard (primaire et réplicas) indexe la donnée.
358
358
359
359
En cas d'indexation concurrente de la même donnée (mise à jour de la donnée), il se peut que l'ordre d'indexation entre les shards ne soit pas le même. C'est pour cela qu'ElasticSearch propose de [versionner les documents indexés afin de détecter les incohérences](http://www.elasticsearch.org/blog/2011/02/08/versioning.html) pendant les mises à jour.
360
360
@@ -363,7 +363,7 @@ En cas d'indexation concurrente de la même donnée (mise à jour de la donnée)
363
363
364
364
Si le shard primaire tombe, un [réplica sera choisi pour devenir le shard primaire](http://elasticsearch-users.115913.n3.nabble.com/How-does-a-recovering-node-validate-any-shard-information-data-during-recover-td3215028.html).
365
365
366
-
C'est le rôle du [timeout](http://www.elasticsearch.org/guide/reference/api/index_.html#Timeout) de faire patienter la requête pendant 1 minute le temps qu'un shard primaire soit accessible, et que les autres replicas soit présent ([réglable](http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings.html)).
366
+
C'est le rôle du [timeout](http://www.elasticsearch.org/guide/reference/api/index_.html#Timeout) de faire patienter la requête pendant 1 minute le temps qu'un shard primaire soit accessible, et que les autres replicas soit présents ([réglable](http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings.html)).
367
367
368
368
Un nouveau réplica va être créé sur un autre nœud en faisant une copie des donnés du shard primaire, et ainsi le mécanisme d'indexation pourra reprendre son cours.
369
369
@@ -407,18 +407,18 @@ Chaque nœud ping le nœud maître, et si le maître ne répond plus [pendant un
407
407
408
408
### ElasticSearch et le CAP
409
409
410
-
Chaque système distribué est régie par [le théorème du CAP](http://en.wikipedia.org/wiki/CAP_theorem).
410
+
Chaque système distribué est régi par [le théorème du CAP](http://en.wikipedia.org/wiki/CAP_theorem).
411
411
Historiquement ce théorème simplifie les systèmes distribués afin de faire comprendre que parmi les 3 contraintes suivantes seulement 2 pourront être satisfaites : la cohérence des données, la disponibilité, la tolérance au partitionnement.
412
412
413
413
Par défaut ElasticSearch a choisi de privilégier la cohérence des données.
414
414
415
415
#### Sans partitionnement
416
416
417
-
Par défaut ElasticSearch attend avant de répondre à une requête d'indexation que [un certain nombre de réplicas](http://www.elasticsearch.org/guide/reference/api/index_.html#Write Consistency) aient indexé la donnée. C'est ce que l'on appelle une réplication synchrone.
417
+
Par défaut ElasticSearch attend avant de répondre à une requête d'indexation qu'[un certain nombre de réplicas](http://www.elasticsearch.org/guide/reference/api/index_.html#Write Consistency) aient indexé la donnée. C'est ce que l'on appelle une réplication synchrone.
418
418
419
419
Sans partitionnement ElasticSearch a donc choisi la cohérence des données au détriment de la latence.
420
420
421
-
Mais sachez que la réplication peut être [configurée en asynchrone afin de favoriser la latence](http://www.elasticsearch.org/guide/reference/api/index_.html#Asynchronous réplication)
421
+
Mais la réplication peut être [configurée en asynchrone afin de favoriser la latence](http://www.elasticsearch.org/guide/reference/api/index_.html#Asynchronous réplication)
0 commit comments