MongoDB klastri loomine Pilviol
Selles juhendis loome MongoDB replica set klastri kolmel Pilvio VM-il, kasutades privaatvõrku noodide vaheliseks suhtluseks.
Mida ehitame
- 3-noodiga MongoDB 7 replica set
- Pilvio privaatvõrk noodide vaheliseks turvaliseks suhtluseks
- Keyfile autentimine klastri noodide vahel
- Varundamine StorageVault'i (S3)
Eeldused
- Pilvio konto ja API token (vaata ülevaadet)
- Põhiteadmised MongoDB-st
- Vähemalt 3 VM-i loomise võimekus (arvelduskonto)
1. samm: Privaatvõrgu loomine
Kõik MongoDB noodid peavad olema samas privaatvõrgus:
# Loo privaatvõrk (või kasuta vaikimisi võrku)
curl "https://api.pilvio.com/v1/network/network?name=mongodb-cluster" \
-H "apikey: SINU_PILVIO_TOKEN" \
-X POST
Pane vastusest kirja uuid — seda vajad VM-ide loomisel.
2. samm: VM-ide loomine
Loo 3 VM-i samasse privaatvõrku:
# Nood 1 (primary)
curl "https://api.pilvio.com/v1/user-resource/vm" \
-H "apikey: SINU_PILVIO_TOKEN" \
-X POST \
-d "name=mongo-node-1" \
-d "os_name=ubuntu" \
-d "os_version=24.04" \
-d "vcpu=2" -d "ram=4096" -d "disks=50" \
-d "username=deploy" \
-d "password=TurvalineParool123!" \
-d "network_uuid=SINU_NETWORK_UUID" \
-d "reserve_public_ip=False"
# Nood 2 (secondary)
curl "https://api.pilvio.com/v1/user-resource/vm" \
-H "apikey: SINU_PILVIO_TOKEN" \
-X POST \
-d "name=mongo-node-2" \
-d "os_name=ubuntu" \
-d "os_version=24.04" \
-d "vcpu=2" -d "ram=4096" -d "disks=50" \
-d "username=deploy" \
-d "password=TurvalineParool123!" \
-d "network_uuid=SINU_NETWORK_UUID" \
-d "reserve_public_ip=False"
# Nood 3 (secondary/arbiter)
curl "https://api.pilvio.com/v1/user-resource/vm" \
-H "apikey: SINU_PILVIO_TOKEN" \
-X POST \
-d "name=mongo-node-3" \
-d "os_name=ubuntu" \
-d "os_version=24.04" \
-d "vcpu=2" -d "ram=4096" -d "disks=50" \
-d "username=deploy" \
-d "password=TurvalineParool123!" \
-d "network_uuid=SINU_NETWORK_UUID" \
-d "reserve_public_ip=False"
Märkus:
reserve_public_ip=False— andmebaasi noodidel ei ole avalikku IP-d vaja. Halda neid läbi jump-hosti või ühenda ühest VM-ist, millel on Floating IP.
Pane kirja iga VM-i private_ipv4:
mongo-node-1: 10.x.x.1
mongo-node-2: 10.x.x.2
mongo-node-3: 10.x.x.3
3. samm: Tulemüür
curl "https://api.pilvio.com/v1/network/firewall" \
-H "apikey: SINU_PILVIO_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
--data '{
"name": "mongodb-cluster-fw",
"rules": [
{
"protocol": "tcp",
"direction": "inbound",
"port_start": 22,
"port_end": 22,
"endpoint_spec_type": "ip_prefixes",
"endpoint_spec": ["10.0.0.0/8"]
},
{
"protocol": "tcp",
"direction": "inbound",
"port_start": 27017,
"port_end": 27017,
"endpoint_spec_type": "ip_prefixes",
"endpoint_spec": ["10.0.0.0/8"]
}
]
}'
Seo tulemüür kõigi kolme VM-iga.
4. samm: MongoDB paigaldamine (kõigil noodidel)
Ühendu iga noodiga (läbi jump-hosti) ja käivita:
# MongoDB 7 GPG võti ja repo
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
5. samm: Keyfile autentimine
Loo keyfile ühel noodil ja kopeeri teistele:
# Nood 1-l:
openssl rand -base64 756 > /tmp/mongodb-keyfile
chmod 400 /tmp/mongodb-keyfile
sudo cp /tmp/mongodb-keyfile /etc/mongodb-keyfile
sudo chown mongodb:mongodb /etc/mongodb-keyfile
# Kopeeri teistele noodidele
scp /tmp/mongodb-keyfile deploy@10.x.x.2:/tmp/
scp /tmp/mongodb-keyfile deploy@10.x.x.3:/tmp/
# Igal noodil:
sudo cp /tmp/mongodb-keyfile /etc/mongodb-keyfile
sudo chown mongodb:mongodb /etc/mongodb-keyfile
sudo chmod 400 /etc/mongodb-keyfile
6. samm: MongoDB seadistamine (kõigil noodidel)
Muuda /etc/mongod.conf igal noodil:
storage:
dbPath: /var/lib/mongodb
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
port: 27017
bindIp: 0.0.0.0 # Tulemüür piirab ligipääsu
security:
keyFile: /etc/mongodb-keyfile
authorization: enabled
replication:
replSetName: "pilvio-rs"
Käivita MongoDB kõigil noodidel:
sudo systemctl enable --now mongod
7. samm: Replica set'i initsialiseerimine
Ühendu nood 1-ga ja initsialiseeri klaster:
mongosh --host 10.x.x.1
# Initsialiseerimne
rs.initiate({
_id: "pilvio-rs",
members: [
{ _id: 0, host: "10.x.x.1:27017", priority: 2 },
{ _id: 1, host: "10.x.x.2:27017", priority: 1 },
{ _id: 2, host: "10.x.x.3:27017", priority: 1 }
]
})
# Kontrolli staatust
rs.status()
Admin kasutaja loomine
// Kasuta admin andmebaasi
use admin
db.createUser({
user: "admin",
pwd: "tugev-admin-parool",
roles: [{ role: "root", db: "admin" }]
})
// Rakenduse kasutaja
use myapp
db.createUser({
user: "app_user",
pwd: "tugev-app-parool",
roles: [{ role: "readWrite", db: "myapp" }]
})
8. samm: Varundamine StorageVault'i
Loo fail /home/deploy/backup-mongo.sh (primary noodil):
#!/bin/bash
set -euo pipefail
BUCKET="minu-mongo-backups"
S3_ENDPOINT="https://s3.pilvio.com:8080"
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/tmp/mongo-backups/${DATE}"
# Dump
mongodump \
--uri="mongodb://admin:tugev-admin-parool@10.x.x.1:27017/myapp?authSource=admin&replicaSet=pilvio-rs" \
--out="$BACKUP_DIR" \
--gzip
# Pakendi ja lae üles
tar -cf - -C "$BACKUP_DIR" . | \
aws s3 cp - "s3://${BUCKET}/mongodb/${DATE}.tar" \
--endpoint-url "$S3_ENDPOINT"
# Puhasta
rm -rf "$BACKUP_DIR"
echo "[$(date)] MongoDB varundamine lõpetatud"
chmod +x /home/deploy/backup-mongo.sh
(crontab -l 2>/dev/null; echo "0 3 * * * /home/deploy/backup-mongo.sh >> /var/log/mongo-backup.log 2>&1") | crontab -
9. samm: Taastamine
# Lae alla
aws s3 cp s3://minu-mongo-backups/mongodb/20250211-030000.tar /tmp/ \
--endpoint-url https://s3.pilvio.com:8080
mkdir -p /tmp/mongo-restore
tar -xf /tmp/20250211-030000.tar -C /tmp/mongo-restore
# Taasta
mongorestore \
--uri="mongodb://admin:tugev-admin-parool@10.x.x.1:27017/?authSource=admin&replicaSet=pilvio-rs" \
--gzip \
/tmp/mongo-restore
Ühendamine rakendusega
# MongoDB connection string (replica set)
mongodb://app_user:tugev-app-parool@10.x.x.1:27017,10.x.x.2:27017,10.x.x.3:27017/myapp?authSource=myapp&replicaSet=pilvio-rs
// Node.js näide
const { MongoClient } = require('mongodb');
const uri = 'mongodb://app_user:tugev-app-parool@10.x.x.1:27017,10.x.x.2:27017,10.x.x.3:27017/myapp?authSource=myapp&replicaSet=pilvio-rs';
const client = new MongoClient(uri);
# Python näide
from pymongo import MongoClient
client = MongoClient(
'mongodb://app_user:tugev-app-parool@10.x.x.1:27017,10.x.x.2:27017,10.x.x.3:27017/myapp',
authSource='myapp',
replicaSet='pilvio-rs'
)
Järgmised sammud: Ühenda MongoDB klaster oma Node.js või Go backendiga.