Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


terça-feira, 19 de junho de 2018

Abordando a instalação e configuração do MongoDB no Linux

Por Eduardo Legatti

Olá,




Neste artigo irei abordar a instalação do MongoDB que é um banco de dados orientado a documentos que armazena dados em documentos JSON com esquema dinâmico, ou seja, não existe uma estrutura de dados como quantidade de colunas ou tipos de dados para armazenar valores. Pode-se dizer que os documentos do MongoDB são semelhantes aos objetos JSON. No mais, a instalação do MongoDB se resume apenas em realizar o download de um arquivo ".tgz" e descompactá-lo. Abaixo irei criar as estruturas necessárias e realizar algumas configurações recomendadas. Obs.: Por questões de performance, o sistema de arquivos recomendado para armazenar a partição onde ficará o MongoDB é o XFS já que a engine padrão utilizada pelo mesmo é o WiredTiger.

O primeiro passo é criar os diretórios onde ficarão armazenados os dados dos bancos de dados (/mongodb/data) e os arquivos de log (/mongodb/log). O arquivo de log se assemelha ao arquivo de log do MySQL ou até mesmo o arquivo de alerta do Oracle.

[root@linux ~]# mkdir -p /mongodb
[root@linux ~]# mkdir -p /mongodb/data
[root@linux ~]# mkdir -p /mongodb/log

Após a criação dos diretórios, ire realizar o download do arquivo de instalação do MongoDB 3.6.5 X64 conforme a seguir.

[root@linux ~]# cd /mongodb/
[root@linux mongodb]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.5.tgz
--2018-06-18 18:06:41--  https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.5.tgz
Resolving fastdl.mongodb.org (fastdl.mongodb.org)... 54.230.57.97, 54.230.57.250, 54.230.57.175, ...
Connecting to fastdl.mongodb.org (fastdl.mongodb.org)|54.230.57.97|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 100564462 (96M) [application/x-gzip]
Saving to: 'mongodb-linux-x86_64-rhel70-3.6.5.tgz'

100%[==============================================================================================>] 100,564,462 3.39MB/s   in 28s

2018-06-18 18:07:11 (3.39 MB/s) - 'mongodb-linux-x86_64-rhel70-3.6.5.tgz' saved [100564462/100564462]

Com o download realizado, poderemos descompactar o arquivo conforme demonstrado abaixo.
 
[root@linux mongodb]# tar -xzvf mongodb-linux-x86_64-rhel70-3.6.5.tgz
mongodb-linux-x86_64-rhel70-3.6.5/README
mongodb-linux-x86_64-rhel70-3.6.5/THIRD-PARTY-NOTICES
mongodb-linux-x86_64-rhel70-3.6.5/MPL-2
mongodb-linux-x86_64-rhel70-3.6.5/GNU-AGPL-3.0
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongodump
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongorestore
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoexport
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoimport
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongostat
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongotop
mongodb-linux-x86_64-rhel70-3.6.5/bin/bsondump
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongofiles
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoreplay
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoperf
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongod
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongos
mongodb-linux-x86_64-rhel70-3.6.5/bin/mongo
mongodb-linux-x86_64-rhel70-3.6.5/bin/install_compass

Para fins de segurança e boa prática, irei criar um usuário específico que irá executar o processo do MongoDB.
 
[root@linux ~]# useradd mongodb
[root@linux ~]# passwd mongodb
Changing password for user mongodb.
New password: *****
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: *****
passwd: all authentication tokens updated successfully.

[root@linux ~]# chown -R mongodb.mongodb /mongodb/

[root@linux mongodb]# ls -lh
total 96M
drwxr-xr-x. 2 mongodb mongodb 4.0K Jun 18 17:59 data
drwxr-xr-x. 2 mongodb mongodb 4.0K Jun 18 17:59 log
drwxr-xr-x. 3 mongodb mongodb 4.0K Jun 18 18:07 mongodb-linux-x86_64-rhel70-3.6.5
-rw-r--r--. 1 mongodb mongodb  96M May 21 20:16 mongodb-linux-x86_64-rhel70-3.6.5.tgz

Para que os utilitários e o próprio executável do MongoDB seja executado de qualquer diretório. irei colocar o caminho do executável na variável $PATH conforme a seguir.

[root@linux ~]# su - mongodb
[mongodb@linux ~]$ cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

PATH=$PATH:$HOME/.local/bin:$HOME/bin:/mongodb/mongodb-linux-x86_64-rhel70-3.6.5/bin/
export PATH

Pronto. Agora poderemos iniciar o startup do MongoDB conforme a linda de comando abaixo onde:

  • mongod: é o nome do executável do MongoDB
  • --fork: utilizado para manter a execução do processo mongod executando em background
  • --oplogsize: Oplog é uma collection especial que fica armazenado em um banco de dados de sistema do MongoDB e que armazena todas operações realizadas nos bancos de dados. É equivalente o redo log online do Oracle ou transaction log do SQL Server ou binlog do MySQL. O valor 1024 especifica o tamanho do mesmo e é medido em MB (Megabytes).
  • --journal: Este parâmetro junto com a engine WiredTiger que é a default desde a versão 3.2 e é útil como por exemplo, utilizar tecnologia de snapshots de discos (Amazon AWS) de forma que seja possível realizar backups físicos do MongoDB sem gerar indisponibilidade.
  • --port: Porta a ser utilizada. O padrão é 27107. Vale a pena salientar que é possível ter várias instâncias em um mesmo servidor executando em portas diferentes.
  • --bind_ip_all: Permite acesso externo a instância do MongoDB.
  • --dbpath: Caminho onde ficarão armazenados os bancos de dados
  • --logpath: Caminho onde ficarão armazenados os arquivos de log

[mongodb@linux ~]$ mongod --fork --oplogSize 1024 --journal --port 27017 --bind_ip_all --dbpath /mongodb/data/ --logpath /mongodb/log/mongodb.log
about to fork child process, waiting until server is ready for connections.
forked process: 2560
child process started successfully, parent exiting

Após subir a instância do MongoDB, podemos conectar na mesma usando o utilitário de linha de comando mongo conforme a seguir.

[mongodb@linux ~]$ mongo --port 27017
MongoDB shell version v3.6.5
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.5
Server has startup warnings:
2018-06-18T18:18:00.125+0100 I STORAGE  [initandlisten]
2018-06-18T18:18:00.125+0100 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-06-18T18:18:00.125+0100 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-06-18T18:18:01.979+0100 I CONTROL  [initandlisten]
2018-06-18T18:18:01.979+0100 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-06-18T18:18:01.979+0100 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-06-18T18:18:01.979+0100 I CONTROL  [initandlisten]
2018-06-18T18:18:01.979+0100 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-06-18T18:18:01.979+0100 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-06-18T18:18:01.979+0100 I CONTROL  [initandlisten]
> exit
bye

Para realizar o shutdown da instância, basta proceder com a linha de comando abaixo.

[mongodb@linux ~]$ mongod --dbpath /mongodb/data --shutdown
killing process with pid: 2560

Como a instalação do MongoDB foi realizada em um sistema de arquivos Ext4, é possível observar o alerta de que o sistema de arquivos XFS é altamente recomendado. Para os outros alertas e demais boas práticas irei ajustar o sistema operacional conforme demonstrado abaixo.

-- como root
[root@linux ~]# cat /etc/security/limits.conf
mongodb soft nofile 65535
mongodb hard nofile 65535
mongodb soft nproc  65535
mongodb hard nproc  65535

[mongodb@linux ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 11275
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 65535
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

[root@linux mongodb]# echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
[root@linux mongodb]# echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
[root@linux mongodb]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@linux mongodb]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

Vale a pena salientar que a alteração do transparent_hugepage precisa ser realizado a todo momento em que o servidor é reiniciado. Após realizado os ajustes necessários, irei novamente subir a instância do MongoDB (como mongodb).

[mongodb@linux ~]$ mongod --fork --oplogSize 1024 --journal --port 27017 --bind_ip_all --dbpath /mongodb/data/ --logpath /mongodb/log/mongodb.log
about to fork child process, waiting until server is ready for connections.
forked process: 2836
child process started successfully, parent exiting

[mongodb@linux ~]$ mongo
MongoDB shell version v3.6.5
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.5
Server has startup warnings:
2018-06-18T18:27:42.883+0100 I STORAGE  [initandlisten]
2018-06-18T18:27:42.883+0100 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-06-18T18:27:42.883+0100 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-06-18T18:27:44.529+0100 I CONTROL  [initandlisten]
> show dbs
admin   0.000GB
config  0.000GB
local   0.000G

Pronto. o comando "show dbs' lista os bancos de dados atualmente criados na instância do MongoDB.

Google+

Nenhum comentário:

Postagens populares