Groepsgewijze verbindingen gebruiken

Lakebase bevat een ingebouwde PgBouncer-verbindingspooler die een groep serververbindingen onderhoudt en deze deelt via veel clientverbindingen. De pooler ondersteunt maximaal 10.000 gelijktijdige clientverbindingen, waardoor deze geschikt is voor serverloze functies, web-API's en andere toepassingen die veel kortdurende verbindingen openen.

Voor groepsgewijze verbindingen is systeemeigen Postgres-wachtwoordverificatie vereist. Het is niet beschikbaar voor OAuth-rollen.

Hoe groepsgewijze verbindingen werken

Elke Postgres-verbinding verbruikt serverbronnen omdat Postgres een afzonderlijk proces voor elke client maakt. Naarmate gelijktijdige verbindingen toenemen, kunnen ze de verbindingslimiet van de server snel uitputten.

De verbindingspooler bevindt zich tussen uw toepassing en Postgres. Clients maken verbinding met de pooler en de pooler stuurt query's door naar een kleinere groep werkelijke serververbindingen. Lakebase voert PgBouncer uit in de transactiemodus, dus een serververbinding wordt alleen bewaard voor de duur van één transactie en vervolgens geretourneerd naar de pool. Hierdoor kunnen veel clients een kleine groep serververbindingen delen.

Verbindingsgroepen

PgBouncer maakt een afzonderlijke pool voor elke database en combinatie van gebruikers. Twee gebruikers die verbinding maken met dezelfde database, krijgen onafhankelijke pools. De grootte van elke pool is ongeveer 90% van de Postgres-limiet max_connections , die verschilt per rekenkracht.

Wanneer alle verbindingen in een pool worden gebruikt, wachten nieuwe clientaanvragen in een wachtrij. Als een serververbinding niet binnen 2 minuten beschikbaar is, ontvangt de client een time-outfout.

Diagram dat laat zien hoe meerdere clientverbindingen via PgBouncer worden gerouteerd naar afzonderlijke pools per gebruiker en per database, die een beperkt aantal directe Postgres-verbindingen delen, begrensd door max_connections.

In het diagram ziet u hoe meerdere clientverbindingen van verschillende gebruikers worden gerouteerd via afzonderlijke PgBouncer-pools (één per gebruiker/databasecombinatie), die een beperkt aantal werkelijke Postgres-verbindingen delen.

Verbindingslimieten

Drie limieten zijn van toepassing op groepsgewijze verbindingen:

Limiet Waarde Wat het bestuurt
Clientverbindingen (max_client_conn) 10.000 Maximum aantal verbindingen van uw toepassing naar PgBouncer
Poolgrootte (default_pool_size) ~90% van max_connections Actieve serververbindingen per paar (gebruiker, database)
Directe verbindingen (max_connections) Verschilt per berekeningseenheid Maximum aantal directe Postgres-verbindingen

De limiet voor directe verbindingen is afhankelijk van uw rekenkracht. Een 8 CU-rekenproces ondersteunt bijvoorbeeld 1678 directe verbindingen en een 16 CU-rekenkracht ondersteunt 3.357. Zie Compute-specificaties voor de volledige lijst.

De verbindingslimiet van 10.000 clients betekent niet dat er 10.000 gelijktijdige queryresultaten zijn. Het vertegenwoordigt het maximum aantal clientverbindingen dat PgBouncer accepteert. Het aantal gelijktijdige actieve transacties wordt gebonden door de poolgrootte, die ongeveer 90% max_connectionsis.

Groepsgewijze verbindingen inschakelen

Prerequisites

  • Uw Lakebase Autoscaling-project moet actief zijn.
  • U moet een systeemeigen Postgres-wachtwoordrol hebben in het project. Zie Een systeemeigen Postgres-wachtwoordrol maken voor instructies.
  • Als u verbindingspooling wilt gebruiken met alleen-lezen-compute-instanties, moet u beschikken over een eindpunt voor hoge beschikbaarheid waarbij Toegang tot alleen-lezen-compute-instanties toestaan is ingeschakeld. Zie Hoge beschikbaarheid.

Steps

  1. Ga in de Lakebase-app naar uw project en klik op Verbinden.
  2. Selecteer de vertakking en rekenkracht waarmee u verbinding wilt maken.
  3. Selecteer in de vervolgkeuzelijst Rol een systeemeigen Postgres-wachtwoordrol. De schakeloptie Verbindingspooling is alleen zichtbaar wanneer een wachtwoordrol is geselecteerd. Het is verborgen voor OAuth-rollen.
  4. Schakel groepsgewijze verbindingen in.
  5. Kopieer de verbindingsreeks en gebruik deze in uw toepassing.

Dialoogvenster verbinding met de schakelaar Pooled connections ingeschakeld voor een native Postgres-wachtwoordrol.

