Biraz arka plan
Daire mücevher yıllardır çok kiracılık uygulaması çalıştırmak için kullanıyor . Son zamanlarda veritabanını ayrı ana bilgisayarlara ölçeklendirme ihtiyacı geldi, db sunucusu artık daha fazla dayanamıyor (hem okuma hem de yazma çok fazla oluyor) - ve evet, donanımı maks. donanım, 64 çekirdek, raid 10'da 12 Nvm-e sürücü, 384Gb ram vb.).
Ben bu kiracı başına (1 kiracı = 1 veritabanı bağlantısı yapılandırma / havuz) yapmayı düşünüyordum çünkü number-of-tenants
uygulama kod değişiklikleri bir sürü yapmadan-kez daha fazla kapasite almak için "basit" ve verimli bir yol olacaktır .
Şimdi, 4,2 atm raylar çalıştırıyorum, yakında 5.2'ye yükseltiyorum. Raylar 6 model başına bağlantı tanımları için destek eklediğini görebiliyorum, ancak 20 kiracımın her biri için tamamen yansıtılmış bir veritabanı şemasına sahip olduğum için bu gerçekten ihtiyacım olan şey değil. Ben sadece search_path
Postgresql ayarlar ve gerçek bağlantıyı değiştirmez gibi, tipik olarak ben "veritabanı" istek (ara katman yazılım) veya arka plan işi (sidekiq ara katman yazılım) başına, ancak bu şu anda önemsiz ve ny apart gem, ele . Kiracı başına bir barındırma stratejisine geçerken, tüm bağlantıyı istek başına değiştirmem gerekecek.
Sorular:
- Ben bir
ActiveRecord::Base.establish_connection(config)
istek / arka plan işi başına yapabileceğini anlıyorum - ancak, ben de anladığım gibi, bu tamamen yeni bir veritabanı bağlantısı el sıkışma yapılacak ve raylar içinde yumurtlamak için yeni bir db havuzu tetikler - değil mi? Uygulamama gelen her istekte bu tür bir yükü oluşturmak için bir performans intiharı olacağını tahmin ediyorum. - Bu nedenle herkesin birden fazla (toplam 20) veritabanı bağlantısı / havuzu (örneğin, uygulamanın önyükleme öncesi) önceden oluşturulması gibi raylar ile seçeneği görebiliyor ve sadece istek başına bu havuzlar arasında geçiş merak ediyorum? Böylece db bağlantıları zaten yapılmış ve kullanıma hazırdır.
- Bütün bunlar kötü bir fikir değil mi? Bunun yerine farklı bir yaklaşım mı aramalıyım? Örneğin, 1 uygulama örneği = belirli bir kiracıya özel bir bağlantı. Veya başka bir şey.
master
. Rails Egde'yi çalıştırmak, bu özelliği mevcut Rails sürümünüz için bir seçenek veya geri itme olur mu?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
, havuzun her seferinde tamamen yeni bir bağlantı oluşturmak yerine (yeniden) kullanılacağı anlamına mı geliyor?