Election kısa sürse bile uygulama hissedebilir
MongoDB replica set içinde primary erişilemez olduğunda veya bakım için değiştiğinde election süreci başlar. Yeni primary seçilene kadar yazma işlemleri kısa süreli başarısız olabilir.
Bu pencere çoğu zaman saniyelerle ölçülür; ama uygulama timeout değerleri çok kısa, retry davranışı zayıf veya bağlantı havuzu yanlış kurulmuşsa kullanıcı tarafında daha büyük etki yaratır.
- Okuma ve yazma davranışı ayrı değerlendirilmelidir.
- Driver replica set topolojisini doğru bilmelidir.
- serverSelectionTimeoutMS değeri gerçek beklentiye göre ayarlanmalıdır.
- Retry davranışı idempotent olmayan işlemlerde dikkatle ele alınmalıdır.
Bağlantı dizesi doğru topolojiyi anlatmalı
Uygulama yalnızca tek node adresiyle bağlanıyorsa primary değişiminde toparlanma zayıflayabilir. Replica set üyeleri ve replicaSet parametresi bağlantı dizesinde doğru yer almalıdır.
Managed veya self-hosted fark etmez; driver’ın topolojiyi görebilmesi gerekir. Aksi halde veritabanı tarafı sağlıklı olsa bile uygulama yanlış kapıyı çalmaya devam edebilir.
Replica set bağlantı dizesi örneği
mongodb://app_user:***@mongo-0.example:27017,mongo-1.example:27017,mongo-2.example:27017/app?replicaSet=rs0&retryWrites=true&w=majority
Write concern kararını uygulama etkisiyle birlikte verin
w: majority daha güçlü dayanıklılık sinyali verir; ama gecikme ve failover anındaki davranışı etkileyebilir. w: 1 daha hızlı olabilir ama primary düşüşü sırasında son yazıların riski artabilir.
Bu karar teknik olduğu kadar ürün kararıdır. Sepet görüntüleme ile ödeme onayı aynı write concern seviyesine ihtiyaç duymayabilir.
Failover sonrası kontrol listesi
Primary değişimi test edildikten sonra yalnızca MongoDB durumuna bakmayın. Uygulama hata oranı, yazma gecikmesi, bağlantı havuzu, tekrar denenen işlemler ve kullanıcı etkisi birlikte okunmalıdır.
Testin sonucu “failover oldu” değil, “uygulama şu kadar süre etkilendi ve şu işlemler güvenle toparlandı” olmalıdır.
MongoDB primary kontrolü
rs.status().members.map(function(member) {
return {
name: member.name,
stateStr: member.stateStr,
optimeDate: member.optimeDate
}
})