Indelingen van verbindingsstrings

Pooler-verbindingsreeksen gebruiken een andere hostnaam dan directe databaseverbindingen. De hostnaam bevat -pooler na de endpoint-ID voor lees- en schrijfbewerkingen, of -ro-pooler voor alleen-lezenbewerkingen:

Rekentype Hostnaamindeling Wanneer te gebruiken
lees-/schrijfcompute <endpoint-id>-pooler.<region>.<cloud>.databricks.com Al het schrijf- en leesverkeer
Alleen-lezen berekenen <endpoint-id>-ro-pooler.<region>.<cloud>.databricks.com Alleen verkeer lezen. Vereist een eindpunt voor hoge beschikbaarheid waarvoor leestoegang is ingeschakeld.

Beide gebruiken poort 5432.

Opmerking

Kopieer de pooler verbindingsreeks rechtstreeks vanuit het dialoogvenster Connect in de Lakebase-app om de juiste hostnaam op te halen voor uw eindpunt, regio en cloud.

PgBouncer-configuratie

Lakebase beheert PgBouncer met de volgende instellingen. Deze instellingen zijn opgelost en kunnen niet worden aangepast.

[pgbouncer]
pool_mode=transaction
max_client_conn=10000
default_pool_size=0.9 * max_connections
max_prepared_statements=1000
query_wait_timeout=120
Configuratie Beschrijving
pool_mode=transaction Serververbindingen keren na elke transactie terug naar de pool. Zie transactiemodus.
max_client_conn=10000 Maximum aantal gelijktijdige clientverbindingen dat PgBouncer accepteert.
default_pool_size=0.9 * max_connections Actieve serververbindingen per paar (gebruiker, database). Verschilt per compute-grootte.
max_prepared_statements=1000 Hiermee kunt u prepared statements op protocolniveau toestaan in de transactiemodus. Beperkt het aantal bijgehouden statements tot 1.000 per clientverbinding.
query_wait_timeout=120 Aantal seconden dat een client wacht op een serververbinding voordat er een time-outfout optreedt.

Transactiemodus

De transactiemodus verbetert de efficiëntie van de verbinding, maar beperkt bepaalde Postgres-functies waarvoor een permanente serververbinding is vereist. De volgende functies zijn niet beschikbaar wanneer u de verbindingspooler gebruikt:

  • Voorbereide instructies op SQL-niveau: PREPARE en DEALLOCATE instructies worden niet ondersteund in de transactiemodus. Voorbereide instructies op stuurprogrammaniveau (intern gebruikt door psycopg, node-postgres, JDBC en vergelijkbare bibliotheken) werken correct via ondersteuning op protocolniveau van PgBouncer. Als u voor JDBC fouten ziet met betrekking tot voorbereide instructies, stelt u deze in prepareThreshold=0 om het opslaan van voorbereide instructies aan de serverzijde uit te schakelen.

  • Instellingen op sessieniveau: SET opdrachten blijven niet behouden tussen transacties, omdat elke transactie een andere serververbinding kan gebruiken. Voorbeeld:

    BEGIN;
    SET search_path TO myschema;
    SELECT * FROM mytable; -- works in this transaction
    COMMIT;
    -- connection returns to pool after COMMIT
    SELECT * FROM mytable; -- ERROR: relation "mytable" does not exist
    

    Als u een instelling permanent wilt toepassen, gebruikt u ALTER ROLE in plaats daarvan:

    ALTER ROLE myrole SET search_path TO myschema, public;
    
  • Tijdelijke tabellen die in een sessie worden bewaard: tijdelijke tabellen die tussen transacties blijven bestaan, zijn niet beschikbaar. In de volgende transactie kan een verbinding die aan de pool wordt geretourneerd, worden toegewezen aan een andere client.

  • WITH HOLD cursors: Cursors die worden gedeclareerd met WITH HOLD vereisen een permanente verbinding en worden niet ondersteund.

  • Adviesvergrendelingen: PgBouncer biedt geen ondersteuning voor adviesvergrendelingen. Adviesvergrendelingen vereisen een permanente serververbinding, die niet beschikbaar is in de transactiemodus.

  • LISTEN/NOTIFY: Niet ondersteund. Gebruik een directe (niet-pool)verbinding voor toepassingen waarvoor pub-/subberichten zijn vereist.

  • pg_dump en schemamigraties: Gebruik een directe verbinding voor pg_dumpschemamigraties en andere hulpprogramma's die afhankelijk zijn van de status op sessieniveau.

Opmerking

Voor toepassingen waarvoor Postgres-functies op sessieniveau zijn vereist, gebruikt u een directe verbindingsreeks vanuit het dialoogvenster Connect zonder de schakeloptie Connection pooling in te schakelen.