Skip to content

Instantly share code, notes, and snippets.

@webwurst
Forked from blavoie/copie-elasticsearch.conf
Created March 10, 2016 16:09

Revisions

  1. @blavoie blavoie created this gist Mar 2, 2016.
    190 changes: 190 additions & 0 deletions copie-elasticsearch.conf
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,190 @@
    #
    # Ce fichier de configuration Logstash permet d'effectuer la copie d'index soit:
    # - à l'intérieur d'un même cluster Elasticsearch
    # - entre différents clusters Elasticsearch
    #
    # Utile dans le cas où nous voulons réindexer un index à l'aide de nouveaux mappings ou pour
    # dupliquer la production vers un autre environnement de tests.
    #
    # Pour invoquer la commande:
    # LS_HEAP_SIZE="2048m" /path/to/bin/logstash -w 2 -f copie-elasticsearch.conf
    #
    # Note: seulement les données sont copiées, pas les mappings associés.
    #
    # Afin d'accélérer au maximum la copie, il est conseillé de:
    # - désactiver les rafraîchissements (refresh_interval)
    # - désactiver les replicas
    #
    # Les étapes d'exploitation devraient donc être:
    #
    # 1. Spécifier l'adresse du serveur Elasticsearch utilisé:
    #
    # export ES_HOST="http://node.cluster.domain.com:9200"
    #
    # 2. Désactiver les rafraichissements et les replicas, soit:
    #
    # 1. Sur tous les index existants via l'API REST.
    # Peut être utile pendant une copie, alors que les index existente déjà.
    #
    # curl -XPUT $ES_HOST/ul-*/_settings -d '{ "index.refresh_interval" : "-1" }'
    # curl -XPUT $ES_HOST/ul-*/_settings -d '{ "index.number_of_replicas" : "0" }'
    #
    # 2. Pour les futurs index avec le template «ul-bulk-import».
    # Très bonne stratégie à adopter avant même de procéder à la copie.
    #
    # curl -XPUT $ES_HOST/_template/ul-bulk-import -d @ul-bulk-import.json
    #
    # 3. Procéder à la copie.
    # Bien sûr, ajuster le fichier de paramètre avant de lancer la commande.
    #
    # LS_HEAP_SIZE="2048m" /opt/logstash/bin/logstash -w 2 -f copie-elasticsearch.conf
    #
    # 4. Optimiser les indexes à l'aide d'un «force merge» (optionnel).
    #
    # curl -XPOST $ES_HOST/ul-*/_forcemerge?max_num_segments=5
    #
    # 5. Supprimer le template «ul-bulk-import».
    #
    # curl -XDELETE $ES_HOST/_template/ul-bulk-import
    #
    # 6. Réactiver les rafraichissement et/ou les replicas selon ce qui est désiré dans
    # l'environnement de destination.
    #
    # curl -XPUT $ES_HOST/ul-*/_settings -d '{ "index.refresh_interval" : "15s" }'
    # curl -XPUT $ES_HOST/ul-*/_settings -d '{ "index.number_of_replicas" : "1" }'
    #
    # TODO:
    # - Il serait peut-être bien de regarder le paramètre index.translog.flush_threshold_size et voir
    # si cela peut avoir un impact sur les performances d'import masssif.
    #
    # https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-translog.html
    #

    ###############################################################################
    #
    # Entrée à partir d'Elasticsearch
    #
    # Pour un plus grand parralélisme, plusieurs blocs d'entrée avec des patterns différents peuvent
    # être utilisés.
    #
    # Documentation: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-elasticsearch.html
    #

    input {

    elasticsearch {

    # Éviter de spécifier le «master node».
    # De préférence, spécifier des «client nodes» ou des «data nodes».

    hosts => [ "localhost" ]
    index => "ul-index1-2016.03.*"

    query => '{"query": { "match_all": {} } }'
    docinfo => true

    # Paramètres de performance

    scan => true
    size => 1000 # Attention: nombre par shard
    scroll => "5m"

    }

    #elasticsearch {
    #
    # hosts => [ "localhost" ]
    # index => "ul-index2-2016.03.*"
    #
    # query => '{"query": { "match_all": {} } }'
    # docinfo => true
    #
    # # Paramètres de performance
    #
    # scan => true
    # size => 1000 # Attention: par shard.
    # scroll => "5m"
    #
    #}
    }

    ###############################################################################
    #
    # Filtres
    #
    # Généralement, lorsqu'on veut une copie complète et identique on ne spécifie
    # pas de filtres qui altère les événements. Cependant, il est possible de
    # copier qu'un sous-ensemble des événements en éliminant qu'une portion de
    # ces derniers.
    #
    # On ajoute aussi le filtre metrics permettant de visualiser la progression de
    # la copie.
    #

    filter {

    #drop {
    # percentage => 50
    #}

    #ruby {
    # code => "event.cancel if rand <= 0.40"
    #}

    #if [property] == "value" {
    # drop { }
    #}

    # Permet d'empêcher la copie d'index débutant par un point.
    # Généralement : .kibana et .marvel.
    #
    #if [@metadata][_index] =~ /^\./ {
    # drop { }
    #}

    metrics {
    meter => "events"
    add_tag => "metric"
    flush_interval => 10
    }
    }

    ###############################################################################
    #
    # Sortie vers Elasticsearch
    #
    # Documentation: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
    #

    output {

    if "metric" in [tags] {

    stdout {
    codec => line {
    format => "count: %{[events][count]} rate: %{[events][rate_1m]}"
    }
    }

    } else {

    elasticsearch {

    # Éviter de spécifier le «master node».
    # De préférence, spécifier des «client nodes» ou des «data nodes».

    hosts => [ "localhost" ]
    #index => "copie.%{[@metadata][_index]}"
    index => "%{[@metadata][_index]}"

    document_type => "%{[@metadata][_type]}"
    document_id => "%{[@metadata][_id]}"

    # Paramètres de performance

    flush_size => 250
    idle_flush_time => 10
    workers => 4
    }
    }
    }