Delen via


Elastische clusters in Azure Database for PostgreSQL

Elastische clusters in de Azure Database for PostgreSQL-service zijn een beheerd aanbod van de opensource Citus-extensie voor PostgreSQL waarmee horizontale sharding van PostgreSQL mogelijk is.

Hoewel Citus slechts een extensie is, verbindt het meerdere PostgreSQL-exemplaren. Wanneer een exemplaar van een flexibele Azure Database for PostgreSQL-server wordt geïmplementeerd met Citus, wordt het beheer en de configuratie van meerdere PostgreSQL-exemplaren als één resource verwerkt. Ook worden de knooppunten automatisch ingesteld en worden ze bekend bij de Citus-extensie.

Elastische clusters in de service bieden twee shardingmodellen: rij-gebaseerde sharding en schema-gebaseerde sharding. Raadpleeg de opensource-documentatie over sharding-modellen als u meer wilt weten.

Architectuur

Een elastisch cluster bestaat uit een of meer knooppunten van Azure Database for PostgreSQL-flexibele serverexemplaren. Deze exemplaren worden automatisch aan elkaar bekend gemaakt en verbonden met een Citus-cluster. De knooppunten moeten van dezelfde reken- en opslaglaag zijn en kunnen uniform omhoog of omlaag worden geschaald naar hogere of lagere lagen.

Elastische clusters maken gebruik van instanties van flexibele servers (knooppunten genoemd) om met elkaar te coördineren in een 'shared nothing'-architectuur. Met de architectuur kan de database ook worden geschaald door meer knooppunten toe te voegen aan het cluster.

Als u verbinding maakt met uw cluster via poort 5432, komt u terecht op het aangewezen coördinatorknooppunt. Met elastische clusters kunt u ook taken verdelen over verbindingen in het cluster, met behulp van een hashmethode met vijf tuples, als u verbinding maakt via poort 7432. Met 7432 kunt u nog steeds landen op het knooppunt dat momenteel als coördinator is aangewezen. Voor bepaalde clusterbewerkingen, zoals het distribueren van tabellen, moet u mogelijk verbinding maken via poort 5432. We raden u ten zeerste aan om altijd verbinding te maken op poort 5432 wanneer u van plan bent om toepassingsschema-upgrades en vergelijkbare wijzigingen uit te voeren. Als u PgBouncer inschakelt voor elastische clusters, kunt u poort 8432 gebruiken om verbindingen over PgBouncer-exemplaren op elk knooppunt te verdelen (of poort 6432 te gebruiken voor de aangewezen coördinator).

In tegenstelling tot Cosmos DB for PostgreSQL worden knooppuntadressen niet extern weergegeven. Als u citus-metagegevenstabellen bekijkt, pg_dist_nodeziet u mogelijk dat alle knooppunten hetzelfde IP-adres hebben als in het voorbeeld 10.7.0.254 , maar verschillende poortnummers.

select nodeid, nodename, nodeport from pg_dist_node;
 nodeid |  nodename  | nodeport
--------+------------+----------
      1 | 10.7.0.254 |     7000
      2 | 10.7.0.254 |     7001
 
(2 rows)

In de infrastructuur van Azure bevinden deze knooppunten zich op verschillende virtuele machines, ook al lijken ze mogelijk verschillende poorten op dezelfde machine te zijn.

Raadpleeg de officiële opensource-projectdocumentatie voor meer informatie over Citus.

Standaard worden tabellen en schema's die met Citus zijn gemaakt, niet automatisch verdeeld over het cluster. U moet beslissen over een shardingmodel en besluiten om schema's te distribueren of om uw tabelgegevens te distribueren met sharding op basis van rijen.

