Simpul dan tabel di Azure Database for PostgreSQL - Hyperscale (Citus)
BERLAKU UNTUK:
Azure Database for PostgreSQL - Hyperscale (Citus)
Simpul
Jenis hosting Hyperscale (Citus) memungkinkan Azure Database for PostgreSQL server (disebut simpul) untuk berkoordinasi satu sama lain dalam arsitektur "tidak berbagi apa-apa". Simpul dalam grup server secara kolektif menyimpan lebih banyak data dan menggunakan lebih banyak core CPU daripada yang dimungkinkan pada satu server. Arsitektur juga memungkinkan database untuk menskalakan dengan menambahkan lebih banyak simpul ke grup server.
Koordinator dan pekerja
Setiap grup server memiliki simpul koordinator dan beberapa pekerja. Aplikasi mengirimkan kueri mereka ke simpul koordinator, yang menyampaikannya kepada pekerja yang relevan dan mengakumulasi hasilnya. Aplikasi tidak dapat tersambung langsung ke pekerja.
Hyperscale (Citus) memungkinkan administrator database untuk mendistribusikan tabel, menyimpan baris yang berbeda pada simpul pekerja yang berbeda. Tabel terdistribusi adalah kunci performa Hyperscale (Citus). Gagal mendistribusikan tabel akan membuat tabel sepenuhnya berada pada simpul koordinator dan tidak dapat mengambil keuntungan dari paralelisme lintas mesin.
Untuk setiap kueri pada tabel terdistribusi, koordinator merutekannya ke satu simpul pekerja, atau menyejajarkannya di beberapa simpul tergantung pada apakah data yang diperlukan ada pada satu simpul atau lebih. Koordinator memutuskan apa yang harus dilakukan dengan mengkonsultasikan tabel metadata. Tabel ini melacak nama DNS dan kesehatan simpul pekerja, dan distribusi data di seluruh simpul.
Jenis tabel
Ada tiga jenis tabel dalam grup server Hyperscale (Citus), masing-masing disimpan secara berbeda pada simpul dan 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. 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
- Tentukan jenis aplikasi Anda untuk mempersiapkan pemodelan data