PRODSoeverein Europees BaaS-platformOpen Dashboard →

Prestaties · 11 min gelezen

Toegewijde versus gedeelde database: prestaties en isolatie

Affane Daylami · Fondateur · 31 mei 2026

Terug naar blog

Een gedeelde database betekent niet dat uw gegevens worden gemengd met die van een andere klant. Het betekent dat uw database draait op een Postgres-server die wordt gedeeld met andere databases. De echte vraag is dus niet “zijn mijn gegevens geïsoleerd?” » maar “zijn mijn hulpbronnen?” ". CPU, geheugen, verbindingen en schijfdoorvoer kunnen verslechteren vanwege een luidruchtige buur, zelfs als elke huurder zijn eigen database, zijn eigen tabel en zijn eigen beleid heeft.

Deze Engelse tekst is automatisch gegenereerd op basis van het Franse origineel en is nog niet beoordeeld.
Deze pagina is automatisch vertaald. De Engelse versie is gezaghebbend.

Dit artikel vergelijkt de meest gedocumenteerde Postgres-tenancymodellen (gedeeld schema, per tenantbasis, speciaal cluster, ook wel database-per-tenant versus gedeelde database genoemd), legt het noisy neighbor-mechanisme uit en beschrijft vervolgens hoe Aurabase zijn eigen tweelaagsmodel implementeert, geverifieerd in de provisionercode. Voor de methodologie die we toepassen voordat we een prestatiecijfer publiceren, zie onze backend benchmarkmethodologie.

Als u op zoek bent naar de kwestie van gegevenslekken tussen twee clients (RLS, beleid, service_role), dan is dit niet de invalshoek van dit artikel: onze RLS-vergelijking en speciale database per project behandelt deze logische isolatie in detail. Hier hebben we het over fysieke bronnen: CPU, IO, verbindingen, cache.

De essentie

  • Een gedeelde database is niet noodzakelijkerwijs een gedeeld schema: Aurabase geeft elk project zijn eigen Postgres-database, zelfs op de standaardniveaus, door alleen het cluster te delen.
  • noisy neighbor verslechtert fysieke bronnen (CPU, IOPS, verbindingen, autovacuüm), niet de vertrouwelijkheid van gegevens: RLS lost dit niet op, dat is niet zijn rol.
  • De Aurabase-provisioner routeert naar precies twee architecturen, geverifieerd in de code: FullyDedicated (volledige CNPG-cluster gereserveerd voor een project, ondernemingsniveau) of SharedClusterDedicated (specifieke basis op de CNPG-cluster van de organisatie, nooit gedeeld met een andere organisatie).
  • Een Aurabase-vlootcluster heeft een standaard waargenomen capaciteitsdrempel van 1000 bases per cluster, configureerbaar, waarna de aanbeveling is om naar een speciaal cluster te migreren.
  • De juiste keuze hangt af van uw werkelijke beperkingen (compliance, verkeersvoorspelbaarheid, budget), en niet van de reflex ‘toegewijd is altijd beter’.
#
De modellen

Drie Postgres-managementmodellen, van de meest gedeelde tot de meest geïsoleerde

In de officiële documentatie van Microsoft over de architectuur van SaaS-applicaties met meerdere tenants worden drie huurmodellen onderscheiden, doorgaans Silo (toegewijde bronnen per tenant), Pool (volledig gedeelde bronnen) en Bridge (een combinatie van de twee, sommige geïsoleerde tenants, andere gedeeld). Deze drie modellen zijn rechtstreeks van toepassing op Postgres, op schema-, database- of volledig clusterniveau.

