sql >> Database teknologi >  >> NoSQL >> MongoDB

Implementering og konfiguration af MongoDB Shards med Ansible

Databasesystemer fungerer bedre, når der er en fordelt arbejdsbyrde blandt en række kørende forekomster eller rettere, data er kategoriseret på en nem måde. MongoDB bruger sharding, således at data i en given database er grupperet i overensstemmelse med en eller anden nøgle. Sharding forbedrer horisontal skalering, hvilket resulterer i bedre ydeevne og øget pålidelighed. Generelt tilbyder MongoDB horisontal og vertikal skalering i modsætning til SQL DBMS for eksempel MySQL, der kun fremmer vertikal skalering.

MongoDB har en løsere konsistensmodel, hvorved et dokument i en samling kan have en ekstra nøgle, som ville være fraværende i andre dokumenter i samme samling.

Sharding

Sharding er grundlæggende at opdele data i separate bidder og derefter definere en række bidder til forskellige shard-servere. En shard-nøgle, som ofte er et felt, der er til stede i alle dokumenterne i databasen, der skal shardes, bruges til at gruppere dataene. Sharding arbejder hånd i hånd med replikering for at øge læsegennemstrømningen ved at sikre en fordelt arbejdsbyrde blandt et antal servere i stedet for at være afhængig af en enkelt server. Desuden sikrer replikering, at kopier af de skrevne data er tilgængelige.

Lad os sige, at vi har 120 dokumenter i en samling, disse data kan deles, så vi har 3 replikasæt og hver har 40 dokumenter som afbildet i konfigurationsopsætningen nedenfor. Hvis to klienter sender anmodninger, den ene om at hente et dokument, der er i indeks 35, og den anden, hvis indeks er på 92, modtages anmodningen af ​​forespørgselsrouteren (en mongo-proces), der igen kontakter konfigurationsknuden, som registrerer hvordan intervallerne af bidder er fordelt mellem skårene. Når den angivne dokumentidentitet er fundet, hentes den derefter fra det tilknyttede shard. For eksempel ovenfor vil den første klients dokument blive hentet fra Shard A og for klient B vil dokumentet blive hentet fra Shard C. Generelt vil der være en distribueret arbejdsbyrde, som er defineret som horisontal skalering.

For de givne shards, hvis størrelsen af ​​en samling i et shard overstiger chunk_size, vil samlingen automatisk blive opdelt og balanceret på tværs af shards ved hjælp af den definerede shard-nøgle. I installationsopsætningen skal vi til eksemplet nedenfor bruge 3 replikasæt hver med en primær og nogle sekundære. De primære noder fungerer også som sharding-servere.

Den anbefalede minimumskonfiguration for en MongoDB-produktionsinstallation vil være mindst tre shard-servere med hver et replikasæt. For den bedste ydeevne er mongos-serverne installeret på separate servere, mens konfigurationsknuderne er integreret med shards.

Implementering af MongoDB Shards med Ansible

At konfigurere shards og replikasæt af en klynge separat er en besværlig opgave, og derfor løser vi os i simple værktøjer som Ansible for at opnå de ønskede resultater med stor lethed. Playbooks bruges til at skrive de nødvendige konfigurationer og opgaver, som Ansible-softwaren skal udføre.

Den systematiske playbook-proces bør være:

  1. Installer mongo-basispakker (ingen server, pymongo og kommandolinjegrænseflade)
  2. Installer mongodb-serveren. Følg denne vejledning for at komme i gang.
  3. Opsæt mongod-instanser og dertil korresponderende replikasæt.
  4. Konfigurer og opsæt konfigurationsserverne
  5. Konfigurer og opsæt Mongos-rutetjenesten.
  6. Føj skårene til din klynge.

Spillebogen på øverste niveau skulle se sådan ud

- 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

Vi kan gemme filen ovenfor som mongodbCluster.yml.

Severalnines Bliv en MongoDB DBA - Bring MongoDB to ProductionFå flere oplysninger om, hvad du skal vide for at implementere, overvåge, administrere og skalere MongoDBDownload gratis

En simpel mongodb.yml-fil vil se sådan ud:

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

Til de generelle parametre, der kræves i implementeringen af ​​et replikasæt, har vi brug for disse to mere for at tilføje skårene.

  • shard: som standard er den null. Dette er en shard-forbindelsesstreng, som skal være i formatet /host:port. For eksempel replica0/siteurl1.com:27017
  • oplys: som standard er værdien til stede, hvilket dikterer, at sharden skal være til stede, ellers kan man indstille den til at være fraværende.

Efter at have implementeret et replikasæt som forklaret i denne blog, kan du fortsætte med at tilføje 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 

Efter at have opsat alle disse konfigurationer kører vi playbook med kommandoen

ansible-playbook -i hosts mongodbCluster.yml 

Når playbook er færdig, kan vi logge ind på enhver af mongos-serverne og udstede kommandoen sh.status(). Hvis outputtet er noget som nedenfor, er skårene blevet installeret. Desuden kan du se nøglen mongodb_shard, hvis den har været værdsat succes.

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

For at fjerne et shard kaldet replica0

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

Konklusion

Ansible har spillet en stor rolle i at gøre implementeringsprocessen let, da vi kun skal definere de opgaver, der skal udføres. Forestil dig for eksempel, hvis du havde 40 replikasætmedlemmer, og du skal tilføje skår til hver. At gå den normale vej vil tage dig aldre og er tilbøjelig til en masse menneskelige fejl. Med ansible definerer du bare disse opgaver i en simpel fil kaldet playbook, og ansible tager sig af opgaverne, når filen udføres.


  1. Kan mongorestore tage et enkelt url-argument i stedet for separate argumenter?

  2. Sådan løses MongoError:pulje ødelagt under forbindelse til CosmosDB

  3. Sådan kommer du i gang med databaseautomatisering

  4. ImportError:Intet modul med navnet objectid