Topik ini menjelaskan fitur konfigurasi resource multi-tenant dari PolarDB for PostgreSQL.
Konsep
Tenant: Dalam arsitektur multi-tenancy, tenant adalah entitas logis yang merepresentasikan unit alokasi data dan resource. Tenant berada pada level di bawah kluster tetapi di atas user dan database. Beberapa akun atau database dapat termasuk dalam satu tenant. Tenant tidak sama dengan user atau database, dan dibagi menjadi dua kategori:
System tenant: Entitas administratif khusus. Sebuah kluster biasanya hanya memiliki satu system tenant. System tenant memiliki akses prioritas ke resource dan dapat menggunakan resource dari regular tenant. Ketika user dari system tenant terhubung ke database dan memiliki izin akses kluster yang diperlukan, mereka dapat mengakses resource dari semua tenant.
Regular tenant: Resource setiap regular tenant sepenuhnya terisolasi dari tenant lain. Regular tenant harus dibuat dalam konteks system tenant.
Resource configuration: Melibatkan alokasi resource tertentu, seperti CPU dan memori, ke tenant tertentu. Metode ini memungkinkan Akun istimewa menetapkan batas resource untuk setiap tenant sesuai kebutuhan.
Fitur konfigurasi resource tenant dirancang untuk membatasi jumlah resource yang digunakan oleh satu atau beberapa proses. Di PolarDB for PostgreSQL, satu session berkorespondensi dengan satu proses tunggal, dan dalam session tersebut, hanya satu user yang dapat login ke satu database. Sistem memungkinkan Anda memetakan proses, user, atau database ke tenant tertentu. Namun, satu proses hanya dapat dimiliki oleh satu tenant, sehingga mencegah penghitungan ganda penggunaan resource. Proses anak dari kueri paralel termasuk dalam tenant dari proses yang memulai kueri tersebut. Oleh karena itu, batas resource dapat dibagi ke dalam tiga dimensi berdasarkan atribut proses:
Proses: Proses koneksi (proses session) yang secara aktif diprakarsai oleh user. Ini mencakup proses kueri paralel terkait, tetapi tidak termasuk proses bantu sistem.
User: Semua proses koneksi (proses session) yang diprakarsai oleh user yang sama. Ini mencakup proses kueri paralel terkait, tetapi tidak termasuk proses bantu sistem.
Database: Semua proses koneksi (proses session) yang mengakses database yang sama. Ini mencakup proses kueri paralel terkait, tetapi tidak termasuk proses bantu sistem.
Secara default, tidak ada batas resource yang diterapkan pada proses sistem karena fungsi khususnya.
Cakupan
Versi PolarDB for PostgreSQL berikut didukung: PostgreSQL 14 dengan versi mesin minor 2.0.14.12.24.0 atau lebih baru.
Anda dapat melihat nomor versi mesin minor di Konsol atau dengan menjalankan pernyataan SHOW polardb_version;. Jika kluster Anda tidak memenuhi persyaratan versi, Anda dapat upgrade versi mesin minor.
Parameter
Parameter | Deskripsi | Kapan berlaku |
polar_max_tenants | Jumlah maksimum tenant. Nilainya harus berada dalam rentang 0 hingga 65536. Nilai default adalah 32. | Berlaku setelah restart. |
polar_resource_manager.enable_resource_manager | Menentukan apakah akan mengaktifkan proses Resource Manager untuk pembatasan memori dan pencegahan kehabisan memori (OOM). Nilai default adalah on. | Berlaku setelah restart. |
polar_resource_manager.database_name | Nama database yang menyimpan metadata tenant. Nilai default adalah | Berlaku setelah restart. |
polar_resource_manager.stat_interval | Interval pengumpulan data. Satuan: milidetik. Nilainya harus berada dalam rentang 10 hingga 10000. Nilai default adalah 500 ms. | Berlaku setelah RELOAD. |
polar_resource_manager.total_mem_request_rate | Ambang batas eviksi aktif. Nilainya harus berada dalam rentang 50% hingga 100%. Nilai default adalah 80%. | Berlaku setelah RELOAD. |
polar_resource_manager.total_mem_limit_rate | Ambang batas eviksi paksa. Nilainya harus berada dalam rentang 50% hingga 100%. Nilai default adalah 95%. | Berlaku setelah RELOAD. |
polar_resource_manager.total_mem_limit_remain_size | Ukuran memori yang dicadangkan. Nilainya harus berada dalam rentang 131072 hingga INT_MAX (nilai maksimum tipe data integer). Satuan: KB. Nilai default adalah 256000 KB. | Berlaku setelah RELOAD. |
polar_resource_manager.enable_log | Menentukan apakah akan mengaktifkan catatan log. Nilai yang valid:
| Berlaku setelah RELOAD. |
Penggunaan
Untuk menggunakan fitur multi-tenancy, Anda harus menginstal ekstensi polar_resource_manager di database yang ditentukan oleh parameter polar_resource_manager.database_name.
Jika Anda mengubah nilai polar_resource_manager.database_name, semua informasi konfigurasi multi-tenancy yang ada menjadi tidak valid.
CREATE EXTENSION polar_resource_manager;Buat konfigurasi sumber daya
Gunakan fungsi polar_create_resource_config untuk membuat konfigurasi resource.
SELECT polar_resource_manager.polar_create_resource_config('resource_config_name');Parameter resource_config_name harus mematuhi batasan nama objek basis data. Nama dapat memiliki panjang hingga 64 byte dan akan dipotong secara otomatis jika melebihi batas ini.
Hapus konfigurasi sumber daya
Gunakan fungsi polar_drop_resource_config untuk menghapus konfigurasi resource.
SELECT polar_resource_manager.polar_drop_resource_config('resource_config_name');Ubah konfigurasi sumber daya
Anda dapat menggunakan fungsi polar_alter_resource_config untuk mengubah konfigurasi resource.
SELECT polar_resource_manager.polar_alter_resource_config('resource_config_name', 'config_name', value);config_name mendukung tipe berikut:
cpu_rate_limit: Menentukan batas CPU dalam core.mem_limit: Menentukan batas memori dalam byte.
Buat penyewa
Anda dapat menggunakan fungsi polar_create_tenant untuk membuat tenant.
SELECT polar_resource_manager.polar_create_tenant('tenant_name', 'resource_config_name');Di mana:
Parameter
tenant_nameharus mematuhi Konvensi penamaan untuk objek basis data. Nama dapat memiliki panjang hingga 64 byte dan akan dipotong secara otomatis jika melebihi batas ini.Anda harus terlebih dahulu membuat konfigurasi resource untuk
resource_config_name. Jika tidak, Anda tidak dapat membuat tenant.
Hapus penyewa
Anda dapat menggunakan fungsi polar_drop_tenant untuk menghapus tenant. Menghapus tenant tidak menghapus konfigurasi resourcenya.
SELECT polar_resource_manager.polar_drop_tenant('tenant_name');Ubah penyewa
Anda dapat menggunakan fungsi polar_alter_tenant untuk mengubah tenant.
SELECT polar_resource_manager.polar_alter_tenant('tenant_name', 'config_name', 'value');Parameter config_name mendukung tipe berikut:
name: Nama tenant.resource_config: Konfigurasi resource.
Kepemilikan tenant database
Anda dapat menggunakan fungsi polar_tenant_add_database untuk menetapkan database ke tenant. Satu database hanya dapat ditetapkan ke satu tenant. Upaya menetapkan database ke tenant lain akan gagal.
SELECT polar_resource_manager.polar_tenant_add_database('tenant_name', 'database_name');Lihat database dan tenant
Anda dapat melakukan kueri terhadap Tampilan polar_tenants_dbs untuk melihat database dan tenant yang ditetapkan.
SELECT dbsname, tenantname FROM polar_resource_manager.polar_tenants_dbs;Tetapkan pengguna ke penyewa
Anda dapat menggunakan fungsi polar_tenant_add_user untuk menetapkan user ke tenant. Satu user hanya dapat ditetapkan ke satu tenant. Jika Anda mencoba menetapkan user ke tenant lain, operasi tersebut akan gagal.
SELECT polar_resource_manager.polar_tenant_add_user('tenant_name', 'user_name');Lihat user dan tenant
Gunakan Tampilan polar_tenants_users untuk memeriksa penetapan user-tenant.
SELECT username, tenantname FROM polar_resource_manager.polar_tenants_users;Tetapkan proses ke penyewa
Anda dapat menggunakan fungsi polar_tenant_add_process untuk menetapkan proses ke tenant. Satu proses hanya dapat ditetapkan ke satu tenant. Jika Anda menetapkan proses ke beberapa tenant, hanya penetapan terakhir yang berlaku.
SELECT polar_resource_manager.polar_tenant_add_process('tenant_name', pid);Lihat informasi resource tenant
Anda dapat melihat informasi resource tenant dari Tampilan polar_all_resource_configs_detail.
SELECT * FROM polar_resource_manager.polar_all_resource_configs_detail;Tampilan tersebut berisi informasi berikut:
Nama kolom | Tipe kolom | Deskripsi |
tenantname | NAME | Nama penyewa. |
resource_config_name | NAME | Nama konfigurasi resource. |
num_processes | INTEGER | Jumlah proses. |
num_idle_processes | INTEGER | Jumlah proses idle. |
num_active_processes | INTEGER | Jumlah proses aktif. |
cpu_rate_limit | DOUBLE PRESISION | Batas resource CPU untuk tenant. |
per_process_cpu_rate_limit | DOUBLE PRESISION | Batas CPU per proses. |
mem_limit | DOUBLE PRESISION | Batas memori. |
mem_usage | DOUBLE PRESISION | Penggunaan memori. |
idle_processes_mem_usage | DOUBLE PRESISION | Penggunaan memori oleh proses idle. |
active_processes_mem_usage | DOUBLE PRESISION | Penggunaan memori oleh proses aktif. |
cpu_usage_rate | DOUBLE PRESISION | Laju penggunaan CPU. |
Manajemen sumber daya CPU
Setelah Anda menetapkan proses, user, atau database ke tenant, Anda dapat mengatur batas terkait CPU dalam konfigurasi resource tenant tersebut. Saat kueri paralel dimulai, proses anak backend-nya ditetapkan ke tenant dari session yang mengeluarkan kueri tersebut. Hal ini memungkinkan proses anak backend dan proses session berbagi resource yang dibatasi oleh tenant. Saat kueri paralel selesai, proses anak backend dihapus dari tenant. Mekanisme ini menerapkan dan menghapus batas resource secara dinamis untuk kueri paralel.
Batas penggunaan CPU
Ini membatasi penggunaan CPU maksimum suatu tenant. Jika penggunaan CPU dari entitas yang ditetapkan ke tenant melebihi batas yang dikonfigurasi, kluster melakukan Pengendalian aliran terhadap proses yang bersangkutan untuk menegakkan batas tersebut.
Anda dapat mengatur cpu_rate_limit menggunakan fungsi polar_alter_resource_config. Nilai parameter bertipe float.
Nilai parameter ini menentukan batas penggunaan CPU. Misalnya, nilai 0,3 merepresentasikan batas penggunaan 30% untuk satu core CPU, dan nilai 2 merepresentasikan batas penggunaan setara dengan dua core CPU penuh. Karena parameter ini menetapkan batas atas penggunaan CPU, jumlah nilai cpu_limit di seluruh konfigurasi resource tenant dapat melebihi kapasitas CPU fisik total (T). Artinya, cpu_limit_A + cpu_limit_B + cpu_limit_C + ... >= T.
Manajemen sumber daya memori
Karena memori merupakan resource kaku (swap dinonaktifkan), memori tidak dapat dikendalikan secara dinamis seperti halnya CPU. Jika batas keras untuk memori dilampaui, proses biasanya dihentikan untuk melepaskan resource. Manajemen memori untuk tenant mirip dengan kebijakan penanganan OOM sistem operasi. Namun, ini adalah proses OOM pada level tenant, bukan pada level seluruh database.
Batas penggunaan memori
Anda dapat mengatur mem_limit menggunakan fungsi polar_alter_resource_config. Mirip dengan batas penggunaan CPU, ini membatasi penggunaan memori maksimum. Jumlah batas tersebut dapat lebih besar dari atau sama dengan total memori yang tersedia. Ini mencakup dua kebijakan berikut:
Manajemen kelebihan resource aktif: Saat total penggunaan memori melebihi ambang batas eviksi aktif (
total_mem_request_rate, default 80%), jika penggunaan memori tenant melebihi batas memori yang ditetapkan dalam konfigurasi resourcenya, sistem menghentikan session yang bersangkutan untuk melepaskan resource. Kesalahan kelebihan memori dikembalikan kepada user. Hal ini berlanjut hingga total penggunaan memori turun di bawah ambang batas eviksi aktif.Manajemen kelebihan resource paksa: Untuk mencegah penggunaan memori berlebihan di kluster yang menyebabkan kesalahan OOM, saat total penggunaan memori melebihi ambang batas eviksi paksa (
total_mem_limit_rate, default 95%), sistem melakukan traversal terhadap semua proses dan menghentikan session yang bersangkutan untuk melepaskan resource. Kesalahan kelebihan memori dikembalikan kepada user.
Saat batas memori memicu eviksi, session user dihentikan dan resource prosesnya dilepaskan. Hal ini dilakukan dengan mengirimkan sinyal SIGUSR2, dan kesalahan OOM tertentu dikembalikan kepada user. Jika proses latar belakang untuk kueri paralel melebihi batas memori, proses user yang bersangkutan dihentikan. Saat ini, hanya proses user yang dibatasi. Proses latar belakang sistem termasuk dalam system tenant dan tidak dihentikan secara aktif untuk melepaskan resource.