İçeriğe Atla
Mustafa Erbay
Yaşam · 12 dk okuma · görüntülenme Read in English

ERP Sistemlerinde Multi-Tenant Mimarisi: Uygulamalı Bir Rehber

ERP sistemlerinde multi-tenant mimariyi tasarlarken dikkat edilmesi gerekenleri, trade-off'ları ve somut örneklerle adım adım ele alıyoruz.

100%

ERP Sistemlerinde Multi-Tenant Mimarisi: Neden Önemli?

Bir üretim ERP’sini geliştirirken, farklı müşteriler için aynı altyapıyı kullanmanın getirdiği zorlukları ilk elden gördüm. Özellikle finansal verilerin ayrıştırılması, güvenlik ve performans optimizasyonu gibi konularda “tek bir yapı, herkes için” yaklaşımı sürdürülebilir değildi. İşte tam bu noktada, ERP sistemlerinde multi-tenant mimari devreye giriyor. Bu yaklaşım, tek bir yazılım örneğini birden fazla bağımsız müşterinin (tenant) kullanmasına olanak tanır. Bu, maliyetleri düşürmekle kalmaz, aynı zamanda yönetim ve güncellemeleri de kolaylaştırır.

Multi-tenant mimarinin temelinde, her müşterinin verilerinin ve konfigürasyonlarının birbirinden izole edilmesi yatar. Bu izolasyon, hem güvenlik hem de performans açısından kritik öneme sahiptir. Örneğin, bir müşterinin yoğun veri girişi yapması, diğer müşterilerin sistem performansını etkilememelidir. Bu tür karmaşıklıkları yönetmek için titiz bir mimari tasarım gerekir. Bu yazıda, gerçek dünya deneyimlerimden yola çıkarak, ERP sistemlerinde multi-tenant mimariyi nasıl tasarlayabileceğinize dair pratik bir rehber sunacağım.

Veri İzolasyonu Stratejileri: Hangi Yaklaşım Sizin İçin Doğru?

Multi-tenant mimarinin en kritik yönlerinden biri, verilerin nasıl izole edileceğidir. Burada karşımıza çıkan temel stratejiler şunlardır:

  1. Tek Veritabanı, Tek Schema (Shared Database, Shared Schema): Bu en ekonomik yaklaşımdır. Tüm müşterilerin verileri aynı veritabanında, ancak her veri kaydı için bir tenant_id sütunu eklenerek ayrılır. Sorguların bu tenant_id üzerinden filtrelenmesi gerekir.
  2. Tek Veritabanı, Birden Fazla Schema (Shared Database, Separate Schemas): Her müşteri için veritabanı içinde ayrı bir schema oluşturulur. Bu, veri izolasyonunu daha güçlü hale getirir ancak yönetim karmaşıklığını artırır.
  3. Ayrı Veritabanları (Separate Databases): Her müşteri için tamamen ayrı bir veritabanı örneği kullanılır. Bu en güvenli ve en izole yaklaşımdır, ancak maliyetleri ve yönetim yükünü en üst düzeye çıkarır.

Bu stratejilerin her birinin kendi trade-off’ları vardır. Seçiminiz, maliyet, güvenlik gereksinimleriniz, ölçeklenebilirlik beklentileriniz ve operasyonel kabiliyetlerinize bağlı olacaktır. Genellikle, başlangıçta daha ekonomik olan tek schema ile başlayıp, müşteri sayısı arttıkça ve performans sorunları ortaya çıktıkça schema bazında veya veritabanı bazında izolasyona geçmek akıllıca bir strateji olabilir.

Kimlik Doğrulama ve Yetkilendirme Mekanizmaları

Multi-tenant mimaride kimlik doğrulama (authentication) ve yetkilendirme (authorization) süreçleri, tekil kiracı (single-tenant) sistemlere göre daha karmaşıktır. Her kullanıcının ait olduğu tenant’ı bilmek ve yalnızca o tenant’ın kaynaklarına erişebildiğinden emin olmak zorundasınız.

Kimlik Doğrulama (Authentication)

