[PYTHON] Conseils pour utiliser Elastic Search de manière efficace

Notes personnelles

install ~ setup

Orchestré avec du tissu

fabfile.py


def install_elastic_search():
    sudo("wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.2.1.deb")
    sudo("dpkg -i elasticsearch-1.2.1.deb")
    sudo("service elasticsearch start")
    run("echo export PATH=\$PATH:/usr/share/elasticsearch/bin/ >> ~/.bashrc")

def es_init():
    //changing permission
    //see document

Coopération avec td-agent

Recevez les journaux de divers serveurs sur le serveur de journaux contenant la recherche élastique Il est bon d'utiliser le plug-in de forêt de td-agent (fluentd) pour le branchement conditionnel ou l'extraction d'informations des balises.

td-agent.conf



<source>
  type forward
  port 24224
</source>

<match **>
 type forest
 subtype elasticsearch
 <template>
   host localhost
   port 9200
   index_name ${tag_parts[2]}
   type_name ${tag_parts[1]}

   buffer_type memory
   flush_interval 3s
   retry_limit 17
   retry_wait 1.0
   num_threads 1
   flush_at_shutdown true
 </template>
</match>

C'est un peu flush_interval 3s n'est pas bon. Peut-être qu'en production, c'est si fréquent que cela affecte les performances.

En passant, si vous définissez l'intervalle sur le timing comme Akan avec td-agent, les données qui auraient dû être PUT vers Elastic Search ne seront pas reflétées facilement, donc si vous pensez que la réflexion est lente, vous voudrez peut-être jouer avec.

tester

Test d'existence

fabfile_test.py



def all():
  availability_test("td-agent")
  availability_test("elasticsearch")

def availability_test(name):
  env.warn_only = True

  if name == "td-agent":
    version_checker = name + " --version"
  elif name == "elasticsearch":
    version_checker = "export PATH=$PATH:/usr/share/elasticsearch/bin/ && " + name + " -v"

  if "command not found" in run(version_checker):
    print(name + " hasn't been installed")
  else:
    print(name + " has been installed")
  env.warn_only = False

Si vous y réfléchissez maintenant, il est préférable d'utiliser l'outil de test de tissu envassert, et je devrais le refactoriser maintenant.

envassert est facile à configurer et n'a pas besoin d'être aussi robuste que serverspec. Non, c'est très bien de pouvoir écrire en notation rspec, et je pense que mocha est également bon en JS, mais serverspec a trop à préparer et je veux tester l'environnement pour les tests d'infrastructure. Je suis venu et je l'ai touché, mais je suis un peu timide. C'est donc rubisiste mais fiblique, pas chef.

Test d'intégration du système de journalisation

Sale Réécrire autour de python

bash



#! /bin/bash
###############################################
# function
###############################################

initializing () {
  if ! expr $before : '[0-9]*' 1> /dev/null 2> /dev/null ; then
    before=0
  fi

  if [ -z $num ]; then
    num=0
  fi

  if [ $num -le $before ]; then
    num=$(($before+1))
  fi
}

buffering () {
  waiting=$*
  for i in `seq 1 $waiting`
  do
    left=$(($waiting - $i))
    echo $left sec
    sleep 1
  done
}

log_into_td_es () {
  fab -u <your_name> -i <your_pem> -H <your_domain> all
  buffering 1
}

diff_check () {
  diff=$(($after - $before))
  if [ $diff -eq 1 ]; then
    echo diff: $diff
  else
    echo not changed
    exit 1
  fi
}

# delete_all () {
#   curl -XDELETE 'http://$*:9200/*' 1> /dev/null 2> /dev/null 
# }




###############################################
# main
###############################################
before=`curl -XGET http://$*:9200/fluentd/_count 2> /dev/null | cut -d "," -f 1 | cut -d ":" -f 2`
echo before_count: $before
initializing
curl -XPUT http://$*:9200/fluentd/info/$num -d '{ "test" : "hoge" }' 1> /dev/null 2> /dev/null
after=`curl -XGET http://$*:9200/fluentd/_count 2> /dev/null | cut -d "," -f 1 | cut -d ":" -f 2`
echo after_count: $after
diff_check

Utiliser les journaux

