Skip to content

Commit 1f7e146

Browse files
committed
my 2 cents
1 parent bf493cf commit 1f7e146

File tree

1 file changed

+27
-27
lines changed

1 file changed

+27
-27
lines changed

_posts/2012-08-21-au-coeur-d-elasticsearch.markdown

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ title: Au coeur d'ElasticSearch
44
author: filirom1
55
tags: [index, elasticsearch, lucene]
66
---
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:
88

99
<p class="center">
1010
<img src="/public/img/2012-08-21-au-coeur-d-elasticsearch/eslogo.png" border="0" />
@@ -14,25 +14,25 @@ Au cœur d'[ElasticSearch](http://www.elasticsearch.org/) il y a le moteur d'ind
1414

1515
## Analyser
1616

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.
1818

1919
Prenons une phrase :
2020

2121
Doc1 = 'Road to a Distributed Search Engine'.
2222

2323

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
2525

2626
[Transformons la en minuscule](http://www.elasticsearch.org/guide/reference/index-modules/analysis/lowercase-tokenizer.html) : Doc1 = 'road to a distributed search engine'
2727

2828
[Enlevons les mots de liaisons](http://www.elasticsearch.org/guide/reference/index-modules/analysis/stop-tokenfilter.html) : Doc1 = 'road distributed search engine'
2929

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 :
3131

3232
* [enlever les balises HTML présentes](http://www.elasticsearch.org/guide/reference/index-modules/analysis/htmlstrip-charfilter.html)
3333
* [remplacer certains mots par un synonyme](http://www.elasticsearch.org/guide/reference/index-modules/analysis/synonym-tokenfilter.html)
3434
* [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)
3636
* Supprimer les numéros de carte bancaire à l'aide d'une expression régulière.
3737

3838
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
4242

4343
## Index Inversé
4444

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é.
4646

4747
[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'):
4848

@@ -83,7 +83,7 @@ Les IDs des documents nous sont retournés.
8383

8484
## Indexer != Stocker
8585

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é.
8787

8888
Storage:
8989

@@ -101,14 +101,14 @@ Mais le fait de stocker le document en plus de l'index est couteux en mémoire.
101101

102102
## Requêtes et Analysers
103103

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'.
105105

106106
Si nous recherchons les mots initiaux dans l'index inversé, nous n'obtiendrons aucun résultat:
107107

108108
Get from index: "Road" => {}
109109
Get from index: "Distributed" => {}
110110

111-
Les mots avaient été indexé en minuscule.
111+
Les mots avaient été indexés en minuscule.
112112

113113
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.
114114

@@ -148,7 +148,7 @@ Mais ce n'est rien comparé à ce que Lucene est capable de faire.
148148
## Lucene
149149

150150
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.
152152

153153
### Indexation d'un objet
154154

@@ -168,8 +168,8 @@ Mais en réalité Lucene permet d'indexer des objets complexes, et faire des rec
168168
"anArray": ["tata", "toto", "titi"]
169169
}
170170

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.
173173

174174

175175
### Structuration des fichiers Lucene
@@ -196,21 +196,21 @@ Une base Lucene est constituée d'un certain nombre de [fichiers](http://lucene.
196196
* .tii : Fichier complètement chargé en mémoire qui permettra de lire le fichier .tis
197197
* .tis : Dictionnaire des termes
198198

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).
200200

201201
[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:
202202

203203
* Donner de l'importance à certains champs
204204
* 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
206206
* Prendre en compte la longueur du texte
207207

208208

209209
### Notion de segments
210210

211211
La structure des fichiers Lucene est complexe mais elle permet de garantir de bonnes performances de recherche et d'indexation.
212212

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.
214214

215215
Tout ajout de données sera fait dans un nouveau segment.
216216

@@ -220,7 +220,7 @@ Lorsque le nombre de segments devient trop important, il devient nécessaire de
220220

221221
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.
222222

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)
224224

225225
$ ls -lh *.tis
226226
-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.
269269
ElasticSearch est une solution permettant de distribuer Lucene sur plusieurs serveurs et d'interagir avec via une API REST.
270270

271271

272-
### Mécanisme de tolérances aux pannes: Translog
272+
### Mécanisme de tolérance aux pannes: Translog
273273

274274
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.
275275

276276
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/).
277277

278278
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.
279279

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.
281281

282282
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.
283283

@@ -308,7 +308,7 @@ Lorsque l'on interroge un index ElasticSearch, on interroge un nœud en particul
308308
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).
309309

310310

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).
312312

313313
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.
314314
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
317317

318318
#### Ajout d'un nœud
319319

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.
321321

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.
323323

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 l'on bloque Lucene pour finaliser le changement.
325325

326326
<http://es-cn.medcl.net/guide/concepts/scaling-lucene/transaction-log/>
327327

@@ -354,7 +354,7 @@ Un réplica est simplement une copie d'un shard.
354354
On distingue donc les shards primaires des réplicas.
355355
Les shards primaires et les réplicas répondent aux recherches ce qui permet d'améliorer les performances.
356356

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.
358358

359359
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.
360360

@@ -363,7 +363,7 @@ En cas d'indexation concurrente de la même donnée (mise à jour de la donnée)
363363

364364
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).
365365

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)).
367367

368368
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.
369369

@@ -407,18 +407,18 @@ Chaque nœud ping le nœud maître, et si le maître ne répond plus [pendant un
407407

408408
### ElasticSearch et le CAP
409409

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).
411411
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.
412412

413413
Par défaut ElasticSearch a choisi de privilégier la cohérence des données.
414414

415415
#### Sans partitionnement
416416

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.
418418

419419
Sans partitionnement ElasticSearch a donc choisi la cohérence des données au détriment de la latence.
420420

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)
422422

423423

424424
#### Avec partionnement

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy