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


terça-feira, 9 de agosto de 2022

MongoDB - Benchmark de Performance (3.2 a 6.0)

Por Eduardo Legatti

Olá,

O propósito deste artigo é mostrar os resultados de um benchmark (não oficial) realizado por mim comparando a performance de leitura e escrita de versões do MongoDB desde a versão 3.2 até a versão 6.0 que é a última disponível na data deste artigo. Foram utilizados os patch mais recentes disponíveis na data deste artigo de cada versão community do MongoDB para Linux x64 conforme a seguir:

  • 3.2 (3.2.22)
  • 3.4 (3.4.24)
  • 3.6 (3.6.23)
  • 4.0 (4.0.28)
  • 4.2 (4.2.21)
  • 4.4 (4.4.15)
  • 5.0 (5.0.9)
  • 6.0 (6.0.0)

O hardware utilizado contém a seguinte configuração:

  • Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz
  • 4 CPUs 
  • 16GB RAM

Segue o comando abaixo que foi utilizado para realizar o teste de performance para cada versão do MongoDB. O utilitário usado se encontra disponível em POCDriver.

java -jar /home/mongodb/POCDriver-master/bin/POCDriver.jar -k 20 -i 10 -u 10 -b 20 -r 10 -t 5 -d 3600

-k Fetch a single document using its primary key
-i add a new document
-u increment an integer field in a random document
-b what size to use for operation batches
-r fetch a range of 10 documents
-t how many threads to run on the client and thus how many connections
-d how long to run the loader for (seconds)

Ao final de 3600 segundos de execução (1 hora) para cada versão do MongoDB, os resultados foram computados em uma planilha. Vale a pena salientar que foram realizadas 3 execuções em cada versão do MongoDB e calculada a média dos resultados das 3 execuções. Cada resultado compõe-se das operações abaixo

  • inserts per second
  • keyqueries per second
  • updates per second
  • rangequeries per second 

Segue exemplo de um resultado que foi extraído para ser computado em uma planilha.

After 3600 seconds, 76738832 new documents inserted - collection has 76738832 in total
21316 inserts per second on average
13198 keyqueries per second on average
26182 updates per second on average
3767 rangequeries per second on average

Por fim, segue o resultado das execuções e o comparativo de performance de leituras e escritas entre as versões.




terça-feira, 19 de abril de 2022

MongoDB - GROUP BY usando o $group (aggregation)

Por Eduardo Legatti

Olá,

Sabemos que em uma instrução SQL podemos utilizar o operador de agregação GROUP BY que é utilizado em conjunto com a cláusula SELECT para agrupar registros semelhantes em uma tabela. A seleção é feita de acordo os critérios definidos na cláusula WHERE, caso ela seja utilizada, e conforme o campo indicado para o agrupamento no comando GROUP BY. Sobre o resultado obtido, podemos aplicar diversas funções como:

  • Somatória dos valores de uma coluna: SUM()
  • Quantidade de registros que atenda a um critério: COUNT()
  • Cálculo da média ponderada: AVG()
  • Identificar os menores valores: MIN()
  • Identificar os maiores valores: MAX()

No MongoDB também podemos utilizar tais funções de agregação e o objetivo deste artigo será o de demonstrar a sintaxe do comando. Para exemplificar, usando um banco de dados relacional, teremos o seguinte cenário.

SQL> create table t1 (uf varchar2(2));

Tabela criada.

SQL> insert into t1 values ('MG');

1 linha criada.

SQL> insert into t1 values ('MG');

1 linha criada.

SQL> insert into t1 values ('MG');

1 linha criada.

SQL> insert into t1 values ('MG');

1 linha criada.

SQL> insert into t1 values ('MG');

1 linha criada.

SQL> insert into t1 values ('SP');

1 linha criada.

SQL> insert into t1 values ('SP');

1 linha criada.

SQL> insert into t1 values ('SP');

1 linha criada.

SQL> insert into t1 values ('RJ');

1 linha criada.

SQL> insert into t1 values ('RJ');

1 linha criada.

SQL> commit;

Commit concluído.
 
Após inserir os registros como mostrado acima, para agrupar todas as unidades federativas de forma a mostrar a quantidade total de cada uma na tabela T1, executaremos a seguinte instrução SQL. 
 
SQL> select uf,count(*) qtd from t1 group by uf;

UF        QTD
-- ----------
RJ          2
SP          3
MG          5
Agora irei criar o mesmo cenário no MongoDB.
> use db01
switched to db db01
> db.t1.insertMany([
...    { uf: "MG" },
...    { uf: "MG" },
...    { uf: "MG" },
...    { uf: "MG" },
...    { uf: "MG" },
...    { uf: "SP" },
...    { uf: "SP" },
...    { uf: "SP" },
...    { uf: "RJ" },
...    { uf: "RJ" }
... ]);
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("624f3981426338c36f74d687"),
                ObjectId("624f3981426338c36f74d688"),
                ObjectId("624f3981426338c36f74d689"),
                ObjectId("624f3981426338c36f74d68a"),
                ObjectId("624f3981426338c36f74d68b"),
                ObjectId("624f3981426338c36f74d68c"),
                ObjectId("624f3981426338c36f74d68d"),
                ObjectId("624f3981426338c36f74d68e"),
                ObjectId("624f3981426338c36f74d68f"),
                ObjectId("624f3981426338c36f74d690")
        ]
}
 