Vous devez utiliser ʻelasticsearch-py`. Je suis rubisiste, mais python peut être utilisé dans l'infrastructure. Fit pour l'équipe. Je ne suis pas particulier à ce sujet.

curl -X GET 'http://hoge.com:9200/_index/_type/_search?pretty=true&size=1000&sort=desc'

Vous pouvez également le vérifier.

Voir l'état d'ES

Grep des yeux

curl -X GET 'http://hoge.com:9200/_stats?pretty

Des milliers de lignes d'informations statistiques sortent. Je regarde généralement la quantité de documents (et le stockage). Je n'ai pas encore partagé ou répliqué, je le ferai donc plus tard.

Surveillance de la vie et de la mort

Ceux qui obtiennent régulièrement des statistiques ES et les visualisent.

quelque chose comme ca.

Recommended Posts

Conseils pour utiliser Elastic Search de manière efficace
Conseils d'utilisation de Selenium et Headless Chrome dans un environnement CUI
Un moyen simple d'éviter plusieurs boucles for en Python
Introduction d'une bonne méthode de gestion des connexions DB en Python
Problèmes lors de l'utilisation d'Elasticsearch comme source de données dans Redash
[TouchDesigner] Conseils pour la déclaration par python
Conseils pour mettre en œuvre un modèle ou un entraînement légèrement difficile avec Keras
Remarques sur l'utilisation de Colab Pro pendant environ 2 mois (bons points / mauvais points)
Comment faire un modèle pour la détection d'objets avec YOLO en 3 heures
Windows → Linux Conseils pour importer des données
Conseils pour gérer les binaires en Python
Impressions d'utilisation de Flask pendant un mois
Changer la liste dans l'instruction for
Précautions lors de l'utilisation de l'instruction for dans les pandas
Créer une lecture de feuille de notes avec Python OpenCV (Conseils pour bien lire)
Conseils pour utiliser python + caffe avec TSUBAME
Scraping de sites Web à l'aide de JavaScript en Python
Obtenez un jeton pour conoha avec python
Conseils pour créer de grandes applications avec Flask
Dessinez une structure arborescente en Python 3 à l'aide de graphviz
Remarques sur l'utilisation de python (pydev) avec eclipse
Conseils pour créer de petits outils avec python
Une note utile lors de l'utilisation de Python après une longue période
Recherche d'un moyen efficace d'écrire un Dockerfile avec Python avec de la poésie
Un mémorandum de méthode souvent utilisé dans l'apprentissage automatique utilisant scikit-learn (pour les débutants)
Existe-t-il un bon exemple de code pour nosetests?
Conseils pour accéder à l'API ATND avec Python
Entrez une valeur spécifique pour la variable dans tensorflow
Créez un fichier MIDI en Python en utilisant pretty_midi
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
Faisons un module pour Python en utilisant SWIG
Enregistrer des vues YouTube sur une feuille de calcul à l'aide de Lambda
Je veux configurer un serveur fictif pour python-flask en quelques secondes en utilisant swagger-codegen.
Créer un bot de collecte de données en Python à l'aide de Selenium
Lancement d'un service Web pour noter les caractères manuscrits à l'aide de DeepLearning
Structure de répertoire pour le développement piloté par les tests à l'aide de pytest en python
Enregistrer une tâche dans cron pour la première fois
Création d'un environnement de formation pour les tests de pénétration à l'aide de Naumachia
Essayez de rechercher un profil d'un million de caractères en Python
Essayez la détection des visages en temps réel à l'aide d'une webcam
J'ai construit une roue pour Windows à l'aide d'actions Github
Une collection de lignes de commande qui utilisent des environnements virtuels avec Anaconda
Lorsque vous voulez plt.save dans l'instruction for
Comment exécuter une commande à l'aide d'un sous-processus en Python
Correction d'un moyen pour l'UEFI de forcer Windows à démarrer
Mémo de construction d'environnement d'apprentissage automatique par Python
Conseils pour ouvrir une scène avec une référence brisée dans un script
Définir le proxy pour Python pip (décrit dans pip.ini)
Recherche d'un moyen unifié d'attendre et d'obtenir les changements d'état de Selenium pour les éléments Python
Lambda dans VPC ne peut pas envoyer de courrier avec Boto3 même si vous utilisez le point de terminaison VPC pour SES