Kullanıcılar sisteme giriş yaparken, sadece kendi kullanıcı adı ve şifrelerini değil, aynı zamanda hangi tenant adına giriş yaptıklarını da belirtmeleri gerekebilir. Bunu sağlamak için birkaç yöntem kullanabilirsiniz:

  • Tenant Adı veya ID ile Giriş: Kullanıcılar, kullanıcı adları ve şifrelerinin yanı sıra bir “tenant adı” veya “tenant ID” de girebilirler. Bu, özellikle birden fazla tenant’a erişimi olan kullanıcılar için kullanışlıdır.
  • Subdomain veya URL Yapısı: Her tenant için ayrı bir subdomain (örn. musteri-a.erp.com) veya URL yolu (örn. erp.com/musteri-a) kullanarak, giriş sayfasının hangi tenant’a ait olduğunu otomatik olarak belirleyebilirsiniz. Bu, kullanıcı deneyimini daha akıcı hale getirir.
  • Tekil Oturum Açma (Single Sign-On - SSO): Daha gelişmiş sistemler için, OpenID Connect veya SAML gibi protokoller kullanarak mevcut kimlik sağlayıcılarla (Identity Provider - IdP) entegrasyon yapabilirsiniz. Bu durumda, tenant bilgisi genellikle IdP tarafından sağlanır veya kullanıcı, IdP’deki profil bilgisine göre otomatik olarak doğru tenant’a atanır.

Yetkilendirme (Authorization)

Kullanıcı doğrulandıktan sonra, rol ve izin tabanlı yetkilendirme (Role-Based Access Control - RBAC) mekanizmaları devreye girer. Bu sistemde, her kullanıcının hangi tenant içindeki hangi kaynaklara (modüller, veri alanları, raporlar vb.) erişebileceği tanımlanır.

Örneğin, bir kullanıcının sadece kendi tenant’ına ait faturaları görebilmesi ve düzenleyebilmesi gerekir. Bu, sorguların her zaman WHERE tenant_id = ? gibi bir koşulla filtrelenmesiyle sağlanır. Bu filtreleme, uygulama katmanında, API gateway’de veya hatta veritabanı düzeyinde (örneğin, Row-Level Security - RLS ile) uygulanabilir.

Veritabanı Performansı ve Ölçeklenebilirlik İpuçları

Multi-tenant sistemlerde veritabanı performansı, en çok zorlanan alanlardan biridir. Birçok tenant’ın aynı anda kaynakları kullanması, performans düşüşlerine yol açabilir. İşte bu sorunu aşmak için kullanabileceğiniz bazı stratejiler:

1. Sorgu Optimizasyonu ve İndeksleme

Her tenant için sorguların optimize edilmesi esastır. Özellikle tenant_id sütunu üzerine doğru indeksler oluşturmak kritiktir.

  • Composite Indexes: tenant_id ile birlikte sık sorgulanan diğer sütunları içeren bileşik indeksler (composite indexes) kullanın. Örneğin, (tenant_id, order_date) gibi.
  • Veritabanı İstatistikleri: Veritabanı istatistiklerinin güncel tutulduğundan emin olun. PostgreSQL’de ANALYZE komutu veya otomatik autovacuum ayarları bu konuda yardımcı olur.
  • N+1 Problemini Önleme: ORM kullanırken N+1 sorgu problemini mutlaka çözün. Eager loading veya JOIN kullanarak tek sorguda gerekli tüm veriyi çekmeye çalışın.
-- Örnek: Tek veritabanı, tek schema modelinde sorgu optimizasyonu
SELECT
    o.order_id,
    o.order_date,
    c.customer_name,
    p.product_name,
    oi.quantity
FROM
    orders o
JOIN
    customers c ON o.customer_id = c.customer_id AND o.tenant_id = c.tenant_id
JOIN
    order_items oi ON o.order_id = oi.order_id AND o.tenant_id = oi.tenant_id
JOIN
    products p ON oi.product_id = p.product_id AND oi.tenant_id = p.tenant_id
WHERE
    o.tenant_id = 'musteri-x' AND o.order_date BETWEEN '2026-01-01' AND '2026-05-23';

-- İlgili indeksler (PostgreSQL örneği):
-- CREATE INDEX idx_orders_tenant_date ON orders (tenant_id, order_date);
-- CREATE INDEX idx_customers_tenant_id ON customers (tenant_id);
-- CREATE INDEX idx_order_items_tenant_id ON order_items (tenant_id);
-- CREATE INDEX idx_products_tenant_id ON products (tenant_id);