Concreet levert dit voor een Postgres-backend drie verschillende architecturen op. Het gedeelde schema (een enkele basis, een kolom tenant_id, RLS-beleid dat de rijen filtert) is het meest voorkomende poolmodel in handleidingen voor meerdere tenants: economisch, maar de grens tussen twee clients wordt een SQL-expressie die tabel voor tabel wordt geëvalueerd. De -basis per tenant op een gedeeld cluster is een tussenliggend Bridge-model: elke tenant heeft zijn eigen Postgres-basis (een echte CREATE DATABASE-opdracht), maar er bestaan ​​verschillende bases naast elkaar op hetzelfde fysieke cluster, waardoor CPU, IO en verbindingen worden gedeeld. Het cluster, volledig toegewijd per tenant,, is het complete Silo-model: volledig geïsoleerde CPU-, RAM- en IO-bronnen, doorgaans gereserveerd voor tenants met hoge compliance- of belastingsproblemen.

ModelIsolatie van hulpbronnenIsolatie van opslagOperationele inspanning
Gedeeld schema (tenant_id + RLS)GeenGeen (gemeenschappelijke tafel)Minimaal (1 basis om te bedienen)
Per tenantbasis, gedeeld clusterGedeeltelijk (cluster CPU/IO)Totaal (eigen basis)Matig (N basen, 1 cluster)
Volledig toegewezen cluster per tenantTotaalTotaalHoog (1 cluster per tenant)

Silo / Pool / Bridge-terminologie: officiële Microsoft-documentatie, SaaS-architectuurpatronen met meerdere tenants (Azure Architecture Center).

Het tussenmodel, basis per tenant op een gedeeld cluster, ontbreekt vaak in de handleidingen die de keuze als binair presenteren tussen “één enkele basis voor iedereen” en “één server per client”. Dit is echter degene die Aurabase standaard gebruikt, zoals hieronder beschreven.

De keuze tussen deze drie modellen ontstaat bij elke multi-tenant architectuurbeslissing, en niet alleen bij een BaaS-provider: een team dat zijn eigen SaaS-backend bouwt op beheerde Postgres (RDS, Cloud SQL of een zelf-gehoste instantie) maakt precies dezelfde arbitrage, waarbij dezelfde conflictmechanismen in het spel zijn zodra meerdere clients op dezelfde fysieke instantie worden geplaatst.

#
Het mechanisme

De luidruchtige buur: wat verslechtert als hulpbronnen worden gedeeld

Een noisy neighbor (luidruchtige buur) is een tenant die een onevenredig groot deel van de gedeelde bronnen van een infrastructuur verbruikt, ten koste van andere tenants op dezelfde server. De term komt uit de publieke cloud, maar is rechtstreeks van toepassing op een gedeeld Postgres-cluster: de ene database kan de prestaties van andere databases verslechteren zonder ooit hun gegevens aan te raken.

Zes mechanismen komen het vaakst voor in de productie:

  • CPU-conflict: een dure query (join zonder index, massale sortering) verbruikt CPU-cycli die de kernel deelt tussen alle actieve databases in het cluster.
  • IOPS-conflict: een back-up, een VACUUM FULL of een enorme import verzadigt de schijfdoorvoer van het cluster, waardoor het lezen en schrijven naar andere databases wordt vertraagd.
  • Uitputting van verbindingen: max_connections beperkt het aantal actieve verbindingen op het gehele clusterniveau, niet per basis. Een basis die te ver opengaat, verkleint de marge van anderen.
  • Autovacuümconflict: autovacuüm wordt uitgevoerd met een beperkt aantal werkers per cluster; een database met een hoge schrijfsnelheid kan het opschonen van de tabellen van een andere database vertragen.
  • Cache-verwijdering: shared_buffers is één geheugen voor het hele cluster; een database met een grote werkset kan de in de cache opgeslagen pagina's van een kleinere aangrenzende database verwijderen.
  • Gedeelde onderhoudsvensters: back-up, replica-failover of grote upgrade zijn van toepassing op het gehele cluster, niet per basis.
Cluster gedeeld met vier projecten versus cluster gewijd aan één projectAan de linkerkant herbergt een gedeeld CNPG-cluster vier bases (Project A tot D) die allemaal convergeren naar dezelfde pool van CPU's, IOPS en gedeelde verbindingen, waardoor er een mogelijke strijd tussen hen mogelijk is. Aan de rechterkant host een speciaal CNPG-cluster slechts één project, waarbij CPU, IOPS en verbindingen gereserveerd zijn, dus er is geen externe strijd mogelijk.Gedeeld clusterProject AProject BProject CProject DCPU · Gedeelde IOPSgedeelde verbindingenMogelijke strijd tussen A, B, C, DSpeciaal clusterJouw projectCPU · Gereserveerde IOPSgereserveerde verbindingenGeen externe terughoudendheid

