MongoDB Java sürücüsü MongoOptions, üretim kullanımı için nasıl yapılandırılır?


100

MongoDB Java sürücüsü için MongoOptions'ı yapılandırmak için en iyi uygulamaları aramak için web'de arama yapıyorum ve API dışında pek bir şey bulamadım. Bu arama "com.mongodb.DBPortPool $ SemaphoresOut: db bağlantısı almak için semafor dışında" hatasıyla karşılaştıktan sonra başladı ve bağlantıları / çarpanı artırarak bu sorunu çözebildim. Bu seçeneklerin üretim için yapılandırılmasıyla ilgili bağlantıları veya en iyi uygulamalarınızı arıyorum.

2.4 sürücüsü için seçenekler şunlardır: http://api.mongodb.org/java/2.4/com/mongodb/MongoOptions.html

  • autoConnectRetry
  • connectionPerHost
  • Bağlantı zaman aşımı
  • maxWaitTime
  • socketTimeout
  • threadAllowedToBlockForConnectionMultiplier

Yeni sürücülerin daha fazla seçeneği var ve bunları da duymak isterim.

Yanıtlar:


160

2.9'a güncellendi:

  • autoConnectRetry , sürücünün beklenmedik bağlantı kesintilerinin ardından otomatik olarak sunuculara yeniden bağlanmaya çalışacağı anlamına gelir. Üretim ortamlarında genellikle bunun doğru olmasını istersiniz.

  • connectionPerHost , tek bir Mongo örneğinin (tekildir, böylece genellikle uygulama başına bir tane olur) bir mongod / mongos sürecine kurabileceği fiziksel bağlantı miktarıdır. Yazma sırasında, java sürücüsü, gerçek sorgu verimi düşük olsa bile, sonunda bu miktarda bağlantı kuracaktır (kelime sırasına göre, uygulama sunucusu başına bu sayıya ulaşana kadar mongostat'ta "conn" istatistiğinin yükseldiğini göreceksiniz).

    Çoğu durumda bunu 100'den yükseğe ayarlamaya gerek yoktur, ancak bu ayar "test et ve gör" şeylerinden biridir. Sunucunuza olan toplam bağlantı miktarının aşmaması için bunu yeterince düşük ayarladığınızdan emin olmanız gerektiğini unutmayın.

    db.serverStatus().connections.available

    Üretimde şu anda 40'da bu var.

  • connectTimeout . Adından da anlaşılacağı gibi, sürücü bir bağlantı girişimi iptal edilmeden önce bekleyecektir. Zaman aşımını uzun bir şeye (15-30 saniye) ayarlayın, gerçekçi, beklenen bir şans yoksa bu, aksi takdirde başarılı bağlantı girişimlerinin önüne geçecektir. Normalde, bir bağlantı girişimi birkaç saniyeden uzun sürerse, ağ altyapınız yüksek verim sağlayamaz.

  • maxWaitTime . Bir iş parçacığının bir bağlantının bağlantı havuzunda kullanılabilir olmasını bekleyeceği ms sayısı ve bu zaman içinde olmazsa bir istisna oluşturur. Varsayılanı koruyun.

  • socketTimeout . Standart soket zaman aşımı değeri. 60 saniyeye (60000) ayarlayın.

  • threadAllowedToBlockForConnectionMultiplier . Havuz şu anda tükendiyse bağlantıların kullanılabilir hale gelmesini beklemesine izin verilen iş parçacığı sayısını belirten connectionPerHost çarpanı. Bu, "com.mongodb.DBPortPool $ SemaphoresOut: Semaforların db bağlantısı almak için tükendi" istisnasına neden olacak ayardır. Bu iş parçacığı kuyruğu threadAllowedToBlockForConnectionMultiplier değerini aştığında bu istisnayı atar. Örneğin, linksPerHost 10 ise ve bu değer 5 ise, yukarıda belirtilen istisna atılmadan önce 50'ye kadar iş parçacığı engellenebilir.

    Verimlilikte büyük kuyruklara neden olabilecek büyük zirveler bekliyorsanız, bu değeri geçici olarak artırın. Tam da bu nedenle şu anda 1500'e sahibiz. Sorgunuz sürekli olarak sunucuyu aşıyorsa, sadece donanım / ölçekleme durumunuzu buna göre iyileştirmelisiniz.

  • readPreference . (GÜNCELLENDİ, 2.8+) Varsayılan okuma tercihini belirlemek için kullanılır ve "slaveOk" yerine geçer. Sınıf fabrikası yöntemlerinden biri aracılığıyla bir ReadPreference ayarlayın. En yaygın ayarların tam açıklaması bu yazının sonunda bulunabilir.

  • w . (GÜNCELLENDİ, 2.6+) Bu değer, yazmanın "güvenliğini" belirler. Bu değer -1 olduğunda yazma, ağ veya veritabanı hatalarından bağımsız olarak herhangi bir hata bildirmez. WriteConcern.NONE, bunun için önceden tanımlanmış uygun WriteConcern'dir. Eğer w 0 ise, ağ hataları yazma işleminin başarısız olmasına neden olur, ancak mongo hataları olmaz. Bu genellikle "ateş et ve unut" yazıları olarak adlandırılır ve performans tutarlılık ve dayanıklılıktan daha önemli olduğunda kullanılmalıdır. Bu mod için WriteConcern.NORMAL'ı kullanın.

    W değerini 1 veya daha yüksek bir değere ayarlarsanız yazma güvenli kabul edilir. Güvenli yazmalar, yazmayı gerçekleştirir ve yazmanın başarılı olduğundan emin olmak için sunucuya yapılan bir istekle onu takip eder veya başarısız olursa bir hata değeri alır (başka bir deyişle, siz yazdıktan sonra bir getLastError () komutu gönderir). Bu getLastError () komutu tamamlanana kadar bağlantının ayrıldığını unutmayın. Bunun ve ek komutun bir sonucu olarak, verim w <= 0 ile yazılanlardan önemli ölçüde daha düşük olacaktır. Aw değeri tam olarak 1 olan MongoDB, yazmayı gönderdiğiniz örnekte yazmanın başarılı olduğunu (veya doğrulanabilir şekilde başarısız olduğunu) garanti eder.

    Replika kümeleri söz konusu olduğunda, MongoDB'ye yazmayı geri dönmeden önce replika kümesinin en az "w" üyelerine göndermesini söyleyen w için daha yüksek değerler kullanabilirsiniz (veya daha doğrusu, "w" üyelerine yazmanızın replikasyonunu bekleyin ). Ayrıca, w değerini, MongoDB'ye çoğaltma kümesi üyelerinin çoğuna (WriteConcern.MAJORITY) yazma işlemini gerçekleştirmesini söyleyen "çoğunluk" dizesine de ayarlayabilirsiniz. Normalde, ham performansa (-1 veya 0) veya çoğaltılmış yazmalara (> 1) ihtiyacınız yoksa bunu 1 olarak ayarlamanız gerekir. 1'den yüksek değerler, yazma performansı üzerinde önemli bir etkiye sahiptir.

  • fsync . Mongo'yu, etkinleştirildiğinde her yazma işleminden sonra diske temizlemeye zorlayan dayanıklılık seçeneği. Bir yazma birikimiyle ilgili hiçbir dayanıklılık sorunu yaşamadım, bu yüzden üretimde yanlış (varsayılan) olarak bunu yapıyoruz.

  • j * (YENİ 2.7+) *. True olarak ayarlandığında, MongoDB'yi geri dönmeden önce başarılı bir günlük kaydı grubu işlemesini beklemeye zorlayan Boole. Günlük tutmayı etkinleştirdiyseniz, ek dayanıklılık için bunu etkinleştirebilirsiniz. Günlük tutmanın size ne kazandırdığını (ve dolayısıyla bu bayrağı neden etkinleştirmek isteyebileceğinizi) görmek için http://www.mongodb.org/display/DOCS/Journaling adresine bakın.

ReadPreference ReadPreference sınıfı, çoğaltma kümeleriyle çalışıyorsanız hangi mongod örnek sorgularının yönlendirileceğini yapılandırmanıza olanak tanır. Aşağıdaki seçenekler mevcuttur:

  • ReadPreference.primary () : Tüm okumalar yalnızca tekrar ayarlı birincil üyeye gider. Tüm sorguların tutarlı (en son yazılan) veriler döndürmesini istiyorsanız bunu kullanın. Bu varsayılandır.

  • ReadPreference.primaryPreferred () : Mümkünse tüm okumalar tekrar ayarlı birincil üyeye gider, ancak birincil düğüm kullanılamıyorsa ikincil üyeleri sorgulayabilir. Örneğin birincil kullanılamaz hale gelirse, okumalar sonunda tutarlı hale gelir, ancak yalnızca birincil kullanılamıyorsa.

  • ReadPreference.secondary () : Tüm okumalar ikincil tekrar kümesi üyelerine gider ve birincil üye yalnızca yazma işlemleri için kullanılır. Bunu yalnızca sonunda tutarlı okumalarla yaşayabiliyorsanız kullanın. Bir temsilcinin sahip olabileceği (oylama) üye sayısı için sınırlamalar olsa da, okuma performansını artırmak için ek tekrar seti üyeleri kullanılabilir.

  • ReadPreference.secondaryPreferred () : Herhangi biri varsa tüm okumalar ikincil tekrar seti üyelerine gider. Birincil üye, tüm ikincil üyeler kullanılamaz hale gelmedikçe yalnızca yazma işlemleri için kullanılır. Okumalar için birincil üyeye geri dönüş dışında bu, ReadPreference.secondary () ile aynıdır.

  • ReadPreference.nearest () : Okur, veritabanı istemcisinin kullanabileceği en yakın tekrar küme üyesine gider. Yalnızca nihai olarak tutarlı okumalar kabul edilebilirse kullanın. En yakın üye, müşteri ile çeşitli tekrar grubu üyeleri arasında en düşük gecikmeye sahip üyedir. Meşgul üyeler sonunda daha yüksek gecikmelere sahip olacağından, bu aynı zamanda okuma yükünü otomatik olarak dengelemelidir, ancak benim deneyimime göre ikincil (Tercihli), üye gecikmeleri nispeten tutarlıysa bunu daha iyi yapıyor gibi görünmektedir.

Not: Yukarıdakilerin tümü, bunun yerine TaggableReadPreference örneklerini döndüren aynı yöntemin etiket etkin sürümlerine sahiptir. Çoğaltma kümesi etiketlerinin tam açıklaması burada bulunabilir: Eşleme Kümesi Etiketleri


6
SocketTimeout ve connectTimeout'u varsayılan (sonsuz) olarak bırakmak tehlikeli değil mi? Bir bağlantı herhangi bir nedenle takılırsa, uygulamanız (veya en azından bu ileti dizisi) sonsuza dek takılır. Bunların çok yüksek olarak ayarlanması gerekmez mi (bağlantı için 30 saniye, soket için 2 dakika gibi bir şey)?
Idris Mokhtarzada

İdris, çok doğru. Gönderimde yanlışlıkla MongoOptions'ın varsayılan değerlerimizi olduğunu varsaydım. Mongo ORM katmanımız sırasıyla 15 saniye ve 1 dakika olarak bunlara sahip ve yazarken bunların varsayılanlar olduğunu varsaydım. Sonsuz zaman aşımları kesinlikle kötü bir fikirdir. Uyarılar için teşekkürler,
gönderide

"slaveOk" seçeneği artık kullanımdan kaldırılmıştır, bunun eşdeğerinin doğru olmasını istiyorsanız, şunu yapın: mongoOptions.readPreference = ReadPreference.secondaryPreferred ();
Gubatron

İyi yanıt, ancak threadAllowedToBlockForConnectionMultiplier tanımınız yanlış (anahtar kelime çarpanı). Dokümanlara göre: "linksPerHost 10 ise ve threadAllowedToBlockForConnectionMultiplier ise engelleyebilecek iş parçacığı sayısı için connectionPerHost çarpanı, 50 iş parçacığı bundan daha fazlasını engelleyebilir ve bir istisna atılır"
Tyler Zale,

3
Oldukça popüler bir cevap gibi görünüyor. En son sürücüdeki değişiklikleri yansıtmak için bunu güncellememle ilgilenen biri varsa bana bildirin
Remon van Vliet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.