Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
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
- Ga in de Lakebase-app naar uw project en klik op Verbinden.
- Selecteer de vertakking en rekenkracht waarmee u verbinding wilt maken.
- 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.
- Schakel groepsgewijze verbindingen in.
- Kopieer de verbindingsreeks en gebruik deze in uw toepassing.
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:
PREPAREenDEALLOCATEinstructies 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 inprepareThreshold=0om het opslaan van voorbereide instructies aan de serverzijde uit te schakelen.Instellingen op sessieniveau:
SETopdrachten 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 existAls u een instelling permanent wilt toepassen, gebruikt u
ALTER ROLEin 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 HOLDcursors: Cursors die worden gedeclareerd metWITH HOLDvereisen 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_dumpen schemamigraties: Gebruik een directe verbinding voorpg_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.