İstemci başına bir veritabanı hangi noktada olanaksız hale geliyor?


31

Sistemlerimizden biri için hassas müşteri verilerimiz var ve her müşterinin verilerini ayrı bir veritabanında saklıyoruz. Bu sistem için yaklaşık 10-15 müşterimiz var.

Ancak, 50-100 müşterisi olacak, hatta daha fazlası olacak yeni bir sistem geliştiriyoruz. Bu durumda, müşteri başına bir veritabanına sahip olmanın mümkün olmayabileceğini düşünüyorum (hassas kayıtları ve denetim geçmişini saklamak). Ancak bunun tamamen normal olup olmadığını veya güvenliği sağlamanın başka bir yolu olup olmadığını bilmiyorum.

Bunun hakkında bir düşüncen var mı?


Sunucu başına birden fazla veritabanına sahip olmanın avantajlarını bilmiyorum (bununla hiçbir zaman sorunum olmadı) ancak aynı veritabanı içindeki birçok şema kavramı technet.microsoft.com/en-us/library/dd207005.aspx , ikisini birden sunuyor izolasyon ve güvenlik. Böylece bu mimariyi de deneyebilirsiniz.
Alexandros

2
@Alexandros şema ayırma biraz sunar, ancak ayrı kurtarma modelleri kullanmanıza, farklı programları yedeklemenize, bir müşteriyi belirli bir noktaya geri yüklemenize, bir müşteriyi kolayca kaldırmanıza, bir müşteriyi kolayca taşımanıza vb. İzin vermez.
Aaron Bertrand

4
Tek bir sunucuda 3.000+ veritabanına sahip (istemci başına 1) sistemleri gördüm. Çok fazla endişelenmem - sadece kaynakları dikkatlice planladığınızdan ve müşteri sayısı arttıkça kullanımı izlediğinizden emin olun.
Max Vernon

Bunu okuyabilir, özellikle tarihleri ​​ve ops yorumlarını not edin: stackoverflow.com/questions/5596755/…
14:08

Yanıtlar:


48

100 veya 500 veritabanını yönetmek gerçekten de 5 veya 10'u yönetmekten farklı değildir - yalnızca otomasyonu benimsemeniz ve bir ölçeklenebilirlik planınızın olması gerekir (ve her yerde yansıtma gibi yüksek veritabanı başına maliyet özellikleri kullanmayı planlamayın istemciler).

Önceki işimde bu mimariyi kullandık ve zorluklardan bazıları “zor” olsa da, iki müşteriyi tek bir veritabanında birleştirmeyi hiç düşünmemiştim.

En büyük faydaları, bağımsız kurtarma modelleri ( abasit bolabilir, tam olabilir, vb.), Bir müşteriyi başkalarını rahatsız etmeden zamana (veya tamamen kaldırabilen) geri yükleme yeteneği, kaynak ağırlıklı bir müşteriyi sorunsuz bir şekilde hareket ettirme yeteneğidir. Tamamen farklı bir sunucuya kendi deposuna veya saydamlığı çok az olan bir uygulamaya (uygulamaya o müşteriyi nerede bulacağını söyleyen bir yapılandırma dosyasını veya tabloyu güncellersiniz).

Bu yazılan itirazların ve / veya sorunların nasıl çözüleceği ile ilgili birkaç konuyu ele alıyorum:

Herşeyin söylediğine göre, hiçbirimizin size yönetimin sizin için pratik olmadığı noktasını söyleyebileceğini sanmıyorum - sadece karşılaştığınız özel zorlukların ne olduğunu tek tek sorabilirsiniz.


6
Ayrıca tutarlı bir şekilde uygulanan iyi bir adlandırma kuralına ihtiyacınız olacaktır.
Greenstone Walker

Teşekkürler bunlar harika linkler. Bu gerçekten bir yönetim sorunu değil (şu anda), sadece işlerin durma noktasına gelebileceği konusunda endişeliydim. Ancak, endişelenmemeliyim ve hepsini yönetebildiğimden emin olmalıyım. Çok teşekkürler!
NibblyPig

@Aaron OMS'de benzer bir senaryo var, burada bir sipariş işleyen birden fazla atölye çalışmam var ve bunlar bağımsız. Atölye, sipariş (Müşteri) adresine göre seçilir. Böylece bir müşteri birden fazla çalışma sayfasında sipariş alabilir. Bu nedenle, her bir veritabanı sunucusunda devam etmesi gerektiği için Müşteri siparişi geçmişini yüklemeniz gerektiğinde zorlaşır.
Navrattan Yadav,

15

Sahip olduğunuz seçenekleri tartışan bir bildiri olan Çok Kiracılı Veri Mimarisini , artılarınızı ve eksilerinizi okumanızı öneririm . Özetlemek gerekirse, üç seçenek sunar:

  • ayrı DB'ler
  • ayrı şemalar
  • paylaşılan şema

