Mongoose ile Birden Fazla Sunucudan Veri Almak (Express.js)

Ne zaman ihtiyaç duyarım?

MongoDB sunucusuna epey bir yük bindiği için, bazı raporlama sorgularında artık yetersiz kalmaya başlamıştı. Aklımıza verilerin bir kısmını ana sunucudan bir kısmını replika sunucumuzdan çekmek geldi fakat sorgularımız tek bir MongoUrl üzerinden gidip geliyordu. Sorguların replika sunucumuza gitmesi için Express serverda birkaç değişiklik yapmamız gerekti. Bu tarz 2. bir sunucuya ihtiyaç duyduğunuz zamanlarda, aşağıda göstereceğim yöntemi kullanabilirsiniz.

Nasıl kullanabilirim?

Express serverda bildiğiniz gibi normal şartlarda server başlangıç dosyamızda aşağıdaki gibi MongoDB’ye bağlanabiliyoruz.

// import mongoose
const mongoose = require('mongoose');
mongoose.connect("mongodb://localhost:27017/dbname");

db_connect.js içeriği

var mongoose = require('mongoose');// Create a connection for the primary MongoDB server
mongoose.primary_conn = mongoose.createConnection("mongodb://host1:27017/dbname");
mongoose.primary_conn.on('open', () => {
console.log("Connected correctly to the primary MongoDB server.");
});
mongoose.primary_conn.on('error', () => {
console.error.bind(console, 'connection primary MongoDB error:')
});
// Create a connection for the secondary MongoDB server
mongoose.secondary_conn = mongoose.createConnection("mongodb://host2:27017/dbname");
mongoose.secondary_conn.on('open', () => {
console.log("Connected correctly to the secondary MongoDB server.");
});
mongoose.secondary_conn.on('error', () => {
console.error.bind(console, 'connection secondary MongoDB error:')
});
module.exports = mongoose;

Users Model İçeriği

var mongoose = require('./db_connect');var userSchema = new Schema({
username: String,
firstname: String,
lastname: String,
createdAt: {type : Date, default : Date.now}
});
var Users = mongoose.primary_conn.model('users', userSchema);module.exports = Users;

Products Model İçeriği

// products model içeriği
var mongoose = require('./db_connect');
var productSchema = new Schema({
name: String,
code: String,
createdAt: {type : Date, default : Date.now}
});
var Products = mongoose.secondary_conn.model('products', productSchema);module.exports = Products;

Replika Konusunda Ufak Bir Not

Bu konuda benim karşılaştığım bir sorun şu oldu; Sorguları replika sunucuna gönderdiğim halde, otomatik olarak ana sunucuya gitti. Burada db_connect dosyasında replika sunucusuna giden Mongo URL’e 2 tane parametre eklemek gerekiyor.

  1. replicaSet=replName
    Replikasyonu kurarken kullandığımız replika setin adını vermek gerekiyor. Fakat bunu vermek yetmiyor, hala primary olan node hangisi ise ona gidiyor.
  2. readPreference=secondaryPreferred
    Bu parametre bütün sihri gerçekleştiren kısım. Verileri getirirken öncelikle secondary olan node hangisi ise, ondan getir. Eğer okuyamazsan ise primary olan node üzerinden getir diyoruz.
mongodb://localhost:27017/dbName?replicaSet=replName&readPreference=secondaryPreferred

--

--

Full-Stack Web Developer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store