Sincronizando dados do PostgreSQL no Elasticsearch

Sincronizando dados do PostgreSQL no Elasticsearch

Recebi a missão de gerar relatórios e estatísticas com os dados do Moodle. Porém, o LMS trabalha somente com bancos de dados relacionais como PostgreSQL e MySQL. O ambiente que vou analisar terá cerca de 6 mil usuários, uma hora ou outra, as consultas para relatórios ficarão lentas.

Tendo este cenário em vista, implementei uma sincronização dos dados do PostgreSQL para o Elasticsearch. Por constituir um banco de dados noSQL, as buscas realizadas no Elasticsearch, em grandes volumes de dados, são extremamente mais rápidas se comparadas à qualquer banco de dados relacional.

Então, nas linhas a seguir, vou mostrar como é possível fazer essa migração.

A primeira parte é realizar a instalação do java versão 8.

Para isso, execute os seguintes passos.

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
apt-get update
apt-get install oracle-java8-installer

Caso você queira deixa-lo como padrão, o que eu fiz, execute a instrução a seguir.

apt-get install oracle-java8-set-default -y

Com o java implantado, vamos instalar o ElasticSearch e o Logstash.

apt-get -f install logstash elasticsearch -y

Para efetivar a sincronização do PostgreSQL com o Logstash, é necessário instalar um plugin chamado: logstash-input-jdbc.

Faça a sua instalação seguindo as seguintes instruções:

cd /usr/share/logstash/bin
./logstash-plugin install logstash-input-jdbc

Finalizada a instalação, será necessário baixar o drive do PostgreSQL para Java. O plugin precisa desse driver para conectar-se ao postgres.

Este driver pode ser baixado em qualquer diretório do Linux,  eu o coloquei dentro do diretório do próprio logstash.

cd /usr/share/logstash
wget https://jdbc.postgresql.org/download/postgresql-9.4.1212.jre6.jar

Agora é hora de criar o arquivo de configuração, que fará essa sincronização. Para isso, siga as instruções:

cd /etc/logstash/conf.d/
vim moodle-courses-index.conf

No interior desse arquivo, coloque o seguinte conteúdo:

input {
    jdbc {
        jdbc_connection_string => "jdbc:postgresql://localhost:5432/moodle"
        jdbc_driver_library => "/usr/share/logstash/postgresql-9.4.1212.jre6.jar"
        jdbc_user => "moodle_db_admin"
        jdbc_password => "moodle_db_pass"
        jdbc_driver_class => "org.postgresql.Driver"
        statement => "SELECT * from mdl_course"
    }
}
output {
    elasticsearch {
             index => "moodle"
             document_type => "mdl_course"
             document_id => "%{id}"
             hosts => ["127.0.0.1"]
        }
}

Na seção input desse arquivo, são definidos os parâmetros de conexão com o banco de dados relacional.

A parte mais importante: o statement no qual você definirá que tabela será sincronizada com o ElasticSearch.

Na seção output são definidos os parâmetros de saída, ou seja, para onde serão enviados os dados do PostgreSQL.

Nessa parte, foi definida a criação de um índice chamado moodle. Neste índice será criado um documento chamado mdl_course,  mesmo nome da tabela, cada documento constituirá um registro da tabela.

Em document_id você colocará o campo id da sua tabela, que será o mesmo id empregado para realizar buscas no ElasticSearch.

hosts consiste o endereço do host onde está instalado o seu ElasticSearch.

Salve esse arquivo. Para importar esses dados, siga as instruções:

cd /usr/share/logstash
./bin/logstash -f /etc/logstash/conf.d/moodle-courses-index.conf

A saída do comando será parecida com essa:

WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs to console
17:25:59.515 [[main]{:removed=>[], :added=>["http://127.0.0.1:9200"]}}
17:26:00.211 [[main]-pipeline-manager] INFO  logstash.outputs.elasticsearch - Using mapping template from {:path=>nil}
17:26:00.634 [[main]-pipeline-manager] INFO  logstash.outputs.elasticsearch - Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>50001, "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"_default_"=>{"_all"=>{"enabled"=>true, "norms"=>false}, "dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword"}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date", "include_in_all"=>false}, "@version"=>{"type"=>"keyword", "include_in_all"=>false}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}}
17:26:00.642 [[main]-pipeline-manager] INFO  logstash.outputs.elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["127.0.0.1"]}
17:26:00.645 [[main]-pipeline-manager] INFO  logstash.pipeline - Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
17:26:00.652 [[main]-pipeline-manager] INFO  logstash.pipeline - Pipeline main started
17:26:01.298 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
17:26:03.677 [LogStash::Runner] WARN  logstash.agent - stopping pipeline {:id=>"main"}

Se ai no meio não aparecer nenhum ERROR, quer dizer que funcionou.

Para testar, você pode fazer um request na api do ElasticSearch, verificando se os dados estão lá, no meu caso busquei pelo ID 85.

root@alisson-pc:/usr/share/logstash# curl http://localhost:9200/moodle/mdl_course/85/?pretty


{
  "_index" : "moodle",
  "_type" : "mdl_course",
  "_id" : "85",
  "_version" : 2,
  "found" : true,
  "_source" : {
    "groupmode" : 0,
    "idnumber" : "",
    "cacherev" : 1480009744,
    "summaryformat" : 1,
    "showreports" : 1,
    "startdate" : 1479866400,
    "completionnotify" : 0,
    "defaultgroupingid" : 0,
    "showgrades" : 1,
    "@version" : "1",
    "sortorder" : 10001,
    "theme" : "",
    "id" : 85,
    "lang" : "",
    "summary" : "",
    "visible" : 1,
    "format" : "onetopic",
    "visibleold" : 1,
    "groupmodeforce" : 0,
    "shortname" : "Enfermagem",
    "legacyfiles" : 0,
    "enablecompletion" : 1,
    "tags" : [ ],
    "calendartype" : "",
    "newsitems" : 3,
    "requested" : 0,
    "timecreated" : 1479832086,
    "@timestamp" : "2016-11-24T19:26:00.669Z",
    "marker" : 0,
    "timemodified" : 1479832940,
    "maxbytes" : 0,
    "fullname" : "Enfermagem",
    "category" : 1
  }
}

É isso ai… falows \o

alissonmachado.com.br

Anterior MongoDB Sharding
Próxima 4LINUX APLICARÁ PROVAS BETA-TEST DOS NOVOS EXAMES LPI 101 e 102.

About author

Alisson Machado
Alisson Machado 13 posts

Desenvolvedor Python e Arquiteto DevOps 8 anos de experiência em projetos FOSS (Free and Open Source Software) e Python; Certificações LPI1, LPI2 e SUSE CLA

View all posts by this author →

Você pode gostar também

Curso MongoDB Presencial em São Paulo | 4Linux

Bancos de dados são a base dos projetos de desenvolvimento Web. Muitos desenvolvedores estão voltando sua atenção para o MongoDB, um banco de dados sem esquema que é popular para uma

Minio — Tenha seu próprio S3 Storage

Minio é um storage de objetos, de alta performance e distribuído. A grande vantagem de usá-lo, reside em sua total compatibilidade com o Amazon S3. Neste artigo explico como subir

Openshift: criação de cluster e deploy de uma aplicação

Esse post tem como objetivo criar um cluster de OpenShift Origin com um master e dois nós, a fim de fazer o deploy automático e definir o fluxo de integração

0 Comentários

Ainda não há comentários!

Você pode ser o primeiro a comentar este post!

Deixe uma resposta