Structuurdiagram, geen meetresultaat: tot nu toe zijn er voor deze twee topologieën geen vergelijkende prestatiecijfers gepubliceerd.

Verbindingsbudget is vaak het meest zichtbare symptoom in productie, zelfs vóór de latentie. Dit is het gedetailleerde onderwerp van onze max_connections afstemmingsgids en onze vergelijking PgBouncer, Supavisor en PgCat.

Een pooler in transactiemodus (PgBouncer, Supavisor, PgCat) vermindert de uitputting van de verbinding, maar neemt de CPU- of IOPS-conflicten niet weg: het hergebruikt bestaande serververbindingen, het voegt geen extra CPU-kernen of schijfdoorvoer toe aan het cluster. Ons artikel over de transactiepoolingmodus legt uit wat deze modus feitelijk verandert, en wat deze niet verandert.

#
De limiet

RLS isoleert gegevens, geen bronnen

Row-Level Security lost een ander probleem op: het voorkomt dat een query de rijen van een andere tenant leest of wijzigt, op logisch niveau. Er wordt geen CPU-cyclus, geen verbindingsslot en geen schijfdoorvoer gereserveerd voor een specifieke tenant.

Twee huurders kunnen een perfect waterdicht RLS-beleid hebben en elkaar tegelijkertijd degraderen: de luidruchtige buurman is een probleem van fysieke bronnen, niet van toegangsrechten. Het verwarren van deze twee leidt tot een vals gevoel van operationele veiligheid zodra EPIRB is geïnstalleerd.

Info

Voor logische isolatie (RLS-beleid, service_role, grens tussen projecten aan de beveiligingskant), zie ons speciale artikel: RLS en speciale basis per project, de keuze voor multi-tenant isolatie van Aurabase. Dit artikel blijft op het niveau van fysieke hulpbronnen.

#
In de code

Het Aurabase-model, geverifieerd in code

De provisionercode (aura-provisioner) documenteert precies twee mogelijke architecturen voor een actief Postgres-project, vanuit een provisioningconsolidatie waarnaar de code verwijst als Taak 12: FullyDedicated en SharedClusterDedicated. Verouderde, op schema gebaseerde modellen zijn verwijderd uit het inrichtingspad.

Het niveau enterprise activeert FullyDedicated: een volledig CNPG-cluster, gereserveerd voor dit enkele project. Alle andere niveaus (gratis, pro, team) leiden naar SharedClusterDedicated: een volwaardige Postgres project_<uuid>-database, op de CNPG-cluster van de projectorganisatie. Het is daarom geen gedeeld schema: zelfs bij een standaardabonnement is uw database een complete Postgres-database, niet één regel onder andere in een gemeenschappelijke tabel. Wat wordt gedeeld is het cluster (CPU, RAM, schijf, verbindingen), niet de basis zelf.

Het CNPG-cluster van een organisatie wordt gemaakt wanneer het eerste Postgres-project wordt ingericht en host nooit een project van een andere organisatie, een ontwerpkeuze die is vergrendeld op codeniveau (org_cluster.rs, Postgres-adviesvergrendeling per organisatie bij creatie). De enige mogelijke luidruchtige buurman op de gedeelde Aurabase-overloop is dus een ander project van uw eigen organisatie, nooit dat van een externe opdrachtgever.