2. Connection Pooling

Her istek için yeni bir veritabanı bağlantısı açmak maliyetlidir. Application sunucunuzda veya veritabanı proxy’leri (örn. PgBouncer) aracılığıyla connection pooling kullanın. Bu, bağlantı kurma süresini azaltır ve veritabanı üzerindeki yükü hafifletir.

3. Veritabanı Bölümleme (Partitioning)

Eğer tek veritabanı veya schema modelini kullanıyorsanız, büyük tabloları zaman bazlı (örn. aylık, yıllık) veya tenant bazlı olarak bölümlemek (partitioning) performansı önemli ölçüde artırabilir. PostgreSQL’in table partitioning özellikleri bu konuda oldukça güçlüdür.

4. Okuma/Yazma Ayrımı (Read/Write Splitting)

Yoğun okuma operasyonları olan sistemlerde, ana veritabanına ek olarak okuma replikaları (read replicas) oluşturmak performansı iyileştirir. Uygulamanız, yazma işlemlerini ana veritabanına, okuma işlemlerini ise replikalara yönlendirecek şekilde yapılandırılmalıdır. Bu, özellikle raporlama ve dashboard gibi okuma ağırlıklı modüller için kritik öneme sahiptir.

Uygulama Katmanı ve Servis Tasarımı

Multi-tenant mimaride uygulama katmanının tasarımı da en az veritabanı kadar önemlidir. Servislerinizin veya mikroservislerinizin tenant farkındalığına sahip olması gerekir.

Tenant Bağlamının Yönetimi

Her gelen isteğin hangi tenant’a ait olduğunu bilmek ve bu bilgiyi tüm servisler arasında taşımak kritik öneme sahiptir. Bu genellikle HTTP başlıkları (örn. X-Tenant-ID) veya JWT (JSON Web Token) içindeki bir claim aracılığıyla yapılır.

  • API Gateway: Gelen istekleri ilk karşılayan katman olarak API Gateway, tenant bilgisini doğrulayabilir ve ilgili başlıkları ekleyerek arka uç servislerine iletebilir.
  • Mikroservisler: Her mikroservis, gelen isteğin tenant bağlamını almalı ve veritabanı sorgularını veya diğer servis çağrılarını buna göre yapmalıdır.

Paylaşılan ve Tenant’a Özel Kod

Mimaride hem paylaşılan kod (tüm tenant’lar için aynı) hem de tenant’a özel konfigürasyon veya kod parçaları bulunabilir.

  • Paylaşılan Kütüphaneler: İş mantığının büyük kısmı, tüm tenant’lar için ortak olmalıdır. Bu, geliştirme ve bakım maliyetlerini düşürür.
  • Konfigürasyon: Tenant’a özel ayarlar (örn. para birimi, saat dilimi, logo, rapor şablonları) genellikle bir konfigürasyon tablosunda veya dosyasında saklanır ve uygulama tarafından okunur.
  • Tenant’a Özel Kod (Nadiren): Bazı durumlarda, belirli bir müşteri için özel işlevsellik gerekebilir. Bu tür durumlar için esnek bir eklenti (plugin) mimarisi veya dinamik kod yükleme mekanizmaları düşünülebilir. Ancak bu, karmaşıklığı ciddi şekilde artırır ve genellikle son çare olarak tercih edilir.

Güvenlik ve İzole Etme (Isolation)

Multi-tenant mimaride güvenlik, en önemli önceliktir. Bir tenant’ın diğerinin verilerine veya kaynaklarına erişememesini sağlamak hayati önem taşır.

Veri İzolasyonu

Yukarıda bahsedilen veri izolasyonu stratejileri (tek schema, ayrı schema, ayrı veritabanı) temel güvenlik katmanını oluşturur. Ancak bu tek başına yeterli değildir.

Kaynak İzolasyonu