Artık, en iyi ayrımı (kiracılar arasında yalıtım) sunan, ancak yönetimi en zor olan ayrı DB'ler aşamasındasınız. Yüzlerce kiracıya büyüdükçe, 100'lerce DB'yi yönetme lojistiğinin önemsiz olmadığını fark edeceksiniz. Yedeklemeyi geri yüklemeyi (yedeklenen dosyaların, işlerin, programların vb. Konumu) düşünün. Yüzlerce veri tabanı arasında dosya dağıtımını, kullanılan disk alanını ve veritabanı büyümesini nasıl izleyeceğinizi ve yöneteceğinizi düşünün. 1000 Kiracı ile yakın gelecekte Yüksek Kullanılabilirlik / Felaket-Kurtarılabilirlik senaryonuz ne olacak? 1000 yansıtılmış DB, 1000 log sevkiyat oturumu? 6 ay içerisinde geliştirici ekibiniz size gelir ve "Bu harika özelliği ürünümüze nasıl vereceğimi biliyorum, İşlemsel Çoğaltma'yı kullanacağız!" Deyince ne düşünün? "Tabii, 500 yayıncı kurmama izin ver,“! Yüzlerce DB'yi yönetmek imkansız değildir, ancak planlıyorsanız, PowerShell becerilerinizi daha iyi parlatır ve şu anda UI yönetim araçlarını kullanmayı bırakabilirsiniz .

Ek olarak, birden fazla (yüzlerce) DB'nin performans ve maliyet üzerinde ölçülebilir bir etkisi olduğunu göz önünde bulundurmanız gerekir:

  • fiziksel disk alanı daha az verimli kullanılır (her veritabanında bir miktar boş oda olması gerekir , bu boş odada DB sayısı ile çarpılırsınız)
  • Yoğun yazma işleri için özel bir günlük diski oluşturabilmeniz mümkün değildir, tüm bu LDF'leri bir (veya daha fazla) SSD deposuna taşımak zorunda kalacaksınız
  • log yazmaları, çoğu bireysel log bloğu kaydına karşı bir araya dağıldıkları için (tek kullanımlık log blokları kullanacaksınız) yayılan komisyonlarda daha az verimli olacaktır. Ne hakkında konuştuğumu anlamak için , bkz. LSN Nedir: Günlük Sıra Numarası .

Ayrılmış DB'ler, izolasyondan dolayı bazı avantajlarla birlikte gelir, temel avantajı bağımsız yedekleme / geri yüklemedir.

Sizinkine benzer senaryolar, SQL Azure veritabanları için mükemmel bir aday . Disk alanı yönetimi yok, HA / DR sağlamaya gerek yok, yüzlerce / binlerce DB vs. büyüyor.


Teşekkürler, bu iyi bir öneri, özellikle bir bulut modeline geçiyor. Bazı şeyleri nasıl destekleyeceğime dair ciddi bir düşünce vermem gerekecek.
NibblyPig

Otomasyonunuz her müşteri için ayrı veritabanlarını destekleyecek kadar iyi bir şekilde geliştirildikten sonra, her müşteri için ayrı VM'ler sağlamak oradan dev bir sıçrama değildir. Ne de olsa bu, "bulut" barındırma şirketlerinin yaptığı şeydir. Bunun Muhtemelen SQL Azure için iyi bir kullanım olacağı konusunda hemfikir olun
Gavin Campbell

2

Önceki işimde, müşteri başına sadece bir veri tabanı barındırmıyorduk - çoğu durumda bundan daha fazlasıydı! Ayrıldığım gibi, bir MariaDB kümesinde çalışan yaklaşık 4.500 veritaban, diğerinde (ironik olarak daha küçük) bir kümede yaklaşık 7.000 ve her biri ev sahipliği yapan 4 ayrı "paylaşılmamış" (tamamen ayrı, bağımsız web ve veritabanı sunucusu) vardı. Tek bir MySQL sunucusunda 200-500 veritabanı. Ve bu şirket hala iyi bir klipte büyüyor.

Uzun ve kısa olan bu şirketin başarısının böyle bir mimarinin gerçekten uygulanabilir olduğunu kanıtlamasıdır. (Caveat: Ayrı veritabanları kullanılarak yapılan belirgin kazanımların aksine, tüm verilere aynı veritabanı kullanıcısını / geçişini kullanan sıkı birleştirilmiş uygulamaların bir üçlüsünden erişildi! ayrı bir kullanıcı / geçişe sahipti - ancak çok az

Sys yöneticileri ile yakın çalışma deneyimlerimden (teknik olarak şirkette programcı oldum, ama gerçekte sahip oldukları en iyi DBA ve güvenlik duvarı kurmayı bilen tek kişi oldum !) Performansla alakalıydı. eşzamanlı erişime, sorgu karmaşıklığına / zamanına, indeks performansına vb. ilişkin kaynayan endişeler - tüm olağan şüpheliler, başka bir deyişle ve sunucudaki veri tabanı sayısı, ayırt edilemeyecek bir rol oynadı; bu, yüksek ücretli uzman tarafından onaylanan bir sonuçtu. danışmanlar düzenli olarak danışmanlık yapıyoruz.

Sonuç olarak endişelerinizi, sahip olduğunuz veritabanlarının sayısına değil, uygulamanıza, altyapınıza odaklamanız gerekir. Tüm bu diğer faktörler sizi performans problemlerini ve darboğazları çözmekle meşgul tutmak için fazlasıyla yeterli olacaktır.

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.