Çok Kiracılı (Multi-Tenant) CRM Mimarisi: "Verileriniz Ayrı Tutulur" Cümlesi Nerede Biter?
Bir CRM sağlayıcısıyla yapılan görüşmede duyulan bir cümle var: verileriniz ayrı tutulur. Bu cümle yanlış değil. Eksik olan, nerede bittiği.
Çok kiracılı (multi-tenant) bir yazılımda tek bir uygulama, tek bir sunucu ve tek bir işletim ekibi çok sayıda müşteriye aynı anda hizmet eder. Ayrım bu yüzden bir yerde kurulur ve bir yerde biter. Hangi katmanda kurulduğu yazılmadıkça alıcı en geniş anlamı varsayar, sağlayıcı da gerektiğinde en dar anlamı savunur; ikisinin arasındaki fark alıcının riskidir.
Bu yazı kendi kurulumumuzu ölçerek yazıldı. Aşağıdaki sayıların tamamı Rapitek CRM'in üretim ortamından alındı ve aleyhimize olanlar da olduğu gibi duruyor. Amaç bir güvenlik broşürü yazmak değil; bir alıcının sağlayıcısına soracağı soruları, cevabın nerede biteceğini bilerek sormasını sağlamak.
"Verileriniz ayrı tutulur" bir mimari tarifi değil, bir kapsam cümlesidir. Kapsamı yazılmadığında üç ayrı mimarinin üçüne birden uyar — ve bir yıl sonra kimin ne kastettiği tartışılamaz hale gelir.
İçindekiler
Çok kiracılı (multi-tenant) mimari nedir?
Çok kiracılı mimari, tek bir yazılım kurulumunun birden fazla müşteriye — kiracıya — aynı anda hizmet vermesidir. Alternatifi tek kiracılıdır: her müşteri için ayrı bir kurulum, ayrı bir sürüm, ayrı bir bakım hattı. Çok kiracılı olmak bir kusur değil, bulut yazılımının maliyet ve güncelleme modelidir; yeni bir sürüm tek seferde bütün kiracılara ulaşır.
Ayrımın nasıl kurulduğu ise sabit değil. Üç yaklaşım tarif edilir ve üçü de "verileriniz ayrı tutulur" cümlesiyle anlatılabilir.
1. Paylaşılan tablo, kiracı sütunu
Bütün müşterilerin kayıtları aynı tablolarda durur; her satırda bir kiracı kimliği sütunu vardır ve ayrım tamamen uygulama kodunun o sütunu doğru filtrelemesine bağlıdır. En ucuz ve en esnek olan budur. Ayrımı koruyan tek şey koddur: filtreyi unutan tek bir sorgu sınırın karşı tarafını görür ve bunu veritabanı tarafında durduran bir kural yoktur.
2. Ortak veritabanı sunucusu, kiracı başına ayrı veritabanı
Her müşterinin kendi veritabanı ve kendi tablo dosyaları vardır; hepsi aynı veritabanı sunucusu üzerinde çalışır. Ayrım artık uygulama filtresine değil, bağlantının hangi veritabanına açıldığına bağlıdır. Uygulamada unutulan bir kiracı filtresi bu kurguda karşı tarafın kayıtlarını getirmez, çünkü o kayıtlar bağlantının veritabanında bulunmaz. Sınır burada da mutlak değildir: sunucu, işletim sistemi ve veritabanı kullanıcısı ortaktır.
3. Kiracı başına ayrı kurulum
Ayrı sunucu, ayrı veritabanı sunucusu, ayrı ağ. Ayrımın en katı hâli budur ve maliyeti de en yüksek olan budur; her müşteri ayrı bir işletim yükü demektir. Bir sağlayıcı bunu yapıyorsa o maliyet bir yerde fiyata yansır.
Bir sağlayıcı hangisini kastettiğini söylemiyorsa, cümle üçüne de uyar.
Bu fark alıcı için nerede ortaya çıkar?
Günlük kullanımda üç model de aynı görünür: aynı ekranlar, aynı hız, aynı adres. Fark üç anda görünür.
Birincisi olay anında. Bir arıza, bir kaynak tükenmesi ya da bir bakım penceresi kaç müşteriyi aynı anda etkiler? Ayrım ne kadar aşağı katmanda kurulmuşsa etki alanı o kadar dar olur.
İkincisi ayrılırken. Sözleşme bittiğinde verinizin çıkarılması ve silinmesi, ayrı bir veritabanında tek bir işlem; paylaşılan bir tabloda ise satır satır bir ayıklama işi. Sağlayıcının size ne kadar hızlı ve ne kadar eksiksiz cevap verebileceğini büyük ölçüde bu belirler.
Üçüncüsü denetim sırasında. Bir müşteriniz ya da denetçiniz "verimiz kimin verisiyle aynı yerde duruyor" diye sorduğunda vereceğiniz cevap, sağlayıcınızın mimarisinden daha ileri gidemez. Bu yüzden cevabın kapsamını sözleşme aşamasında öğrenmek, olaydan sonra öğrenmekten ucuzdur.
Rapitek CRM'de ayrım hangi katmanda kuruluyor?
Kendi mimarimiz yukarıdaki ikinci gruba giriyor. Siteye yazdığımız cümle bunu kapsamıyla birlikte söylüyor:
CRM verileriniz size ait ayrı bir veritabanında tutulur: ayrı tablo dosyaları, ayrı yedek ve ayrı dosya alanı. Bu ayırım uygulama ayarında değil veritabanı düzeyindedir.
Ölçülen hâli şu: 24 kiracı, 24 ayrı veritabanı şeması, ayrı tablo dosyaları. Kayıt sayıları bunu doğruluyor — aynı tablo bir kiracıda 5.865 aday kaydı taşırken diğerinde sıfır satır. Yüklenen dosyalar için de aynı ayrım kurulu: dosya deposunda kiracı başına ayrı bir alan açılıyor. Buraya bir not düşmek gerekiyor: ölçüm günü dosya deposunda 69 alan sayıldı, yani bugünkü kiracı sayısından fazla. Bu farkın nereden geldiğini ölçmedik; sayıyı olduğu gibi yazıyor, açıklamasını uydurmuyoruz.
Cümlenin dikkatle seçilmiş iki parçası var. Birincisi CRM verileriniz: kapsam sizin CRM kayıtlarınızdır — firma, kişi, fırsat, teklif, yüklediğiniz dosyalar. Bütün veri değil. İkincisi veritabanı düzeyindedir: ayrım bir uygulama ayarıyla değil, bağlantının açıldığı veritabanıyla kuruluyor. Yazının geri kalanı, bu iki parçanın dışarıda bıraktığı yeri anlatıyor.
Bu ayrımın nereye kadar gittiğini de yazalım. Veritabanı düzeyinde kurulmuş olması, sınırın koddan bağımsız olduğu anlamına gelmez: kiracıyı doğru veritabanına yönlendiren şeyin kendisi de koddur. İddiamız, ayrımın bir uygulama ayarından daha aşağıda kurulmuş olması; sıfır riskli bir mimari olduğu değil. Ortak kalan katmanları "Ayrımın bittiği üç yer" bölümünde tek tek yazıyoruz.
Bileşenlerin hangi ülkede durduğu ayrı bir sorudur; kırılımı aşağıda.
Hangi bileşen nerede duruyor
| Bileşen | Konum | Barındıran |
|---|---|---|
| Uygulama ve CRM veritabanı | Helsinki, Finlandiya | Hetzner |
| Yüklenen dosyalar (ek, görsel, toplantı ses kaydı) | Frankfurt, Almanya | DigitalOcean Spaces |
| Veritabanı yedekleri | Falkenstein, Almanya | Hetzner Storage Box |
| Hata izleme (kişisel veri gönderimi kapalı) | Almanya; şehir kırılımı ölçülmedi | Sentry |
| Giden e-posta | Bölge ölçülmedi | AWS SES |
Ayrımın bittiği üç yer
1. Ayrı veritabanı, ayrı sunucu demek değil
24 veritabanının 24'ü de aynı MySQL örneği üzerinde çalışıyor ve uygulama hepsine tek bir veritabanı hesabıyla bağlanıyor. Kiracıya özel bir sunucu, kiracıya özel bir donanım ya da kiracıya özel bir veritabanı parolası yok. Pratik anlamı şu: ayrım veritabanı düzeyinde gerçek, ama veritabanı sunucusunun kendisi ortak bir kaynak. Sunucuyu etkileyen bir olay — yük, kaynak tükenmesi, bakım penceresi — bütün kiracıları aynı anda etkiler. Bunu "ayrı sunucu" diye yazamayız, yazmıyoruz da.
2. İşletim günlükleri paylaşılan bir tabloda duruyor
CRM kayıtlarınız ayrı bir veritabanında. Uygulamanın kendi hata kayıtları öyle değil. Ana veritabanındaki tek bir hata günlüğü tablosunda ölçtüğümüz değerler: 39.842 satır, 26 farklı kiracı, 26.357 kullanıcı e-posta adresi, 26.908 IP adresi ve 13.597 istek gövdesi — hepsi aynı paylaşılan tabloda.
Buradaki 26 sayısı, bugün sistemde bulunan 24 kiracıdan fazla. Sebebi rahatsız edici ölçüde basit: ayrılmış müşterilerin satırları hâlâ orada. Ayrılan kiracının CRM veritabanına ne olduğunu ölçmedik ve silindiğini yazmıyoruz; ölçtüğümüz tek şey, günlük satırlarının silinmemiş olduğu.
Bu neden önemli: bir hata günlüğü satırı yalnızca bir hata mesajı değildir. İçinde kimin, hangi adresten, hangi isteği yaptığı durur; bu kişisel veridir. "Verileriniz ayrı tutulur" cümlesi o satırları kapsamaz. Bizim cümlemiz de kapsamadığını söylüyor — CRM verileriniz derken kastedilen dar kapsam tam olarak budur. Bu yazıdaki hukuki nitelendirmeler ve sözleşmeye ilişkin öneriler bilgilendirmedir, hukuki görüş değildir; kendi yükümlülüğünüzü kendi hukuk danışmanınızla değerlendirin.
3. Diskte şifreleme yok
Veritabanı alanlarının tamamı üzerinde ölçtük: 9.148 tablo alanının 0'ı şifreli ve diskte bir disk şifreleme katmanı yok. Yani veriniz ayrı bir veritabanında duruyor, ama düz metin olarak duruyor. Şifrelenen dar bir grup var: iki adımlı doğrulama sırları, yedek kodlar ve ödeme ile İYS kimlik bilgileri Fernet ile şifreleniyor. Bunun dışında "verileriniz şifreli saklanır" cümlesini yazamayız ve yazmıyoruz.
Bu sayıları neden yazıyoruz?
Üçü de aleyhimize. Yine de yazıyoruz, çünkü bu üç sınırı yazmayan bir sağlayıcının "verileriniz ayrı tutulur" cümlesi ile bizimki okur açısından ayırt edilemez hale gelir. Ayırt edilebilir olmasının tek yolu, cümlenin nerede bittiğini de söylemek.
Bunların bir kısmı kapatılabilir sınırlar: işletim günlüklerinin kiracı başına ayrılması ya da eski kayıtların silinmesi bir mühendislik işidir ve yapılabilir. Bir kısmı ise mimari tercihtir — kiracı başına ayrı sunucu, bugünkü fiyat ve işletim modelimizle uyuşmuyor. Hangisinin hangisi olduğunu şimdiden söylemek, sonradan "zaten öyleydi" demekten daha dürüst.
Sağlayıcınıza sorulacak beş soru
-
1
Ayrım hangi katmanda kuruluyor?
Üç cevaptan birini isteyin: paylaşılan tabloda kiracı sütunu, kiracı başına ayrı veritabanı, ya da kiracı başına ayrı kurulum. "Verileriniz ayrı tutulur" cevabı bu soruyu kapatmaz — üç mimariye de uyar.
-
2
Ayrı veritabanı deniyorsa, sunucu da ayrı mı?
Ayrı veritabanı ile ayrı sunucu aynı şey değildir. Aynı veritabanı sunucusunda duran ayrı veritabanları kaynak ve bakım penceresi bakımından ortak davranır. Cevap "aynı sunucu" ise bu bir kusur değil; yazılı olması yeter.
-
3
İşletim günlükleri ve hata kayıtları hangi tarafta?
Uygulama günlükleri, hata izleme kayıtları ve arka plan iş kayıtları CRM verisiyle aynı katmanda da durabilir, ayrı bir katmanda da; kategorik bir cevabı yok. Hangisi olduğunu yazılı isteyin. İçlerinde kullanıcı adresi, IP ve istek gövdesi bulunabilir; bu katman kiracı başına ayrılıyor mu, sorun.
-
4
Sözleşme bittiğinde silme işlemi hangi katmanları kapsıyor?
CRM veritabanının silinmesi, ortak katmandaki kayıtların da silindiği anlamına gelmez. Silmenin kapsamını katman katman yazılı isteyin: CRM kayıtları, yüklenen dosyalar, işletim günlükleri.
-
5
Durağan şifreleme açık mı, neyi kapsıyor?
"Verileriniz şifrelenir" cümlesi aktarımdaki şifrelemeyi de anlatabilir, diskteki şifrelemeyi de. İkisini ayrı ayrı sorun ve diskteki şifrelemenin hangi alanları kapsadığını isteyin.
Bizim sınırlarımız
Yukarıdaki soruları kendi kurulumumuza da sorduk. Bu yazının konusunda söyleyemediklerimiz şunlar.
- Kiracıya bölge ya da ülke seçimi sunmuyoruz: kiracı kaydının 30 alanının hiçbirinde bölge ya da ülke alanı yok.
- Giden e-posta ayrı bir gönderim servisinden (AWS SES) çıkıyor ve bu servisin hangi bölgede çalıştığı ölçülmedi; bu yüzden bileşenlerin tamamı için tek bir konum cümlesi kurmuyoruz.
- Ayrılan bir kiracının CRM veritabanına ne olduğunu ölçmedik. Silindiğini de, durduğunu da yazmıyoruz.
- Denetim kaydımız "değiştirilemez" değil. Kayıt tablosu sıradan bir tablo ve erişebildiğimiz sekiz kurulumun 19 profilinin 19'unda da silme yetkisi açık.
- Paylaşılan işletim günlüğü için yazılı bir saklama süresi politikamız yok; bu kararı henüz almadık.
- ISO 27001 ya da SOC 2 sertifikamız yok ve alana kadar da iddia etmeyeceğiz.
- Yazılı bir çalışma süresi (SLA) taahhüdü vermiyoruz; kiracı adreslerini dışarıdan izleyen bağımsız bir servis kurulu değil.
Sık sorulan sorular
Çok kiracılı (multi-tenant) mimari nedir?
Rapitek CRM'de verilerim başka müşterilerin verisiyle aynı tabloda mı duruyor?
"Ayrı veritabanı" ile "ayrı sunucu" aynı şey mi?
Verilerim sunucuda şifreli olarak mı saklanıyor?
Verilerim hangi ülkede tutuluyor, bölge seçebilir miyim?
Bir müşterinin kullanıcısı başka bir müşterinin kayıtlarını görebilir mi?
Bir sağlayıcının bu konuda söylediğini nasıl doğrularım?
Bu ayrım kurulumda ne zaman netleşiyor?
İlgili içerikler
- Güvenlik — barındırma, yedekleme ve erişim denetimi ölçümlerinin tamamı.
- SaaS nedir — bir yazılımı kiralamanın veri tarafındaki karşılığı.
- PaaS nedir — platform katmanının bir CRM alıcısını nerede ilgilendirdiği.
- Rapitek CRM ürün sayfası — nesneler, yetkilendirme ve denetim kaydı.
Kendi kurulumunuzun katmanlarını ekranda birlikte geçelim
Rapitek CRM'i kuran ekip, Salesforce döneminde 200'den fazla kurumsal CRM projesi tamamladı. Ürün yeni, ekip değil: alanları, aşamaları ve raporları biz yapılandırıyoruz, verinizi biz aktarıyoruz, ekibinize Türkçe eğitimi biz veriyoruz.
Keşifte hangi verinin hangi katmanda duracağını katman katman çıkarırız.
Kerim Yıldırım
Kurucu, Rapitek CRM · Salesforce döneminde 200'den fazla kurumsal CRM projesi
Kaynaklar
Bu yazıdaki dış olgular şu birincil kaynaklara dayanıyor:
