Data terdistribusi di Azure Database for PostgreSQL - Hyperscale (Citus)

BERLAKU UNTUK: Azure Database for PostgreSQL - Hyperscale (Citus)

Artikel ini menguraikan tiga jenis tabel di Azure Database for PostgreSQL – Hyperscale (Citus). Artikel ini menunjukkan bagaimana tabel terdistribusi disimpan sebagai pecahan, dan bagaimana pecahan ditempatkan di simpul.

Jenis tabel

Ada tiga jenis tabel dalam grup server Hyperscale (Citus), masing-masing digunakan untuk tujuan berbeda.

Jenis 1: Tabel terdistribusi

Jenis pertama, dan yang paling umum, adalah tabel terdistribusi. Tabel ini terlihat seperti tabel normal untuk pernyataan SQL, tetapi secara horizontal dipartisi di seluruh simpul pekerja. Ini artinya bahwa baris tabel disimpan pada simpul yang berbeda, dalam tabel fragmen yang disebut pecahan.

Hyperscale (Citus) tidak hanya menjalankan pernyataan SQL tetapi DDL di seluruh kluster. Mengubah skema kaskade tabel terdistribusi untuk memperbarui semua pecahan tabel di seluruh pekerja.

Kolom distribusi

Hyperscale (Citus) menggunakan sharding algoritmik untuk menetapkan baris ke pecahan. Tugas dibuat secara deterministik berdasarkan nilai kolom tabel yang disebut kolom distribusi. Administrator kluster harus menunjuk kolom ini saat mendistribusikan tabel. Membuat pilihan yang tepat sangat penting untuk performa dan fungsionalitas.

Jenis 2: Tabel referensi

Tabel referensi adalah jenis tabel terdistribusi yang seluruh isinya terkonsentrasi ke dalam satu pecahan. Pecahan direplikasi pada setiap pekerja dan koordinator. Kueri pada pekerja mana pun dapat mengakses informasi referensi secara lokal, tanpa overhead jaringan dari baris yang meminta dari simpul lain. Tabel referensi tidak memiliki kolom distribusi karena tidak perlu membedakan pecahan terpisah per baris.

Tabel referensi biasanya kecil dan digunakan untuk menyimpan data yang relevan dengan kueri yang berjalan pada simpul pekerja mana pun. Misalnya nilai enumerasi seperti status pesanan atau kategori produk.

Jenis 3: Tabel lokal

Ketika Anda menggunakan Hyperscale (Citus), simpul koordinator yang Anda sambungkan adalah database PostgreSQL biasa. Anda dapat membuat tabel biasa pada koordinator dan memilih untuk tidak memecahnya.

Kandidat yang baik untuk tabel lokal adalah tabel administratif kecil yang tidak ikut dalam kueri gabungan. Misalnya tabel pengguna untuk masuk dan autentikasi aplikasi.

Pecahan

Bagian sebelumnya menjelaskan bagaimana tabel terdistribusi disimpan sebagai pecahan pada simpul pekerja. Bagian ini membahas detail teknis lebih lanjut.

Tabel metadata pg_dist_shard pada koordinator berisi baris untuk setiap pecahan dari setiap tabel terdistribusi dalam sistem. Baris ini cocok dengan ID pecahan dengan rentang bilangan bulat dalam ruang terpecah (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)

Jika simpul koordinator ingin menentukan pecahan mana yang memegang baris github_events, itu memecah nilai kolom distribusi dalam baris. Kemudian node memeriksa rentang pecahan mana yang berisi nilai hash. Rentang didefinisikan sehingga gambar fungsi hash adalah menggabungkan pecahan.

Penempatan Pecahan

Misalkan pecahan 102027 dikaitkan dengan baris yang bersangkutan. Baris tersebut dibaca atau ditulis dalam tabel yang disebut github_events_102027 di salah satu pekerja. Pekerja yang mana? Itu sepenuhnya ditentukan oleh tabel metadata. Pemetaan pecahan kepada pekerja dikenal sebagai penempatan pecahan.

Simpul koordinator menulis ulang kueri ke dalam fragmen yang merujuk ke tabel tertentu seperti github_events_102027 dan menjalankan fragmen tersebut pada pekerja yang sesuai. Berikut adalah contoh kueri yang dijalankan di belakang layar untuk menemukan simpul yang menyimpan pecahan ID 102027.

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 │
└─────────┴───────────┴──────────┘

Langkah berikutnya