l'indexation et la performance ElasticSearch optimisation de la requête 21 recommandations

recommandations de déploiement ElasticSearch

1. Sélectionnez la configuration matérielle du son: Chaque fois que possible, utilisez SSD

ElasticSearch souvent le plus grand goulot d' étranglement est le lecture de disque et les performances d' écriture, en particulier les performances de lecture aléatoire. L' utilisation SSD (PCI-E Interface Card SSD / SATA interface SSD) est généralement plus élevé que le disque dur mécanique (SATA disque / disque SAS) 5 à 10 fois plus rapide recherche de vitesse, les performances en écriture n'est pas évidente.
Pour connaître les exigences de performance plus élevés de documents scène de classe de requête de récupération, il est recommandé d'envisager SSD comme le stockage, la mémoire et le disque dur configuré en même temps selon le rapport de 1:10. Pour une analyse requête classe journal exige scénario moins compliqué, pourrait être considéré comme le stockage sur le disque dur mécanique, la mémoire et le disque dur alors que la configuration en fonction du rapport de 01:50. données stockées nœud unique dans le recommandé 2To, pas plus de 5 To, pour éviter les requêtes lentes, l' instabilité du système.

2. Accordez la configuration machine virtuelle Java de la machine la moitié de la mémoire, mais ne recommande pas plus de 32G

Modifier conf / configuration jvm.options et -Xmx -Xms fixés à la même valeur est fixée à environ la moitié de la mémoire de la machine recommandée, en laissant la moitié restante du système d'exploitation à l'aide du cache. la mémoire machine virtuelle Java est recommandé de ne pas moins de 2G, ou ils peuvent conduire à ES en raison d'une mémoire insuffisante ou d'un débordement de mémoire ne démarre pas correctement, machine virtuelle Java est recommandé de ne pas dépasser 32g, sinon pointeur technologie de compression désactivé objet mémoire JVM, ce qui dans la mémoire gaspillée. Lorsque la mémoire de la machine est supérieure à la mémoire 64G, il configuration recommandée -Xms30g -Xmx30g. La mémoire de machine virtuelle Java est grande, la collecte des ordures de mémoire met en pause une longue période, il est recommandé de configurer ZGC ou algorithme de collecte des ordures G1.

3. à grande échelle la configuration du cluster de nœud maître propriétaire pour éviter de problème de split brain

ElasticSearch nœud du cluster maître responsable de la gestion des méta-informations, ajoutées à l'indice et les suppressions opération, l'ajout de nœuds supprimés, régulièrement diffusé le dernier état à chaque nœud de cluster. Lorsque la taille de cluster, la configuration proposée est seul responsable de la gestion de cluster de nœud maître propriétaire, ne stocke pas les données, lire et écrire des données ne portent pas la pression.

# 专有主节点配置(conf/elasticsearch.yml):
node.master:true
node.data: false
node.ingest:false


# 数据节点配置(conf/elasticsearch.yml):
node.master:false
node.data:true
node.ingest:true

Chaque nœud candidat par défaut ElasticSearch à la fois le nœud maître, et un noeud de données. Le nombre minimum de paramètres minimum_master_nodes nœud maître configuration recommandée est plus de la moitié du nombre de candidats pour le nœud maître, cette configuration ElasticSearch dire quand il n'y a pas assez de temps pour les nœuds candidats maître, sans élections nœud maître, et un autre nœud maître suffit que les élections de conduite.
Par exemple, le groupe 3-noeud, le nombre minimum de noeuds maîtres à partir de la valeur par défaut de 12.

# 最小主节点数量配置(conf/elasticsearch.yml):
discovery.zen.minimum_master_nodes: 2

4. réglage du système d'exploitation Linux

Fermer la partition de swap, pour empêcher l'échange réduit les performances de la mémoire.

# 将/etc/fstab 文件中包含swap的行注释掉
sed -i '/swap/s/^/#/' /etc/fstab
swapoff -a

# 单用户可以打开的最大文件数量,可以设置为官方推荐的65536或更大些
echo "* - nofile 655360" >> /etc/security/limits.conf

# 单用户线程数调大
echo "* - nproc 131072" >> /etc/security/limits.conf

# 单进程可以使用的最大map内存区域数量
echo "vm.max_map_count = 655360" >> /etc/sysctl.conf

# 参数修改立即生效
sysctl -p

performance Index des recommandations de réglage

1. Définissez un nombre raisonnable de la feuille d'index et le nombre de copies fraction

numéro d'index de fragments est recommandé de régler un multiple entier des noeuds de la grappe, le nombre initial de copies de la ligne de données est mis à 0, le nombre de copies de l'environnement de production est de consigne recommandées à 1 (fourni une copie de tout nœud 1 vers le bas données ne sont pas perdues; Paramètres plus de copies prendront plus d' espace de stockage, exploitation taux d' utilisation du cache du système diminuera, améliorer pas nécessairement le rendement de récupération). index un seul nœud nombre de points n'est pas recommandé plus de trois morceaux, chaque fragmentation de l' index recommandé 10-40GB taille, le nombre de paramètres de fragmentation de l' index ne peut pas être modifié, vous pouvez modifier le nombre de copies défini.
Et numéro d'index par défaut Elasticsearch6.X des fragments plus tôt est 5, le nombre de copies à 1, Elasticsearch7.0 a commencé à ajuster l'indice du nombre par défaut de fragments est 1, le nombre de copies est 1.

# 索引设置
curl -XPUT http://localhost:9200/fulltext001?pretty -H 'Content-Type: application/json'   
-d '{
    "settings": {
        "refresh_interval": "30s",
        "merge.policy.max_merged_segment": "1000mb",
        "translog.durability": "async",
        "translog.flush_threshold_size": "2gb",
        "translog.sync_interval": "100s",
        "index": {
            "number_of_shards": "21",
            "number_of_replicas": "0"
        }
    }
}'

# mapping 设置
curl -XPOST http://localhost:9200/fulltext001/doc/_mapping?pretty  -H 'Content-Type: application/json' 
-d '{
    "doc": {
        "_all": {
            "enabled": false
        },
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word"
            },
            "id": {
                "type": "keyword"
            }
        }
    }
}'

# 写入数据示例
curl -XPUT 'http://localhost:9200/fulltext001/doc/1?pretty' -H 'Content-Type: application/json' 
-d '{
    "id": "https://www.huxiu.com/article/215169.html",
    "content": "“娃娃机,迷你KTV,VR体验馆,堪称商场三大标配‘神器’。”一家地处商业中心的大型综合体负责人告诉懂懂笔记,在过去的这几个月里,几乎所有的综合体都“标配”了这三种“设备”…"
}'

# 修改副本数示例
curl -XPUT "http://localhost:9200/fulltext001/_settings" -H 'Content-Type: application/json' 
-d '{
    "number_of_replicas": 1
}'

2. Utilisez une demande de traitement par lots

Utiliser demande de lot entraînera la performance que la demande d'indexation unique document beaucoup mieux. Appelez le lot soumis Interface Lorsque les données sont écrites, il est recommandé de soumettre chaque lot 5 ~ 15 Mo de données. Par exemple, une seule taille d'enregistrement de 1 Ko, chaque lot d'environ 10 000 à soumettre des dossiers d'écrire de meilleures performances, 5KB taille record unique, record soumis à environ 2000 par écriture de lot de meilleures performances.

# 批量请求接口API
curl -XPOST "http://localhost:9200/_bulk" -H 'Content-Type: application/json' 
-d'
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }{ "doc" : {"field2" : "value2"} }'

3. envoyer des données par plusieurs processus / thread

données d'écriture par lots monothread souvent n'utilisent pas pleinement les ressources CPU du serveur, vous pouvez essayer d'ajuster le nombre de threads à écrire ou présenter une demande écrite aux serveurs ElasticSearch sur plusieurs clients. Et Redimensionner par lot une demande similaire, seul un test pour déterminer le nombre optimal de travailleurs. En augmentant progressivement le nombre de tâches à tester sur le cluster jusqu'à ce que E / S ou la saturation du CPU.

4. Le transfert grand intervalle d'actualisation

Dans ElasticSearch, le processus d'écriture et d' ouvrir un nouveau segment léger est appelé rafraîchissement. Chaque tranche sera rafraîchi automatiquement chaque seconde par défaut. Voilà pourquoi nous disons ElasticSearch est proche de recherche en temps réel de: changements dans le document ne sont pas immédiatement visibles à une recherche, mais deviendra visible à l' intérieur d' une seconde.
Tous les cas doivent être régénérés par seconde. Peut-être que vous utilisez l' index ElasticSearch fichiers journaux volumineux, vous pouvez optimiser la vitesse d'indexation au lieu de la recherche en temps quasi réel, vous pouvez définir refresh_interval, réduire le taux de rafraîchissement pour chaque indice.

# 设置 refresh interval API
curl -XPUT "http://localhost:9200/index" -H 'Content-Type: application/json' 
-d'{
    "settings": {
        "refresh_interval": "30s"
    }
}'

refresh_interval peut être effectuée sur l'index existe déjà mis à jour dynamiquement, dans un environnement de production, lorsque vous construisez un grand nouvel indice, vous pouvez désactiver l'auto-rafraîchissement, pour être commencé à utiliser l'index, puis ils sont transférés.

curl -XPUT "http://localhost:9200/index/_settings" -H 'Content-Type: application/json' 
-d'{ "refresh_interval": -1 }'

curl -XPUT "http://localhost:9200/index/_settings" -H 'Content-Type: application/json' 
-d'{ "refresh_interval": "1s" }'

Les paramètres de configuration du journal des transactions

Translogarithmique journal des transactions est utilisé pour prévenir la perte de données lorsqu'un noeud échoue. Il est conçu pour opération de récupération aide tesson, sinon les données peuvent être perdues lors de l'accident de chasse de la mémoire sur le disque. Le disque de chute journal des transactions translog (fsync) ES est effectuée automatiquement en arrière - plan, la valeur par défaut de soumettre le disque toutes les 5 secondes, ou lorsque la taille du fichier translog est supérieure à 512 Mo soumis, ou dans chaque index avec succès, suppression, mise à jour ou d'une demande de traitement par lots soumettre.
Lorsque l'index est créé, vous pouvez régler l'intervalle de rafraîchissement de journal par défaut de 5 secondes, par exemple, a été changé à 60 secondes, index.translog.sync_interval: « 60 ». Après avoir créé l'index, vous pouvez dynamiquement ajuster les paramètres translog, « index.translog.durability »: « async » l'équivalent de l' indice affleurant de synchronisation étroite, les opérations en vrac telles que l' opération translog, utilisez uniquement le défaut mécanisme d'actualisation périodique pour actualiser le seuil de la taille du fichier.

# 动态设置 translog API
curl -XPUT "http://localhost:9200/index" -H 'Content-Type: application/json' 
-d'{
    "settings": {
        "index.translog.durability": "async",
        "translog.flush_threshold_size": "2gb"
    }
}'

6. La conception de la configuration de mappage de type de champ approprié

ElasticSearch lors de la rédaction du document, si l'index spécifié dans la demande n'existe pas, il crée automatiquement un nouvel index, et spéculer sur les types possibles de domaines tels que le contenu du document. Mais cela est souvent le plus efficace, nous pouvons concevoir un type de terrain raisonnables en fonction du scénario d'application.

# 例如写入一条记录
curl -XPUT "http://localhost:9200/twitter/doc/1?pretty" -H 'Content-Type: application/json' 
-d'{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "Trying out Elasticsearch, so far so good?"
}'

Requête mappage d'index ElasticSearch créé automatiquement, vous trouverez le champ POST_DATE est automatiquement reconnu comme un type de date, mais le message et le champ utilisateur est défini au texte, champ redondant mot-clé, ce qui entraîne la vitesse d'écriture inférieure, prendre plus d'espace disque.

{
    "twitter": {
        "mappings": {
            "doc": {
                "properties": {
                    "message": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "post_date": {
                        "type": "date"
                    },
                    "user": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    }
                }
            }
        },
        "settings": {
            "index": {
                "number_of_shards": "5",
                "number_of_replicas": "1"
            }
        }
    }
}

L'indice de configuration de conception de scène d'affaires de nombre raisonnable de fragments, nombre de copies, champ de réglage du type, tokenizer. Si vous n'avez pas besoin de fusionner tous les champs, les champs _all handicapés aux champs de fusion par copy_to.

curl -XPUT "http://localhost:9200/twitter?pretty" -H 'Content-Type: application/json' 
-d'{
    "settings": {
        "index": {
            "number_of_shards": "20",
            "number_of_replicas": "0"
        }
    }
}'

curl -XPOST "http://localhost:9200/twitter/doc/_mapping?pretty" -H 'Content-Type: application/json' 
-d'{
    "doc": {
        "_all": {
            "enabled": false
        },
        "properties": {
            "user": {
                "type": "keyword"
            },
            "post_date": {
                "type": "date"
            },
            "message": {
                "type": "text",
                "analyzer": "cjk"
            }
        }
    }
}'

recommandations de réglage requête

1. Filtre tampon d'antémémoire de requête et le fragment

Par défaut, la requête ElasticSearch retournera calculé le degré de corrélation avec chaque requête de données, mais pour l'indexation en texte intégral des scénarios non-utilisation, les utilisateurs ne se soucient pas de la pertinence des résultats de la requête et l'état de la requête, je veux juste localiser avec précision les données cibles . À ce stade, vous ne pouvez pas laisser passer le filtre pointage ElasticSearch est calculé, et le filtre de mise en cache de jeu de résultats, autant que possible, pour les requêtes ultérieures contiennent le même filtre pour améliorer l'efficacité de la requête.

# 普通查询
curl -XGET "http://localhost:9200/twitter/_search" -H 'Content-Type: application/json' 
-d'{
    "query": {
        "match": {
            "user": "kimchy"
        }
    }
}'

# 过滤器(filter)查询
curl -XGET "http://localhost:9200/twitter/_search" -H 'Content-Type: application/json' 
-d'{
    "query": {
        "bool": {
            "filter": {
                "match": {
                    "user": "kimchy"
                }
            }
        }
    }
}'

Le but est de fragmenter la polymérisation du tampon de cache de requête, les résultats présentés des mots et des coups (il n'a pas les documents de cache retourné, par conséquent, il ne fonctionne que lorsque search_type = nombre).
Par les paramètres suivants, nous pouvons définir la taille du fragment le cache, la taille de la pile par défaut JVM de 1%, nous pouvons être de cours également mis en fichier config / elasticsearch.yml manuellement.

indices.requests.cache.size: 1%

Voir mémoire cache pour le cas de (nom représente le nom de noeud, query_cache représente cache de filtre, request_cache représente la mise en cache fragment, domaine fielddata représente un tampon de données, des segments représente un index de segment).

curl -XGET "http://localhost:9200/_cat/nodes?h=name,query_cache.memory_size,request_cache.memory_size,fielddata.memory_size,segments.memory&v" 

2. Utilisez le routage de routage

Lorsque le document écrit ElasticSearch, il sera acheminé par une formule d'un indice d'une tranche. La formule par défaut est la suivante:

shard_num = hash(_routing) % num_primary_shards

_routingLe champ de valeur, par défaut _idchamp, le champ peut être utilisé comme routage basé sur des scénarios d'affaires ensemble domaine fréquemment sollicités. Par exemple, peut être considéré comme l'ID utilisateur, la région en tant que champ de routage, vous pouvez filtrer la requête de fragmentation inutile, accélérer les requêtes.

# 写入时指定路由
curl -XPUT "http://localhost:9200/my_index/my_type/1?routing=user1" -H 'Content-Type: application/json' 
-d'{
    "title": "This is a document",
    "author": "user1"
}'

# 查询时不指定路由,需要查询所有分片
curl -XGET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' 
-d'{
    "query": {
        "match": {
            "title": "document"
        }
    }
}'

# 返回结果
{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    }
    ... ...
}

# 查询时指定路由,只需要查询1个分片
curl -XGET "http://localhost:9200/my_index/_search?routing=user1" -H 'Content-Type: application/json' 
-d'{
    "query": {
        "match": {
            "title": "document"
        }
    }
}'

# 返回结果
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    }
    ... ...
}

3. fusion obligatoire index en lecture seule aux données d'index historique proche

Lecture seule mémoire permanente de l'indice de masse peut être fusionnés en un seul segment important des revenus, réduire la fragmentation des index et de réduire la machine virtuelle Java. Forcé d'indexer les opérations de fusion consommera beaucoup de disque IO, essayez de configurer un faible pic dans les affaires (par exemple le matin) l'exécution. Si l'indice n'est plus prise en charge par des requêtes de données historiques sur les entreprises, vous pouvez envisager l'indice de clôture, ce qui réduit l'empreinte mémoire JVM.

# 索引forcemerge API
curl -XPOST "http://localhost:9200/abc20180923/_forcemerge?max_num_segments=1"

# 索引关闭API
curl -XPOST "http://localhost:9200/abc2017*/_close"

Configuration Convient tokenizer

ElasticSearch construit beaucoup de lexicaux, y compris la norme, CJC, ngram, etc., peut également être installé à partir de la source lexical de recherche / ouvert. Sélectionnez le mot approprié en fonction de scénarios d'affaires, en évitant tout défaut tokenizer standard.

disjoncteur commun mot:

  • standard: le mot par défaut en anglais sur un point Geqie vide, la segmentation chinois selon les caractères individuels.
  • CJC: selon l'indice binaire mot CJK, nous pouvons garantir le rappel.
  • ngram: lettres anglaises peuvent être coupées en tranches, ES liant expressions de recherche (match_phrase) suivi.
  • IK: le mot chinois plus populaire peut être divisée en fonction sémantique coupe chinoise, vous pouvez personnaliser le dictionnaire.
  • pinyin: permet à l'utilisateur d'entrer dans l'alphabet, vous pouvez trouver des mots clés pertinents.
  • aliws: recherche Alibaba depuis le mot, soutenir une variété de modèles et de l'algorithme de segmentation, thésaurus riche, résultat de la segmentation précise, le fournisseur d'électricité pour les besoins de haute précision comme pour la scène.
# 分词效果测试API
curl -XPOST "http://localhost:9200/_analyze" -H 'Content-Type: application/json' 
-d'{
    "analyzer": "ik_max_word",
    "text": "南京市长江大桥"
}'

5. Configuration de requête agrégateur

Le noeud de particules peut envoyer une polyemeres demande de requête à un autre nœud, pour collecter et fusionner les résultats, et en réponse à la requête du client est émis. Par nœud d'agrégation configuré pour interroger un processeur standard supérieur et de la mémoire, vous pouvez accélérer la vitesse de requête de fonctionnement, d'améliorer le taux de succès de cache.

# 查询聚合节点配置(conf/elasticsearch.yml):
node.master:false
node.data:false
node.ingest:false

6. Réglez le nombre d'enregistrements et la requête lit les champs

La valeur par défaut est généralement les 10 premières requêtes retourne les enregistrements triés, jusqu'à 10.000 enregistrements temps de lecture, la plage de réglage de l'enregistrement par la lecture et les paramètres de taille, afin d'éviter la lecture excessive enregistrée une fois. Le contrôle peut renvoyer des informations champ de paramètres source_, afin d'éviter un grand champ de lecture.

# 查询请求示例
curl -XGET http://localhost:9200/fulltext001/_search?pretty  -H 'Content-Type: application/json' 
-d '{
    "from": 0,
    "size": 10,
    "_source": "id",
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "content": "虎嗅"
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "id": {
                "order": "asc"
            }
        }
    ]
}'

7. Set teminate_after requêtes retour rapide

Si la requête n'a pas besoin de frapper un décompte précis du nombre d'enregistrements, vous pouvez spécifier avec teminate_after correspondre à N enregistre le retour de chaque tesson, définissez le délai d'attente de la requête. Dans les résultats de la requête par « terminated_early » identifie de champ si la fin de la demande de requête à l'avance.

# teminate_after 查询语法示例
curl -XGET "http://localhost:9200/twitter/_search" -H 'Content-Type: application/json' 
-d'{
    "from": 0,
    "size": 10,
    "timeout": "10s",
    "terminate_after": 1000,
    "query": {
        "bool": {
            "filter": {
                "term": {
                    "user": "elastic"
                }
            }
        }
    }
}'

8. Évitez de tourner la profondeur de demande

résultat par défaut ElasticSearch 10000 avant de commander autorisé à voir quand la vue de la page après les enregistrements de tri par la réponse prend généralement plus. Utiliser des requêtes façon search_after sont besoin plus légers, si chacun pour revenir 10 résultats, seulement 10 pour les résultats de tesson pour revenir après search_after, seul le montant total des données renvoyées et le nombre de tesson et il faut le nombre de liés et non liés au nombre de l'histoire qui a été lu.

# search_after查询语法示例
curl -XGET "http://localhost:9200/twitter/_search" -H 'Content-Type: application/json' 
-d'{
    "size": 10,
    "query": {
        "match": {
            "message": "Elasticsearch"
        }
    },
    "sort": [
        {
            "_score": {
                "order": "desc"
            }
        },
        {
            "_id": {
                "order": "asc"
            }
        }
    ],
    "search_after": [
        0.84290016,     //上一次response中某个doc的score
        "1024"          //上一次response中某个doc的id
    ]
}'

9. éviter préfixe de correspondance floue

ElasticSearch support par défaut ? Expression régulière à faire correspondance floue, correspondance floue, si elle est exécutée sur une plus grande échelle la quantité d'index de données, préfixe particulier correspondance floue, prend habituellement sera plus, et peut même conduire à un dépassement de mémoire. Essayez d'éviter d' effectuer de telles opérations dans un environnement de production de demandes de requêtes très simultanées.
A besoins des clients soient des requêtes floues sur le numéro de plaque d'immatriculation, en interrogeant la demande « numéro de plaque d'immatriculation:
A8848 * » requête, mène souvent à la charge de cluster globale. En prétraiter les données, augmentant le champ redondant « plaque d'immatriculation .keyword », et tous les numéros de plaque d'immatriculation à l' avance conformément aux mono- ,, $ 3 ... 7 yuans le mot stocké dans le champ, le contenu de stockage de champ Exemple: Shanghai , A, 8,4, Shanghai A, A8,88,84,48, Shanghai A8 ... A88488. En interrogeant « le numéro de plaque d'immatriculation .keyword: A8848 » peut résoudre le problème de la performance originale.

10. Évitez l'indice de rares

Elasticsearch6.X version précédente vous permet de créer plusieurs type par défaut dans un index ci - dessous, la version Elasticsearch6.X ne vous permet de créer un type, version Elasticsearch7.X valeurs de type autorisée uniquement « _doc ». La création de plusieurs champs dans un index de type différent ci - dessous, ou sur le terrain ne sont pas les mêmes que des centaines d'indices en un seul indice, l'indice entraînera des problèmes amincissants.
Créer un type recommandé uniquement pour chaque indice, le champ ne sont pas les mêmes données index créé indépendamment, ne se confond pas dans un grand index. Chaque demande de requête pour lire l'index correspondant si nécessaire, pour éviter un grand index de requêtes d' analyse tous les enregistrements, la vitesse des requêtes.

11. L'élargissement du nombre de nœuds de cluster, les nœuds de mise à niveau des spécifications

Les nœuds de serveur plus habituels, les spécifications matérielles plus le serveur, plus la puissance de traitement. ElasticSearch groupe

Reproduit de: https://mp.weixin.qq.com/s/pAuYJxAeJuO_lTNKX4LUpg

Je suppose que tu aimes

Origine www.cnblogs.com/sanduzxcvbnm/p/12624662.html
conseillé
Classement