Os sistemas de banco de dados funcionam melhor quando há uma carga de trabalho distribuída entre várias instâncias em execução, ou melhor, os dados são categorizados de maneira fácil. O MongoDB utiliza sharding de forma que os dados em um determinado banco de dados sejam agrupados de acordo com alguma chave. A fragmentação melhora o dimensionamento horizontal que consequentemente resulta em melhor desempenho e maior confiabilidade. Em geral, o MongoDB oferece dimensionamento horizontal e vertical em oposição ao SQL DBMS, como o MySQL, que promove apenas o dimensionamento vertical.
O MongoDB tem um modelo de consistência mais flexível pelo qual um documento em uma coleção pode ter uma chave adicional que estaria ausente de outros documentos na mesma coleção.
Fragmentação
Sharding é basicamente particionar dados em pedaços separados e, em seguida, definir um intervalo de pedaços para diferentes servidores de fragmentos. Uma chave de fragmentação, que geralmente é um campo presente em todos os documentos do banco de dados a serem fragmentados, é usada para agrupar os dados. A fragmentação funciona em conjunto com a replicação para acelerar a taxa de transferência de leitura, garantindo uma carga de trabalho distribuída entre vários servidores, em vez de depender de um único servidor. Além disso, a replicação garante que as cópias dos dados gravados estejam disponíveis.
Digamos que temos 120 documentos em uma coleção, esses dados podem ser fragmentados de forma que tenhamos 3 conjuntos de réplicas e cada um tenha 40 documentos, conforme descrito na configuração abaixo. Se dois clientes enviam requisições, um para buscar um documento que está no índice 35 e outro cujo índice está no 92, o pedido é recebido pelo roteador de consulta (um processo mongos) que por sua vez contata o nó de configuração que mantém um registro de como os intervalos de pedaços são distribuídos entre os fragmentos. Quando a identidade do documento especificada é encontrada, ela é buscada no estilhaço associado. Por exemplo acima, o documento do primeiro cliente será buscado no Shard A e para o cliente B, o documento será buscado no Shard C. Em geral, haverá uma carga de trabalho distribuída que é definida como escala horizontal.
Para os estilhaços fornecidos, se o tamanho de uma coleção em um estilhaço exceder o chunk_size, a coleção será dividida e balanceada entre os estilhaços automaticamente usando a chave de estilhaço definida. Na configuração de implantação, para o exemplo abaixo, precisaremos de 3 conjuntos de réplicas, cada um com um primário e alguns secundários. Os nós primários também atuam como servidores de fragmentação.
A configuração mínima recomendada para uma implantação de produção do MongoDB será de pelo menos três servidores de shard, cada um com um conjunto de réplicas. Para melhor desempenho, os servidores mongos são implementados em servidores separados enquanto os nós de configuração são integrados aos shards.
Implantando fragmentos do MongoDB com Ansible
Configurar fragmentos e conjuntos de réplicas de um cluster separadamente é uma tarefa complicada, portanto, resolvemos em ferramentas simples como o Ansible para obter os resultados necessários com muita facilidade. Os playbooks são usados para escrever as configurações e tarefas necessárias que o software Ansible executará.
O processo sistemático da cartilha deve ser:
- Instale os pacotes base do mongo (sem servidor, pymongo e interface de linha de comando)
- Instale o servidor mongodb. Siga este guia para começar.
- Configure instâncias do mongod e seus conjuntos de réplicas correspondentes.
- Configurar e configurar os servidores de configuração
- Configure e configure o serviço de roteamento Mongos.
- Adicione os fragmentos ao cluster.
O manual de nível superior deve ser assim
- name: install mongo base packages include: mongod.yml
tags: - mongod
- name: configure config server
include: configServer.yml
when: inventory_hostname in groups['mongoc-servers']
tags:
- cs
- name: configure mongos server
include: configMongos.yml
when: inventory_hostname in groups['mongos-server'] tags:
- mongos
- name: add shards
include: addShards.yml
when: inventory_hostname in groups['mongos-servers']
tags:
- mongos
- shards
Podemos salvar o arquivo acima como mongodbCluster.yml.
Vários noves Torne-se um DBA do MongoDB - Trazendo o MongoDB para a produçãoSaiba mais sobre o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o MongoDBBaixe gratuitamente
Um arquivo mongodb.yml simples terá a seguinte aparência:
---
- hosts: ansible-test
remote_user: root
become: yes
tasks:
- name: Import the public key used by the package management system
apt_key: keyserver=hkp://keyserver.ubuntu.com:80 id=7F0CEB10 state=present
- name: Add MongoDB repository
apt_repository: repo='deb <a class="vglnk" href="https://downloads-distro.mongodb.org/repo/ubuntu-upstart" rel="nofollow"><span>http</span><span>://</span><span>downloads</span><span>-</span><span>distro</span><span>.</span><span>mongodb</span><span>.</span><span>org</span><span>/</span><span>repo</span><span>/</span><span>ubuntu</span><span>-</span><span>upstart</span></a> dist 10gen' state=present
- name: install mongodb
apt: pkg=mongodb-org state=latest update_cache=yes
notify:
- start mongodb
handlers:
- name: start mongodb
service: name=mongod state=started
Para os parâmetros gerais necessários na implantação de um conjunto de réplicas, precisamos desses dois mais para adicionar os shards.
- fragmento: por padrão é nulo, Esta é uma string de conexão de fragmento que deve estar em um formato de
/host:port. Por exemplo replica0/siteurl1.com:27017 - estado: por padrão, o valor está presente, o que determina que o fragmento deve estar presente, caso contrário, pode-se defini-lo como ausente.
Depois de implantar um conjunto de réplicas conforme explicado neste blog, você pode adicionar os estilhaços.
# add a replicaset shard named replica0 with a member running on port 27017 on mongodb0.example.net
- mongodb_shard:
login_user: admin
login_password: root
shard: "replica0/mongodb1.example.net:27017"
state: present
# add a standalone mongod shard running on port 27018 of mongodb2.example.net
- mongodb_shard:
login_user: admin
login_password: root
shard: "mongodb2.example.net:27018"
state: present
# Single node shard running on localhost
- name: Ensure shard replica0 exists
mongodb_shard:
login_user: admin
login_password: root
shard: "replica0/localhost:3001"
state: present
# Single node shard running on localhost
- name: Ensure shard replica0 exists
mongodb_shard:
login_user: admin
login_password: root
shard: "replica0/localhost:3002"
state: present
Depois de definir todas essas configurações, executamos o playbook com o comando
ansible-playbook -i hosts mongodbCluster.yml
Assim que o playbook for concluído, podemos fazer login em qualquer um dos servidores mongos e emitir o comando sh.status(). Se a saída for parecida com a abaixo, os estilhaços foram implantados. Além disso, você pode ver a chave mongodb_shard se ela foi avaliada como sucesso.
mongos> sh.status()
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shardA", "host" : "locahhost1/web2:2017,locahhost3:2017" }
{ "_id" : "shardB", "host" : "locahhost3/web2:2018,locahhost3:2019" }
{ "_id" : "shardC", "host" : "locahhost3/web2:2019,locahhost3:2019" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
Para remover um fragmento chamado replica0
- mongodb_shard:
login_user: admin
login_password: root
shard: replica0
state: absent
Conclusão
O Ansible desempenhou um papel importante em facilitar o processo de implantação, pois precisamos apenas definir as tarefas que precisam ser executadas. Imagine, por exemplo, se você tivesse 40 membros do conjunto de réplicas e precisasse adicionar fragmentos a cada um. Seguir o caminho normal levará séculos e é propenso a muitos erros humanos. Com o ansible você apenas define essas tarefas em um arquivo simples chamado playbook e o ansible cuidará das tarefas quando o arquivo for executado.