Sadece verileri değil, aynı zamanda işlem gücü, bellek gibi sunucu kaynaklarını da izole etmek gerekebilir. Bir tenant’ın aşırı kaynak tüketimi, diğer tenant’ların performansını olumsuz etkileyebilir.

  • Container Teknolojileri (Docker, Kubernetes): Her tenant için ayrı container’lar veya pod’lar kullanmak, kaynakları izole etmenin etkili bir yoludur. Kubernetes’te namespace’ler ve resource quotas bu konuda yardımcı olur.
  • Sanal Makineler (VMs): En yüksek izolasyon seviyesi için her tenant’a ayrı bir sanal makine tahsis edilebilir, ancak bu maliyetli bir çözümdür.
  • API Rate Limiting: Her tenant için API isteklerini sınırlamak (rate limiting), kötü niyetli veya hatalı uygulamaların sistemi suistimal etmesini önler. Örneğin, bir tenant’ın belirli bir zaman diliminde yapabileceği istek sayısı sınırlandırılabilir.

Güvenlik Denetimi (Auditing)

Tüm kritik işlemlerin (veri erişimi, değişiklikler, girişler vb.) kaydedilmesi, güvenlik denetimi (auditing) açısından önemlidir. Her denetim kaydının hangi tenant’a ait olduğu ve hangi kullanıcı tarafından yapıldığı bilgisiyle birlikte saklanması gerekir.

Dağıtım ve Operasyonel Zorluklar

Multi-tenant mimarinin yönetimi, tekil kiracı sistemlere göre daha karmaşıktır.

Güncelleme Stratejileri

Tüm tenant’lara aynı anda güncelleme dağıtmak her zaman mümkün olmayabilir.

  • Aşamalı Dağıtım (Phased Rollouts): Güncellemeleri önce küçük bir grup tenant’a dağıtarak, olası sorunları erken tespit edebilirsiniz.
  • Tenant’a Özel Dağıtım: Nadiren de olsa, belirli bir tenant için özel bir güncelleme gerekebilir. Bu, mimarinin esnekliğini gerektirir.

Yedekleme ve Kurtarma (Backup and Recovery)

Yedekleme stratejileri, seçtiğiniz veri izolasyon modeline bağlı olacaktır.

  • Ayrı Veritabanları: Her veritabanını ayrı ayrı yedeklemek ve geri yüklemek gerekir. Bu, granular kurtarma (granular recovery) için avantajlıdır.
  • Tek Veritabanı: Tüm verileri tek bir yedekten kurtarmak, belirli bir tenant’ı izole bir şekilde geri yüklemeyi zorlaştırabilir. Bu durumda, denetim kayıtlarını kullanarak gerekli verileri yeniden oluşturmak gerekebilir.

İzleme ve Loglama (Monitoring and Logging)

Her tenant’ın performansını ve hatalarını ayrı ayrı izlemek önemlidir.

  • Tenant Bazlı Metrikler: Uygulama ve veritabanı metriklerini tenant bazında toplamak, performans sorunlarını hızla teşhis etmenize yardımcı olur.
  • Merkezi Loglama: Tüm tenant’lardan gelen logları merkezi bir sistemde (örn. ELK Stack, Splunk) toplamak, hata ayıklama ve analiz için kritiktir. Loglarda mutlaka tenant kimliğinin bulunması gerekir.

Sonuç: Dengeli Bir Yaklaşım

ERP sistemlerinde multi-tenant mimari tasarlamak, teknik beceri, dikkatli planlama ve trade-off’ları anlama yeteneği gerektirir. Veri izolasyonu, kimlik doğrulama, performans optimizasyonu ve güvenlik, bu sürecin temel taşlarıdır. Seçtiğiniz mimari, iş gereksinimlerinize, bütçenize ve ölçeklenebilirlik hedeflerinize uygun olmalıdır.

Başlangıçta daha basit bir modelle başlayıp, sistem büyüdükçe ve ihtiyaçlar değiştikçe mimariyi evrimleştirmek genellikle en mantıklı yaklaşımdır. Unutmayın, mükemmel bir mimari yoktur; sadece projenizin mevcut ve gelecekteki ihtiyaçlarına en uygun olanı vardır. Bu rehberin, bu karmaşık ama ödüllendirici yolculukta size rehberlik etmesini umuyorum.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

Sıkça Sorulanlar

Bu makale ile ilgili okurların sorduğu yaygın sorular.