Após inserir os documentos como mostrado acima, para agrupar todas as unidades federativas de forma a mostrar a quantidade total de cada uma presente na collection T1, executaremos a seguinte instrução. 
 
> db.getCollection("t1").aggregate([{"$group" : {_id: "$uf" , count:{$sum:1}}}]);
{ "_id" : "RJ", "count" : 2 }
{ "_id" : "SP", "count" : 3 }
{ "_id" : "MG", "count" : 5 }

quarta-feira, 7 de julho de 2021

MongoDB - Replica Set Animation

Por Eduardo Legatti

Olá,

Quando configuramos o MongoDB para funcionar em replica set, temos que ter no mínimo 3 membros: PSS (PRIMARY, SECONDARY, SECONDARY) ou PSA (PRIMARY, SECONDARY, ARBITER). Fiz uma pequena animação onde demonstro o que acontece quando em uma replica set quando um FAIL OVER automático ocorre (quando o PRIMARY fica indisponível) e suas consequências quando estamos utilizando a replicação assíncrona que, segundo a documentação, podem ocorrer ROLLBACKS de algumas instruções que foram gravadas no PRIMARY mas ainda não foram enviadas para o membro SECONDARY. No MongoDB o membro SECONDARY buscas as instruções gravavas no oplog do membro PRIMARY de forma a manter ambos membros sincronizados. Demonstro também o que acontece quando o comando stepDown() é manualmente digitidado no membro PRIMARY. Vale a pena salientar que mostro tanto os membros com (priority > 0), ou seja, qualquer um deles pode ser tornar PRIMARY no qual temos como benefício uma alta disponibilidade, quanto (priority = 0) o que significa que um membro não pode ser tornar PRIMARY no qual não teremos alta disponibilidade, mas em contrapartida não haverá perda de dados. 

 





 

terça-feira, 15 de dezembro de 2020

Oracle Client 21c disponível para download

Por Eduardo Legatti

Olá,

O Oracle Client 21c já está disponível para download para as plataformas Linux.
 
 

sexta-feira, 13 de novembro de 2020

MySQL - Esqueci a senha do root. Como resetar?

Por Eduardo Legatti

Olá,

Abaixo é possível verificar que a autenticação falhou pelo fato de eu ter esquecido a senha do root para conectar no MySQL.

[root@linux ~]# mysql -uroot -psenha
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
 
Segue abaixo o roteiro que deverá ser seguido para que a senha do root seja resetada para uma nova senha. 
 
[root@linux ~]# systemctl stop mysqld
[root@linux ~]# systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
[root@linux ~]# systemctl start mysqld
[root@linux ~]# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.28 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql
Database changed

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'senha';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

[root@linux ~]# systemctl stop mysqld
[root@linux ~]# systemctl unset-environment MYSQLD_OPTS
[root@linux ~]# systemctl start mysqld
[root@linux ~]# mysql -uroot -psenha
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.28 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

quinta-feira, 17 de setembro de 2020

MongoDB - Obtendo informações das collections de um banco de dados

Por Eduardo Legatti

Olá,

Neste artigo irei demonstrar através de um script como obter informações de cada collection de um banco de dados, tais como quantidade de documentos, tamanho total real em MB e o tamanho total em MB ocupado em disco.

mongoPrdSet:PRIMARY> use bd01
switched to db bd01
mongoPrdSet:PRIMARY> cols.forEach(function(col) {
...     {
...       vstat=db.getCollection(col).stats({ scale : 1024*1024 }) //Em MB
...       print(vstat.ns + " - count: " + vstat.count + " - size MB: " + vstat.size + " - storage_size MB: "+vstat.storageSize)
...     }
... });
bd01.col01 - count: 2507  - size MB: 139 - storage_size MB: 53
bd01.col02 - count: 44372 - size MB: 2852 - storage_size MB: 600
bd01.col03 - count: 118476 - size MB: 710 - storage_size MB: 155
bd01.col04 - count: 3936 - size MB: 49 - storage_size MB: 16
bd01.col05 - count: 1797 - size MB: 12 - storage_size MB: 3
bd01.col06 - count: 2728 - size MB: 24 - storage_size MB: 5
bd01.col07 - count: 9406 - size MB: 73 - storage_size MB: 14
bd01.col08 - count: 57 - size MB: 32 - storage_size MB: 3
bd01.col09 - count: 1760 - size MB: 62 - storage_size MB: 14
bd01.col10 - count: 1616 - size MB: 38 - storage_size MB: 11
bd01.col11 - count: 1501 - size MB: 64 - storage_size MB: 18
bd01.col12 - count: 42880 - size MB: 4783 - storage_size MB: 1045
bd01.col13 - count: 2652 - size MB: 98 - storage_size MB: 28
bd01.col14 - count: 211 - size MB: 5 - storage_size MB: 1
bd01.col15 - count: 8055 - size MB: 5 - storage_size MB: 1
bd01.col16 - count: 225 - size MB: 14 - storage_size MB: 18
bd01.col17 - count: 309 - size MB: 7 - storage_size MB: 2
bd01.col18 - count: 7579 - size MB: 37 - storage_size MB: 11
bd01.col19 - count: 27762 - size MB: 135 - storage_size MB: 28
bd01.col20 - count: 26807 - size MB: 72 - storage_size MB: 12

segunda-feira, 17 de agosto de 2020

GOLDENGATEBR - Entrevista 20/08 - Quinta 20H30

Por Eduardo Legatti

 

 
eduardo legatti


 
 
 
 

Postagens populares