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:
- Installer mongo-basispakker (ingen server, pymongo og kommandolinjegrænseflade)
- Installer mongodb-serveren. Følg denne vejledning for at komme i gang.
- Opsæt mongod-instanser og dertil korresponderende replikasæt.
- Konfigurer og opsæt konfigurationsserverne
- Konfigurer og opsæt Mongos-rutetjenesten.
- 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 gratisEn 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.