ERP sistemimde multi-tenant mimarisi kurmak istiyorum, ilk adım olarak neyi yapmalıyım?
İlk adımda, tenant tanımını netleştiririm: bir müşteri sadece bir şirket mi yoksa birden çok alt birim mi? Bu kararı verdikten sonra, veri izolasyonu stratejisini (tek veritabanı‑tek şema, tek veritabanı‑çok şema vb.) seçerim ve bunun için bir proof‑of‑concept (POC) oluştururum. POC’de, `tenant_id` filtresinin her sorguya eklenip eklenmediğini, migration scriptlerinin otomatik çalışıp çalışmadığını test ederim. Ayrıca, CI/CD pipeline’ına tenant‑özel konfigürasyon dosyalarını ekler, izole edilmiş ortamda (Docker/Kubernetes) dağıtım sürecini denemek, ileride büyük ölçekli bir geçişte sürprizleri önler.
Tek veritabanı‑tek şema (shared DB, shared schema) modelinin avantajları ve dezavantajları nelerdir? Başka bir modeli tercih etmeli miyim?
Ben bu modeli ilk projelerimde kullandım çünkü maliyet açısından en düşük çözüm. Tek bir veritabanı yönetmek, yedekleme ve ölçekleme operasyonlarını basitleştirir, ayrıca `tenant_id` üzerinden filtreleme ile kod tekrarını azaltır. Ancak, en büyük dezavantajı sorgu performansının tenant sayısı arttıkça yavaşlaması ve güvenlik denetimlerinin daha sıkı yapılması gerekliliğidir. Veri sızıntısı riski de artar. Eğer müşterilerim yüksek veri hacmi ve sıkı yasal izolasyon talep ediyorsa, tek veritabanı‑çok şema ya da tamamen ayrı veritabanı modellerine geçmek daha güvenli ve ölçeklenebilir bir alternatif olur.
Veri izolasyonu sırasında bir tenant’ın verisi diğerine karıştıysa hatayı nasıl tespit edip çözerim?
Böyle bir sorunla karşılaştığımda önce log seviyesini `DEBUG` yapıp tüm SQL sorgularını yakalarım; `tenant_id` filtresinin eksik olduğu sorguyu hemen görürüm. Ardından, ilgili repository katmanında unit‑test yazarak her CRUD operasyonunun `tenant_id` kontrolünü zorunlu kılarım. Sorunu izole ettikten sonra, veritabanı seviyesinde bir trigger ekleyerek hatalı kayıtların eklenmesini önlerim ve geçmişteki hatalı verileri bir script ile `tenant_id`’ye göre yeniden dağıtırım. Bu süreç, hatanın tekrar etmemesi için CI pipeline’ına da eklenir.
Multi-tenant mimaride 'tüm tenantlar aynı performansı alır' miti doğru mu? Gerçek dünyada ne deneyimledim?
Bu mit kesinlikle yanlıştır. Benim deneyimimde, bir tenantın yoğun veri girişi ve büyük raporlamalar yaptığı zaman CPU ve I/O kaynakları o an için o tenantı önceliklendirir, diğer tenantların yanıt süresi uzar. Özellikle tek veritabanı‑tek şema modelinde, indeks tasarımı ve sorgu planları tenant bazlı farklılık gösterebilir. Bu sorunu hafifletmek için, PostgreSQL’de `resource groups` ya da MySQL’de `resource pools` gibi mekanizmalarla tenant bazlı kaynak limitleri koyarım ve sık kullanılan tenantlar için ayrı read‑replica’lar oluştururum. Böylece her tenantın minimum performans garantisi sağlanır.
ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Yorumlar

Sunucu Taraflı AI Moderasyon

Yorumlar sunucuda yapay zeka ile denetlenir ve kalıcı olarak saklanır.

?
0/2000

Sunucu taraflı AI denetim

✉️ Ücretsiz · Spam yok · İstediğin an çık

Yeni yazılardan haberdar olun

Yeni içerikler ve teknik notlar e-postanıza gelsin.

  • 📌
    Haftanın en iyisi Sadece okumaya değer tek yazı
  • 🔧
    Alet çantası Bu hafta kullandığım araçlar
  • 🧠
    Perde arkası Blog'a girmeyen notlar

Spam yapmıyoruz. İstediğiniz zaman ayrılabilirsiniz. · Sadece Umami (self-hosted, Google yok) ile takip.

Okuma İstatistikleriniz

0

Yazı Okundu

0dk

Okuma Süresi

0

Gün Serisi

-

Favori Kategori

İlgili Yazılar