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.