Voor elke query in gedistribueerde tabellen routeert het queryknooppunt het naar één knooppunt of parallelliseert het over verschillende knooppunten. De beslissing is afhankelijk van of de vereiste gegevens zich op één knooppunt of op meerdere knooppunten bevinden. Met sharding op basis van schema's stuurt de coördinator de query's rechtstreeks naar het knooppunt dat als host fungeert voor het schema. In beide, op schema gebaseerde sharding en op rijen gebaseerde sharding, bepaalt het knooppunt wat u moet doen door tabellen met metagegevens te raadplegen. Deze tabellen volgen de locatie en status van knooppunten en de distributie van gegevens over knooppunten.

Zodra gegevens zijn gedistribueerd met behulp van een van de sharding-modellen, kunt u verbinding maken met een van de knooppunten om DML-bewerkingen (Data Modification Language) (SELECT, UPDATE, INSERT, DELETE) uit te voeren. Alle knooppunten bevatten de metagegevens die nodig zijn om gegevens te vinden die nodig zijn voor de query en kunnen deze verkrijgen om de query te beantwoorden.

DDL-bewerkingen (Data Definition Language) en clusterbrede bewerkingen zijn momenteel beperkt tot het knooppunt met de coördinatorrol. Zorg ervoor dat u DDL- en clusterbrede bewerkingen uitvoert door verbinding te maken met poort 5432 in plaats van poort 7432 te gebruiken.

U kunt een elastisch cluster uitschalen door nieuwe knooppunten toe te voegen en de gegevens ervan opnieuw te verdelen. Herverdeling is een onlinebewerking en blokkeert actieve workloads niet.

Scherven

In de vorige sectie wordt beschreven hoe gedistribueerde tabellen worden opgeslagen als shards op werkknooppunten. In deze sectie worden meer technische details over deze shards besproken.

De pg_dist_shard metagegevenstabel bevat een rij voor elke shard van elke gedistribueerde tabel in het systeem. De rij komt overeen met een shard-id (shardid) met een bereik van gehele getallen in een hash-ruimte (shardminvalue, shardmaxvalue).

SELECT * from pg_dist_shard;
logicalrelid  | shardid | shardstorage | shardminvalue | shardmaxvalue
---------------+---------+--------------+---------------+---------------
 github_events |  102026 | t            | 268435456     | 402653183
 github_events |  102027 | t            | 402653184     | 536870911
 github_events |  102028 | t            | 536870912     | 671088639
 github_events |  102029 | t            | 671088640     | 805306367
 
 (4 rows)

Als het knooppunt wil bepalen van welke shard een rij github_eventsbevat, heeft het de waarde van de distributiekolom in de rij. Vervolgens controleert het knooppunt welk bereik van de shard de hash-waarde bevat. De bereiken worden gedefinieerd zodat de afbeelding van de hash-functie de niet-aaneengesloten samenvoeging is.

Shard-plaatsingen

Stel dat shard-102027 is gekoppeld aan de betreffende rij. De rij wordt gelezen of geschreven in een tabel die wordt aangeroepen github_events_102027 in een van de werkrollen. Met de informatie die is opgeslagen in de metagegevenstabellen, bepaalt de extensie wat die specifieke werkrol is. De toewijzing van shard aan werkrol wordt de shardplaatsing genoemd.

Het knooppunt herschrijft query's in fragmenten die verwijzen naar de specifieke tabellen, zoals github_events_102027 en voert deze fragmenten uit op de juiste werkrollen. Hier volgt een voorbeeld van een query die achter de schermen wordt uitgevoerd om het knooppunt met shard met id-102027 te vinden.

SELECT
    shardid,
    node.nodename,
    node.nodeport
FROM pg_dist_placement placement
JOIN pg_dist_node node
  ON placement.groupid = node.groupid
 AND node.noderole = 'primary'::noderole
WHERE shardid = 102027;
┌─────────┬───────────┬──────────┐
│ shardid │ nodename  │ nodeport │
├─────────┼───────────┼──────────┤
│  102027 │ localhost │     5433 │
└─────────┴───────────┴──────────┘