sql >> Database >  >> NoSQL >> MongoDB

Zelf-gehoste MongoDB

U host uw MongoDB waarschijnlijk op een betrouwbare cloudserviceprovider, bijvoorbeeld Atlas, omdat u zich echt op uw idee wilt concentreren en alle subtiele sleutelbeheergebieden, zoals netwerken, opslag, toegang, enz. wilt delegeren.

Het ziet er in eerste instantie allemaal goed uit totdat uw kleine idee een bedrijf begint te worden en de kosten omhoog schieten. Zelfs als dat niet het geval is, geeft dit bericht je nog steeds een algemeen overzicht van de technische complexiteit (en bespaard geld!) als je zou migreren naar een zelf-gehoste oplossing.

BTW, over hoeveel besparingen hebben we het? Laten we een snelle vergelijking maken tussen een Atlas instantie en een zelf-gehoste MongoDB op AWS .

Atlas (~$166/maand)

$ 0,23/uur op basis van de hierboven geselecteerde vereisten (~ cloud.mongodb.com)



AWS (~$36/maand)

$ 0,0416/uur voor de instantie en aanvullende prijzen op basis van het EBS-type en de opslag (~ calculator.aws)

Het is een besparing van bijna 4,5x alleen al in termen van infrastructuur!

Nu je de belangrijkste reden(en) kent en dit bericht nog steeds leest, laten we zonder verder oponthoud in de technologie duiken.

Overzicht

  1. Infrastructuur opzetten
  2. MongoDB instellen
  3. Bulkmigratie
  4. Deltasynchronisatie om de latentie van de verbindingsschakelaar te overbruggen (niet van toepassing op verouderde clusters)

Omdat de hele inhoud op één plek een beetje vermoeiend kan zijn, ga ik dit in 2 gerelateerde berichten verdelen.

1. De infrastructuur opzetten

Ik ga hieronder de gids noemen voor het opzetten van een instantie met RedHat Enterprise Linux 8 op AWS. Dit komt omdat MongoDB over het algemeen beter presteert met het xfs-bestandssysteem. Hier is een artikel om het beter te begrijpen.

Spin-up van een EC2-instantie

Ik heb een t3.small . gebruikt instantie die wordt geleverd met 2 vCPU's en 2Gb RAM hoewel u elke instantie van uw keuze kunt selecteren.

Het wordt aanbevolen dat uw database toegang heeft tot ten minste 1GB RAM en 2 echte kernen omdat dat rechtstreeks van invloed is op de prestaties tijdens caching- en gelijktijdigheidsmechanismen zoals afgehandeld door de standaardengine WiredTiger . U kunt hier meer lezen over de productie-opmerkingen met betrekking tot de RAM- en CPU-vereisten .

Configuratieoverzicht:

  • OS:Redhat Enterprise Linux 8 (x64 intel-gebaseerd)
  • Instance Type:t3.small
  • Opslag:10 GB (os) + 30GB (gegevens) + 3GB (logboeken) van EBS d.w.z. 3 afzonderlijke volumes

Ik neem aan dat je bekend bent met het maken van een VM op AWS.

Als de instantie nu actief is, wijst u een elastisch IP-adres toe ernaartoe en doe dan gewoon een externe login op de machine.

We hebben de elastische IP . nodig openbare hostnaam instellen voor de instantie

$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>

Extra volumes koppelen

We hebben 2 extra EBS-volumes toegevoegd, behalve de Root FS voor gegevens en logboeken die nog moeten worden gemount (Herinner je je de 30Gb en 3Gb? ). U kunt de volumeblokken weergeven met,

$ sudo lsblk

De extra volumes worden direct na het rootblok weergegeven (zie de pijlen)

In de afbeelding hierboven kunt u zien dat de extra volumes heten

  1. xvdb (30Gb ruimte om gegevens op te slaan)
  2. xvdc (3Gb ruimte om logs op te slaan)

Laten we nu de bestandssystemen in die volumes maken.

$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc

-L is een aliasoptie voor het instellen van het volumelabel

En koppel vervolgens de volumes.

$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb

Om deze wijzigingen weer te geven, moet het systeem opnieuw worden opgestart. Daarom hebben we nu ook de partitiepersistentie nodig, zodat we in het geval van een onbedoelde herstart de databaseopslag niet verliezen.

We kunnen dit bereiken door de mount-regels op te geven in het fstab-bestand. Je kunt er hier meer over lezen.

Laten we eerst de UUID van de bovenstaande partities kopiëren (omdat ze uniek zijn en niet veranderen als het systeem opnieuw wordt opgestart )

$ sudo blkid

Kopieer de UUID's vermeld voor /dev/xvdb en /dev/xvdc . Raadpleeg het “LABEL” voor blokidentificatie

Open nu de /etc/fstab bestand en plak de configuratie in het volgende formaat.

UUID=<COPIED_UUID_FOR_DATA> /var/lib/mongo xfs defaults,nofail 0 0
UUID=<COPIED_UUID_FOR_LOGS> /var/log/mongodb xfs defaults,nofail 0 0

Hostnaam bijwerken

De hostnaam wordt gebruikt om uw databaseserver op het netwerk te identificeren. U kunt ofwel het hierboven toegewezen Elastic IP . gebruiken of Domeinnaam (indien beschikbaar). Open de /etc/hostname bestand en voeg het item toe. Voor bijv.

ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...

De proceslimieten bijwerken (optioneel)

Dit is optioneel vereist om het maximale aantal acceptabele verbindingen te controleren terwijl het systeem stabiel blijft.Open de /etc/security/limits.conf bestand en voeg de volgende items toe.

* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000

Nu alle infra-gerelateerde vereisten zijn gesorteerd, opnieuw opstarten de instantie, en laten we doorgaan met de installatie van MongoDB.

1. MongoDB instellen

De opslagbron toevoegen

Maak een bestand /etc/yum.repos.d/mongodb-org.4.2.repo en voeg de volgende pakketgegevens toe.

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

Laten we nu MongoDB installeren.

$ sudo yum -y install mongodb-org

Mappen maken en machtigingen instellen

MongoDB gebruikt standaard de volgende paden om de gegevens en de interne logboeken op te slaan:

/var/lib/mongo → Gegevens
/var/log/mongodb → Logboeken

Maak de mappen

$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb

Gebruikers- en groepsrechten wijzigen

$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod

Maak een beheerder aan

De mongod daemon/service moet eerst worden uitgevoerd voordat we doorgaan met het maken van een gebruiker. Laten we de standaardconfiguratie gebruiken (opgeslagen in /etc/mongod.conf ) voor nu en start het daemon-proces.

$ sudo -u mongod mongod -f /etc/mongod.conf

Het bovenstaande commando start de mongod-daemon in de fork-modus (standaard).

Laten we nu inloggen op de server en onze eerste admin-gebruiker maken.

Open een mongoschelp

$ mongo

Gebruik de "admin" database om de root-admin aan te maken

> use admin

Maak de admin-gebruiker

> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})

Maak een gewone gebruiker

> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})

Sluit de server voor nu af. We herstarten opnieuw met de gewijzigde configuratie

> db.shutDownServer()

Verificatie instellen

Hier schakelen we de database-authenticatie in en wijzigen we het bindadres voor onze server om toegankelijk te zijn in het publieke domein.Open /etc/mongod.conf en breng de onderstaande wijzigingen aan.

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0 # accessible on the network address
security:
  authorization: enabled # creds will be required for making db operations

Sla de configuratie op en start opnieuw de server.

$ sudo -u mongod mongod -f /etc/mongod.conf

Test login

U kunt controleren of de inloggegevens werken met,

$ mongo -u admin -p password

Dat is het over de initiële setup! Blijf op de hoogte voor mijn volgende gerelateerde bericht over het gedetailleerde migratieproces en tips om de DB productiegereed te houden.

PS Met dank aan Piyush Kumar voor het helpen samenstellen van dit bericht!


  1. vervallen redis-cachesleutel op bepaalde uren in plaats van duur

  2. Hoe maak je db (key_space) in redis

  3. Hoe mangoest Promise te gebruiken - mongo

  4. Redistogo en Sidekiq op Heroku:kan geen verbinding maken