fleet.rsrust
/// Nominale capaciteit (aantal projectbases) van een organisatiecluster.
/// Waarneembaarheidsdrempel: stuur de organisatie verder richting FullyDedicated.
/// Bestuurbaar via FLEET_CLUSTER_CAPACITY (standaard 1000, beperkt [1, 1_000_000]).
pub fn fleet_cluster_capacity() -> i32 {
    std::env::var("FLEET_CLUSTER_CAPACITY")
        .ok()
        .and_then(|v| v.parse::<i32>().ok())
        .filter(|n| (1..=1_000_000).contains(n))
        .unwrap_or(1000)
}
2
Mogelijke architecturen
FullyDedicated of SharedClusterDedicated, geen andere
1000
Basissen/cluster (standaard)
Configureerbaar, beperkt tussen 1 en 1.000.000
PG 16
Postgres-versie
Nog geen PG 17 op huurder/vlootclusters

Aurabase beheerde PostgreSQL-clusterarchitectuurspecificaties.

Deze drempel van 1000 bases per cluster is geen harde limiet: het is een observatiebenchmark die een aanbeveling activeert om naar FullyDedicatedte migreren, en niet een automatische blokkering. Het stuurt geen plaatsingsbeslissingen meer, er is nu slechts één cluster per organisatie mogelijk.

Elke cluster, dedicated of vloot, beschikt over een CNPG Pooler (PgBouncer) die een deel van de druk op actieve verbindingen absorbeert, in beide topologieën. Wat deze pooler feitelijk verandert voor de strijd om hulpbronnen, wordt hieronder gedetailleerd beschreven.

De CPU/RAM-grootte van een gedeeld cluster is ook niet uniform tussen organisaties: deze wordt afgeleid van het niveau van de organisatie via een speciale functie (FleetSizing::from_org_plan, geverifieerd in org_cluster.rs), en niet van één enkele grootte die op alle niveaus wordt toegepast. Een organisatie op teamniveau schaalt haar cluster niet op dezelfde manier in als een organisatie op vrij niveau.

Deze twee architecturen draaien op PostgreSQL 16, niet op versie 17, geverifieerd in de Dockerfile van de CNPG-image die bij de productie wordt gebruikt. Deze versiekeuze heeft zijn eigen afstemmingsimplicaties, gedetailleerd in onze Postgres 16 vs 17 vs 18 vergelijking.

#
De beslissing

Wanneer bundelen voldoende is, wanneer toewijding noodzakelijk wordt

Astuce

Pooling is geen goedkoop compromis. Het komt overeen met het verkeer van de overgrote meerderheid van de projecten in ontwikkeling, lancering of gematigde groei, waarbij een speciaal cluster een extra kostenpost zou zijn zonder meetbaar voordeel.

SignaalGedeeld is genoegToegewijd aanbevolen
Formele naleving van fysieke isolatie (gezondheid, HR, publieke sector)NeeJa
Voorspelbaar verkeer, gematigde piekenJa
Onvoorspelbare en aanhoudende piekbelastingRisico van terughoudendheidJa
Strak budget, product in validatiefaseJa
Contractclausule (DPA) die gedocumenteerde isolatie vereistNeeJa

Voor projecten die onderworpen zijn aan een contractuele verplichting voor gedocumenteerde fysieke isolatie, geven onze pagina's DPA en naleving pagina's aan wat elk niveau omvat.

De keerzijde van het base-by-tenant-model, benadrukt door verschillende beheertools voor schemamigratie, zoals Bytebase, is eerder operationeel dan technisch: elke migratie moet op elke basis worden toegepast en geverifieerd, één voor één, zelfs als ze naast elkaar op hetzelfde cluster bestaan. Een volledig dedicated cluster elimineert deze kosten niet, maar voegt ze zelfs toe: één migratie per cluster om onafhankelijk te monitoren, in plaats van slechts één.

Bronnen die gespecialiseerd zijn in softwarearchitectuur voor meerdere huurders, zoals CodeOpinion, presenteren deze tussenliggende benadering (per huurder op basis van gedeelde infrastructuur) regelmatig als een redelijk compromis tussen het gedeelde schema en het volledig toegewijde cluster, in plaats van een binaire keuze tussen de twee uitersten.

