Migrando dados do Moodle de PostgreSQL para Elasticsearch: um guia passo a passo

Migrando dados do Moodle de PostgreSQL para Elasticsearch: um guia passo a passo

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 Guia Prático: Como Configurar um Cluster de Sharding no MongoDB
Próxima Participe do Beta Test da Certificação LPIC-1 na 4Linux em São Paulo

About author

Alisson Machado
Alisson Machado 22 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

Cloud

Aprenda a criar módulos com Terraform na prática

Este seria o último capítulo da nossa série de postagens sobre Terraform, mas se podemos também falar sobre versionamento de infraestrutura, acho que vale a pena no aprofundarmos em mais

Banco de Dados

Domine o Wildfly 8: Curso com foco em Administração e DevOps

Administração com Cluster de Alta Performance em ambiente DevOps. Novidades do Curso além dos recursos novos do Wildfly No curso existe uma máquina DEVOPS (com ferramentas dev, como GIT, Maven)

DevOps

Atualização do curso de Kubernetes: 40 horas de aula e suporte para certificações CKAD e CKA

Olá para você que trabalha ou tem interesse na área de containers, a 4Linux acaba de atualizar e ampliar o curso de Kubernetes que agora conta com 40 horas de