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
About author
Você pode gostar também
Guia prático: Acelere o Time To Market com DevOps e Vagrant
Conheça como criar máquinas virtuais com o Vagrant e crie ambientes padronizados iniciando pelo de Desenvolvimento. DevOps tem como objetivo diminuir o Time To Market de um serviço, ou seja,
AWK: A Ferramenta Definitiva para Manipulação de Dados no Linux
No ecossistema de TI, a eficiência operacional depende da nossa capacidade de processar e analisar dados rapidamente. Seja na administração de sistemas, análise de logs ou automação de tarefas, a
Como usar o Kaniko para criar imagens de contêineres no GitLab CI/CD
Hoje, no blog da 4Linux, vamos falar sobre o CI/CD especificamente do Gitlab CI e em como podemos fazer o build de uma imagem de um container de forma facilidade







