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

Alisson Menezes, atua como Gerente de T.I, 9 anos de experiência em projetos FOSS (Free and Open Source Software) e Python. Formação em Análise de Sistemas pela FMU e cursando MBA em BigData pela FIA, possui certificações LPI1, LPI2 e SUSE CLA, LPI DevOps e Exim - DevOps Professional. Autor dos cursos Python Fundamentals, Python for Sysadmins, MongoDB for Developers/DBAs, DevSecOps, Co-Autor do Infraestrutura Ágil e Docker da 4Linux e palestrantes em eventos como FISL, TDC e Python Brasil. É entusiasta das mais diversas áreas em T.I como Segurança, Bancos de dados NoSQL, DataScience mas tem como foco DevOps e Automação.

View all posts by this author →

Você pode gostar também

DevOps

DEVOPS no dia a dia do Wellinton Pinheiro

No último dia 3 de setembro aconteceu a prova beta test na sede da 4Linux em SP. Foram mais de 150 inscritos que fizeram a prova de seleção na plataforma

Infraestrutura

Kong API – Instalando o API Gateway e seu Dashboard

Estive envolvido num projeto de migração, algumas aplicações internas para o modelo de micro serviço. No caso, cada parte do código se tornaria um projeto independente, dessa forma, agilizando os

DevOps

Heroku: infraestrutura pronta para uso em cloud

Heroku é atualmente uma das melhores opções PaaS ( Plataform as a Service ) para desenvolvedores fazerem o deploy de suas aplicações. Essa plataforma é muito utilizada nas startups porque