Quando participo de eventos e converso com usuários e defensores do NoSQL, frequentemente ouço histórias sobre por que as pessoas decidiram começar a usar o Couchbase depois de terem vindo do MongoDB. Veja, por exemplo, um entrevista que fiz com Tom Coates, da Nuance. Um dos principais motivos pelos quais a Nuance decidiu abandonar o MongoDB foi sua incapacidade de escalonar de forma simplificada. Essa não é a primeira vez que ouço essa história.
Vamos explorar o que está envolvido no dimensionamento de um cluster NoSQL com o MongoDB e, em seguida, realizar a mesma coisa com o Couchbase.
Para o MongoDB, o sharding é uma maneira popular de scale. Outros bancos de dados abordam o processo de clustering NoSQL de forma diferente. Em todos os casos, estamos interessados em criar um cluster de vários nós que inclua a replicação de dados.
Criação de um cluster de vários nós do MongoDB
O MongoDB é um banco de dados de documentos NoSQL que tem uma arquitetura mestre-escravo. Ao criar um cluster e dimensioná-lo, você deve criar e gerenciar um cluster fragmentado e um conjunto de replicaçãoque é outro nome para um cluster de replicação. Essas são peças de um quebra-cabeça potencialmente grande, e você verá como ele pode se complicar facilmente.
Como planejamos fazer tudo localmente, o Docker se torna um bom candidato para o trabalho. Vamos implantar vários contêineres do Docker do MongoDB e dimensioná-los como parte de um cluster.
A primeira ordem do dia é implantar todos os nós necessários para o nosso cluster. Usando a CLI do Docker, execute os seguintes comandos:
1 2 3 |
docker run -d -p 27017-27019:27017-27019 -p 28017:28017 --name mongocfg1 mongo mongod --configsvr --replSet rs0 docker run -d -p 37017-37019:27017-27019 -p 38017:28017 --name mongoshd1 mongo mongod --shardsvr --replSet rs1 docker run -d -p 47017-47019:27017-27019 -p 48017:28017 --name mongoshd2 mongo mongod --shardsvr --replSet rs1 |
Os comandos acima criarão um nó de configuração que usa um rs0
conjunto de réplicas, bem como dois nós de fragmentos que usam um rs1
conjunto de réplicas. Estamos iniciando agora nossas instâncias do MongoDB e já temos dois tipos de nós e conjuntos de réplicas diferentes com os quais nos preocupar.
Agora precisamos conectar todos eles para que a replicação e a fragmentação estejam em um estado funcional.
Vamos começar inicializando a replicação nos dois nós de fragmento que usam o rs1
conjunto de réplicas. Precisaremos determinar os endereços IP dos contêineres para realizar o trabalho. Na CLI do Docker, execute o seguinte:
1 2 |
inspeção de docas mongoshd1 Inspecionar o docker mongoshd2 |
Depois de obter os endereços IP, conecte-se a um dos nós do fragmento por meio do seguinte comando:
1 |
docker exec -it mongoshd1 bash |
Isso nos permite controlar o contêiner com o shell interativo. Para inicializar a replicação nesses nós, precisamos iniciar o shell do Mongo a partir do contêiner conectado:
1 |
mongo --port 27018 |
Uma vez conectado por meio do shell do Mongo, execute o seguinte:
1 2 3 4 5 6 7 |
rs.initiate({ _id : "rs1", membros: [ { _id : 1, host : "172.17.0.3:27018" }, { _id : 2, host : "172.17.0.4:27018" } ] }); |
No comando acima, lembre-se de trocar os endereços IP dos contêineres pelos nós de fragmentos que você realmente deseja usar.
Uma vez executado, você poderá verificar o status dos nós por meio do comando rs.status()
comando.
Agora precisamos preparar o nó de configuração. Primeiro, determine o IP do contêiner, como demonstrado anteriormente, e conecte-se a ele via:
1 |
docker exec -it mongocfg1 bash |
Uma vez conectado com o shell interativo, você precisará se conectar ao MongoDB usando o shell do Mongo, mas dessa vez por meio de uma porta diferente, já que se trata de um nó de configuração:
1 |
mongo --port 27019 |
Uma vez conectado ao nó de configuração por meio do shell do Mongo, execute o seguinte comando para inicializar o conjunto de réplicas:
1 2 3 4 5 6 |
rs.initiate({ _id : "rs0", membros: [ { _id : 0, host : "172.17.0.2:27019" }, ] }); |
Nesse ponto, devemos poder começar a configurar os nós de fragmento. Lembre-se de que, anteriormente, só configuramos as réplicas nos nós de fragmento. Saia do shell do Mongo no nó de configuração, mas não saia do shell interativo. Precisamos executar um novo comando chamado mongóisPara fazer ainda mais configurações. Execute o seguinte:
1 |
mongos --configdb rs0/172.17.0.2:27019 |
Isso nos permitirá adicionar shards por meio do shell do Mongo. A menos que tenha optado por executar o mongos em segundo plano, você precisará abrir um novo Terminal para usar o shell do Mongo.
Conectar-se a mongocfg1
em um novo Terminal e, em seguida, conecte-se usando o shell do Mongo. Desta vez, em vez de usar a porta 27019
você usará a porta 27017
.
Depois de conectado, execute os seguintes comandos para adicionar os fragmentos:
1 2 |
sh.addShard("rs1/172.17.0.3:27018"); sh.addShard("rs1/172.17.0.4:27018"); |
No exemplo acima, lembre-se de que estamos usando os endereços IP dos nós do fragmento e a porta do nó do fragmento.
Com as funções de sharding do MongoDB configuradas, agora podemos habilitá-las para um banco de dados específico. Esse pode ser qualquer banco de dados do MongoDB que você desejar. A ativação da fragmentação pode ser feita da seguinte forma:
1 |
sh.enableSharding("example"); |
Mas ainda não terminamos. No MongoDB, as opções de sharding existem em um intervalo que inclui Fragmentação à distância e Sharding com hash. Determine sua abordagem de como você fragmentará as coleções de dados, tendo em mente seu objetivo é fazer com que os dados do seu banco de dados sejam distribuídos da forma mais uniforme possível nesse cluster NoSQL.
Veja o seguinte comando, por exemplo:
1 |
sh.shardCollection("example.people", { "_id": "hashed" }); |
O comando acima criará uma chave de fragmento em _id
para o pessoas
coleta. Essa é a melhor maneira de fazer as coisas, talvez sim ou talvez não, cabe a você decidir como deseja fragmentar seus dados no MongoDB.
Se você quiser verificar a distribuição de fragmentos, poderá executá-la:
1 |
db.people.getShardDistribution(); |
Como você pode ver em todas as etapas que percorremos, não foi uma tarefa fácil fazer com que a replicação e a fragmentação funcionassem em um cluster de nós do MongoDB. Como você precisa escalar seu cluster para cima e para baixo, a tarefa se torna ainda mais complicada e isso é algo que frustra as empresas.
É aqui que o Couchbase entra em ação!
Criação de um cluster do Couchbase de vários nós
Embora o Couchbase seja um banco de dados de documentos, assim como o MongoDB, sua arquitetura é um pouco diferente. O Couchbase usa um design peer-to-peer (P2P) que elimina o design mestre-escravo. Além disso, cada nó em um cluster tem o mesmo design, o que significa que terá serviços de dados, indexação e consulta disponíveis. Isso elimina a necessidade de criar clusters especializados de replicação ou sharded.
Então, vamos dar uma olhada na criação de um cluster do Couchbase de vários nós. Como vamos fazer tudo localmente, faz sentido usar o Docker para essa tarefa.
Execute os seguintes comandos em sua CLI do Docker:
1 2 3 |
docker run -d -p 7091-7093:8091-8093 --name couchbase1 couchbase docker run -d -p 8091-8093:8091-8093 --name couchbase2 couchbase docker run -d -p 9091-9093:8091-8093 --name couchbase3 couchbase |
Os comandos acima criarão três contêineres do Couchbase Server, mapeando as portas do contêiner para um conjunto diferente de portas do host.
Como se trata do Docker, cada contêiner será uma nova instalação do Couchbase. O objetivo deste guia não é colocar o Couchbase em funcionamento, portanto, não analisaremos como passar por cada uma das cinco etapas de configuração.
Há várias maneiras de estabelecer um cluster no Couchbase, portanto, veremos algumas delas. Dos três contêineres, configure dois deles como novos clusters.
O nó não configurado, digamos couchbase1
será o primeiro que adicionaremos ao cluster. Vamos adicioná-lo ao mesmo cluster que o couchbase2
nó. Em seu navegador, navegue até http://localhost:7091 e optar por participar de um cluster.
O que importa aqui é o endereço IP, o nome de usuário e a senha administrativos do outro nó e os serviços que você deseja que estejam disponíveis.
Como estamos usando o Docker, é importante usar o endereço IP correto do couchbase2
nó. Para encontrar esse endereço IP, execute o seguinte comando:
1 |
docker inspecionar couchbase2 |
Procure o endereço IP nos resultados. É muito importante que você não tente usar localhost, pois esse é apenas o endereço vinculado, não o endereço real do contêiner.
Após o couchbase1
é adicionado ao nó couchbase2
o cluster precisa ser rebalanceado.
O rebalanceamento do cluster distribuirá os dados do Bucket uniformemente pelo cluster. É necessário fazer um rebalanceamento toda vez que você adicionar ou remover nós do cluster.
Agora você tem um cluster de dois nós com replicação e fragmentação automática de dados. Agora vamos verificar como adicionar o terceiro nó, já configurado, ao cluster.
Como o Couchbase é ponto a ponto, conecte-se a couchbase1
ou couchbase2
e escolha adicionar um novo servidor ao cluster.
Você precisará inserir as informações do nó para couchbase3
semelhante ao que fizemos anteriormente. Lembre-se de usar o endereço IP apropriado do contêiner.
Você acabou de adicionar um terceiro nó ao cluster. Não se esqueça de fazer o rebalanceamento para concluir o processo.
Há uma maneira de adicionar nós a um cluster ou ingressar em um cluster via CLI, mas não entraremos nesse assunto, pois não é mais difícil do que já vimos. O dimensionamento do Couchbase é um processo de duas etapas, independentemente de você ter três ou cinquenta nós.
Se você realmente gosta do Docker, escrevi um guia sobre como automatizar esse processo para o Couchbase em um Artigo anterior sobre o assunto.
Conclusão
Você acabou de ver como é muito mais fácil criar e dimensionar um cluster do Couchbase Server do que com o MongoDB. A complexidade extra em seu banco de dados NoSQL é um fardo com o qual nenhuma pessoa orientada a operações ou desenvolvedores quer lidar.
Se você estiver interessado em comparar mais o Couchbase com o MongoDB, escrevi alguns outros artigos voltados para o desenvolvedor sobre o assunto. Por exemplo, se quiser transferir seus dados do MongoDB para o Couchbase, você pode confira um tutorial de Golang que escreviou se você quiser converter sua API RESTful do Node.jsSe você estiver interessado em um site, também poderá encontrar material sobre o assunto.
Para obter mais informações sobre como usar o Couchbase, consulte o Portal do desenvolvedor do Couchbase.