sql >> Database >  >> NoSQL >> MongoDB

MongoDB-scherven implementeren en configureren met Ansible

Databasesystemen werken beter wanneer er een gedistribueerde werklast is over een aantal actieve instanties of liever gegevens op een gemakkelijke manier worden gecategoriseerd. MongoDB maakt gebruik van sharding, zodat gegevens in een bepaalde database worden gegroepeerd in overeenstemming met een bepaalde sleutel. Sharding verbetert de horizontale schaling, wat resulteert in betere prestaties en grotere betrouwbaarheid. Over het algemeen biedt MongoDB horizontale en verticale schaling in tegenstelling tot SQL DBMS, bijvoorbeeld MySQL dat alleen verticale schaling bevordert.

MongoDB heeft een losser consistentiemodel waarbij een document in een verzameling een extra sleutel kan hebben die afwezig zou zijn in andere documenten in dezelfde verzameling.

Sharden

Sharding is in feite het partitioneren van gegevens in afzonderlijke chunks en het definiëren van een reeks chunks voor verschillende shardservers. Een shardsleutel, die vaak een veld is dat aanwezig is in alle documenten in de te sharden database, wordt gebruikt om de gegevens te groeperen. Sharding werkt hand in hand met replicatie om de leesdoorvoer te versnellen door te zorgen voor een gedistribueerde werkbelasting over een aantal servers in plaats van afhankelijk te zijn van een enkele server. Bovendien zorgt replicatie ervoor dat kopieën van de geschreven gegevens beschikbaar zijn.

Laten we zeggen dat we 120 documenten in een verzameling hebben, deze gegevens kunnen zodanig worden geshard dat we 3 replicasets hebben en elk 40 documenten heeft, zoals weergegeven in de configuratie-instellingen hieronder. Als twee clients verzoeken verzenden, de ene om een ​​document op te halen dat in index 35 staat en de andere waarvan de index op 92 staat, wordt het verzoek ontvangen door de queryrouter (een mongos-proces) die op zijn beurt contact maakt met het configuratieknooppunt dat een record bijhoudt van hoe de reeksen van brokken zijn verdeeld over de scherven. Wanneer de opgegeven documentidentiteit wordt gevonden, wordt deze opgehaald uit de bijbehorende Shard. Bijvoorbeeld hierboven wordt het document van de eerste client opgehaald uit Shard A en voor client B wordt het document opgehaald uit Shard C. Over het algemeen zal er een gedistribueerde werkbelasting zijn die wordt gedefinieerd als horizontale schaling.

Als voor de opgegeven shards de grootte van een verzameling in een shard groter is dan de chunk_size, wordt de verzameling automatisch gesplitst en verdeeld over de shards met behulp van de gedefinieerde shardsleutel. In de implementatieconfiguratie hebben we voor het onderstaande voorbeeld 3 replicasets nodig, elk met een primaire en enkele secundairen. De primaire nodes fungeren ook als de sharding-servers.

De minimaal aanbevolen configuratie voor een MongoDB-productie-implementatie is ten minste drie shardservers, elk met een replicaset. Voor de beste prestaties worden de mongos-servers geïmplementeerd op afzonderlijke servers, terwijl de configuratieknooppunten zijn geïntegreerd met de shards.

MongoDB-scherven implementeren met Ansible

Het afzonderlijk configureren van shards en replicasets van een cluster is een omslachtige onderneming en daarom kiezen we voor eenvoudige tools zoals Ansible om de vereiste resultaten met veel gemak te bereiken. Playbooks worden gebruikt om de vereiste configuraties en taken te schrijven die Ansible-software zal uitvoeren.

Het systematische playbook-proces moet zijn:

  1. Mongo-basispakketten installeren (geen server, pymongo en opdrachtregelinterface)
  2. Installeer de mongodb-server. Volg deze handleiding om aan de slag te gaan.
  3. Stel mongod-instanties in en bijbehorende replicasets.
  4. Configureren en instellen van de configuratieservers
  5. Configureer en stel de Mongos-routeringsservice in.
  6. Voeg de scherven toe aan uw cluster.

Het playbook op het hoogste niveau zou er zo uit moeten zien

- 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

We kunnen het bovenstaande bestand opslaan als mongodbCluster.yml.

Multiplenines Word een MongoDB DBA - MongoDB naar productie brengenLeer over wat u moet weten om MongoDB gratis te implementeren, bewaken, beheren en schalen

Een eenvoudig mongodb.yml-bestand ziet er als volgt uit:

---
- 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

Naast de algemene parameters die vereist zijn bij de implementatie van een replicaset, hebben we deze nog twee nodig om de shards toe te voegen.

  • scherf: standaard is dit null. Dit is een Shard-verbindingsreeks die de indeling /host:port moet hebben. Bijvoorbeeld replica0/siteurl1.com:27017
  • staat: standaard is de waarde aanwezig die dicteert dat de shard aanwezig moet zijn, anders kan men deze als afwezig instellen.

Nadat je een replicaset hebt geïmplementeerd zoals uitgelegd in deze blog, kun je doorgaan met het toevoegen van de shards.

# 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

Na het instellen van al deze configuraties voeren we het playbook uit met het commando

ansible-playbook -i hosts mongodbCluster.yml

Zodra het playbook is voltooid, kunnen we inloggen op een van de mongos-servers en het commando sh.status() geven. Als de uitvoer zoiets is als hieronder, zijn de shards geïmplementeerd. Bovendien kun je de sleutel mongodb_shard zien als het succes is gewaardeerd.

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" }

Een scherf met de naam replica0 verwijderen

- mongodb_shard:
    login_user: admin
    login_password: root
    shard: replica0
    state: absent

Conclusie

Ansible heeft een belangrijke rol gespeeld bij het eenvoudig maken van het implementatieproces, omdat we alleen de taken hoeven te definiëren die moeten worden uitgevoerd. Stel je bijvoorbeeld voor dat je 40 replicasetleden had en je moet aan elk shards toevoegen. Als je de normale weg volgt, duurt het lang en zijn er veel menselijke fouten. Met ansible definieert u deze taken gewoon in een eenvoudig bestand genaamd playbook en ansible zorgt voor de taken wanneer het bestand wordt uitgevoerd.


  1. MongoDB $cos

  2. Hoe kan ik gegevens van de mongodb-verzameling in het dataframe van panda's laden?

  3. Redis als unieke atomaire id-generator - Thread veilige manier voor web-app om race-omstandigheden te voorkomen

  4. CDH 6.2-release:wat is er nieuw in HBase