Om van gedeeld naar dedicated te gaan, is het niet nodig om een schema te herschrijven of de engine te wijzigen: in beide gevallen is het Postgres, met dezelfde pg_dump / pg_restore-keten als beschreven in onze Supabase naar Aurabase-migratiehandleiding. Het wijzigen van het niveau blijft een schakelhandeling, geen herschrijven van een applicatie.

#
Veelgestelde vragen

Veelgestelde vragen

Kan een gedeelde database van Aurabase worden vertraagd door een project van een ander bedrijf?+
Nee. Het gedeelde CNPG-cluster van Aurabase behoort tot één enkele organisatie en host nooit een project van een externe organisatie, geverifieerd in de provisionercode (org_cluster.rs). De enige mogelijke luidruchtige buurman op dit niveau is een ander project van uw eigen organisatie.
Maakt de gedeelde laag van Aurabase gebruik van een gedeeld schema met een tenant_id-kolom?+
Nee. Elk project krijgt zijn eigen Postgres-database (<9>project_<uuid></9>), zelfs op gratis, pro- en teamniveau. Wat wordt gedeeld is het CNPG-cluster (CPU, RAM, schijf, verbindingen), niet de basis zelf of het diagram ervan.
Hoe weet ik of mijn project een speciaal cluster nodig heeft?+
Drie signalen komen het vaakst naar voren: een formele nalevingsvereiste met betrekking tot de fysieke isolatie van bronnen, aanhoudend en onvoorspelbaar verkeer dat regelmatig de beschikbare verbindingen verzadigt, of een contractuele clausule van het DPA-type die gedocumenteerde isolatie vereist. Beneden deze drempels blijft pooling in de meeste gevallen economisch rationeler.
Is de drempel van 1000 bases per cluster een harde limiet?+
Nee, het is een waarneembaarheidsdrempel, geen automatisch technisch blok. Het is configureerbaar via de variabele FLEET_CLUSTER_CAPACITY (standaard 1000, beperkt tussen 1 en 1.000.000) en wordt gebruikt om aan te geven dat een organisatie zich moet richten op een speciaal cluster.
Is EPIRB voldoende om luidruchtige buren te voorkomen?+
Nee. De RLS filtert de rijen die zichtbaar zijn voor een query; het reserveert noch CPU, noch IOPS, noch verbindingen met een specifieke tenant. Twee tenants met een perfect waterdicht RLS-beleid kunnen elkaar nog steeds degraderen als ze hetzelfde fysieke cluster delen. Zie ons artikel over RLS en speciale basis per project voor het logische isolatiegedeelte.
Waarom kost pooling minder dan een speciaal cluster?+
Omdat de vaste kosten van een Postgres-cluster (CPU, RAM, gereserveerde opslag, back-ups) worden verdeeld over alle bases van de organisatie die er deel van uitmaken, in plaats van dat ze volledig door één enkel project worden betaald. Een speciaal cluster blijft gefactureerd, zelfs als de werkelijke projectlast laag is, wat het een rationele keuze maakt, vooral zodra een nalevings- of verkeerssignaal dit rechtvaardigt, en niet eerder.
#
Conclusie

Wat te onthouden

Dedicated base en shared base conflicteren niet op het gebied van gegevensbeveiliging: beide modellen kunnen de ene tenant op logisch niveau correct van de andere isoleren. Ze staan ​​tegenover elkaar op fysieke bronnen (CPU, IOPS, verbindingen, cache, onderhoudsvensters). Het is dit plan dat een luidruchtige buur definieert, en niet een slecht geschreven RLS-beleid.

Het Aurabase-model, geverifieerd in de provisioner-code, behoudt standaard een tussenliggend compromis: een speciale Postgres-database per project, op een gedeeld cluster, maar strikt gereserveerd voor één enkele organisatie, met een volledig speciaal cluster gereserveerd voor het bedrijfsniveau. De juiste keuze hangt af van uw werkelijke beperkingen, niet van een reflex waarbij toegewijd altijd de beste optie zou zijn.

KLAAR VOOR IMPLEMENTATIE?

Uw backend in vijf minuten.

Geen creditcard vereist · 500 MB gratis · 50.000 MAU