MongoDB’nin replika set mimarisi, veri bütünlüğünü sağlamak ve yüksek erişilebilirlik sunmak için kullanılır. Ancak bazı durumlarda (özellikle tek sunuculu sistemlerde) replika set yapılandırması ek kaynak tüketimine yol açabilir. Bu yazıda Docker Compose kullanarak tek bir sunucuda MongoDB’yi Single Replica olarak nasıl yapılandırılacağını göstereceğiz.

Docker container olarak aşağıdaki manifest’i kullanacağız:

version: '3.8'
services:
  mongodb:
    # MongoDB'yi en güncel versiyondan çalıştırıyoruz
    image: mongo:latest
    # Replika set başlatmak için gerekli komut
    command: mongod --replSet rs0 --bind_ip_all --keyFile /etc/mongodb/mongodb.key
    container_name: mongodb
    restart: always
    environment:
      # Yetkili kullanıcı adı ve parolası
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: parola..
    ports:
      - "27017:27017"
    volumes:
      - mongodb_data:/data/db
      # Replika set için gerekli key dosyasını bağlama
      - ./mongodb.key:/etc/mongodb/mongodb.key:ro
    user: "999:999"

volumes:
  mongodb_data:

Container ayağa kaldırmadan önce gerekli key dosyasını oluşturalım ve sadece 999 kullanıcısına yetki verelim:

# Güvenli bir key dosyası oluşturuyoruz
openssl rand -base64 756 > mongodb.key
chmod 600 mongodb.key
# Dosyanın erişim yetkilerini yalnızca belirli bir kullanıcıya veriyoruz
sudo chown 999:999 mongodb.key

Şimdi container ayağa kalkmak için hazır:

sudo docker-compose up -d

Container’a mongosh ile yetkili olarak bağlanalım:

sudo docker exec -it mongodb mongosh -u admin -p parola..

Bir replika set oluşturalım, burada sunucu ip adresini veya hostname girmeyi unutmayın:

rs.initiate({
  _id: "rs0",
  members: [{
    _id: 0,
    host: "<sunucu-ip>:27017"
  }]
})

Replika durumunu kontrol edelim:

rs.status()

Eğer olur da bu işlemlerden sonra tekrar ip/hostname değiştirmeniz gerekirse:

var config = rs.conf()
config.members[0].host = "<ip-adresini>:27017"
rs.reconfig(config)

Bu bağlantı stringini kullanarak MongoDB sunucusuna bağlanabilirsiniz:

mongodb://admin:<parola>@<ip-adresi>:27017/?replicaSet=rs0&authSource=admin


MongoDB Atlas’dan Veri Taşıma (Yedekleme ve Geri Yükleme)

Tüm yedekleme işlemlerini kolaylık ve güvenlik açısından sunucu üzerinde yapacağız.

Bu işlemler sırasında sunucumuzda bulunması gereken uygulamaları açıklayalım.
mongosh: MongoDB sunucusuna bağlanmak ve veritabanı işlemlerini gerçekleştirmek için kullanılan komut satırı aracı.
mongodump: MongoDB veritabanlarını yedeklemek için kullanılır.
mongorestore: Alınan yedek dosyalarını yeni bir MongoDB sunucusuna geri yüklemek için kullanılır.

Uygulamalar sunucunuzda kurulu değil ise:

// mongosh
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

// Güncelleme ve kurulum
sudo apt-get update
sudo apt-get install -y mongodb-mongosh

// mongodump ve mongorestore
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] 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-database-tools

MongoDB Atlas’tan Yedekleme:

mongodump --uri="mongodb+srv://<kullanıcı-adınız>:<parolanız>@<cluster-adresiniz>.mongodb.net/<db-adı>" --out=<db-adı>

Bağlantı içerisindeki <kullanıcı-adınız>, <parolanız>, <cluster-adresiniz>, <db-adı> alanlarını düzenlemelisiniz. Her db/tablo için uygulayarak yedek alma işlemini tamamladıktan sonra restore işlemine geçebilirsiniz.

Yedeği Yeni Sunucuya Yükleme:

mongorestore --uri="mongodb://admin:<parolanı>@localhost:27017/?replicaSet=rs0&authSource=admin" --authenticationDatabase=admin

NOT: Eğer yedeği geri yükleme sırasında mevcut database’i silmek isterseniz --drop <db-adı>/ parametresini ekleyebilirsiniz.

Kategori: