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.