Tema ini menjelaskan fitur multi-tenancy dari PolarDB for PostgreSQL.
Istilah
Penyewa: Dalam multi-tenancy, penyewa adalah entitas logis yang mewakili unit alokasi data dan sumber daya. Penyewa berada di tingkat yang lebih tinggi daripada kluster dan di tingkat yang lebih rendah daripada pengguna atau basis data. Beberapa akun atau basis data dapat sesuai dengan satu penyewa. Penyewa dibagi menjadi dua kategori:
Penyewa sistem adalah entitas administratif khusus. Secara umum, hanya satu penyewa sistem yang dibuat. Penyewa sistem dapat menggunakan sumber daya dari penyewa biasa. Ketika pengguna dari penyewa sistem terhubung ke basis data dan memiliki izin untuk mengakses kluster, pengguna tersebut dapat mengakses kluster semua penyewa.
Penyewa biasa: Sumber daya mereka sepenuhnya terisolasi dari sumber daya penyewa lainnya. Penyewa biasa harus dibuat oleh penyewa sistem.
Konfigurasi Sumber Daya: Anda dapat mengalokasikan sumber daya seperti CPU dan memori untuk setiap penyewa. Akun istimewa dapat menetapkan batasan sumber daya bagi setiap penyewa sesuai dengan kebutuhan bisnis.
Fitur konfigurasi sumber daya penyewa dirancang untuk membatasi jumlah sumber daya yang digunakan oleh satu atau beberapa proses. Di PolarDB for PostgreSQL, satu sesi setara dengan satu proses. Dalam satu sesi, hanya satu pengguna yang dapat masuk ke satu basis data. Proses, pengguna, dan basis data merupakan elemen dasar dari penyewa. Setiap proses, pengguna, dan basis data dapat dipetakan ke penyewa tertentu. Sebuah proses hanya dapat dimiliki oleh satu penyewa, sehingga mencegah statistik ganda dalam penggunaan sumber daya. Proses anak dari kueri paralel termasuk dalam penyewa yang memulai kueri tersebut. Dengan demikian, sumber daya dapat dibatasi dalam tiga dimensi berdasarkan atribut proses:
Proses: Proses koneksi (proses sesi) yang dimulai oleh pengguna. Proses-proses ini mencakup proses kueri paralel, tetapi tidak mencakup proses pembantu sistem.
Pengguna: Semua proses koneksi (proses sesi) yang dimulai oleh pengguna. Mereka mencakup proses kueri paralel, tetapi tidak mencakup proses pembantu sistem.
Basis Data: Semua proses koneksi (proses sesi) ke satu basis data yang dimulai oleh pengguna. Mereka mencakup proses kueri paralel, tetapi tidak mencakup proses pembantu sistem.
Secara default, tidak ada batasan sumber daya yang diberlakukan pada proses sistem karena fungsionalitas khususnya.
Prasyarat
Kluster PolarDB for PostgreSQL Anda menjalankan mesin berikut:
PostgreSQL 14 (versi revisi 14.12.24.0 atau lebih baru)
Anda dapat menjalankan pernyataan berikut untuk menanyakan versi minor kluster PolarDB for PostgreSQL:
SELECT version();Parameter
Parameter | Deskripsi | Mode aplikasi |
polar_max_tenants | Jumlah maksimum penyewa. Nilai valid: 0 hingga 65536. Nilai default: 32. | Pengaturan ini berlaku setelah kluster di-restart. |
polar_resource_manager.enable_resource_manager | Menentukan apakah akan mengaktifkan proses manajer sumber daya untuk batas memori dan pencegahan OOM. Nilai default: on. | Pengaturan ini berlaku setelah kluster di-restart. |
polar_resource_manager.database_name | Nama basis data yang menyimpan metadata penyewa. Nilai default: | Pengaturan ini berlaku setelah kluster di-restart. |
polar_resource_manager.stat_interval | Interval pengumpulan data. Unit: ms. Nilai valid: 10 hingga 10000. Nilai default: 500 ms. | Pengaturan ini berlaku setelah operasi reload dilakukan. |
polar_resource_manager.total_mem_request_rate | Ambang batas untuk eviksi aktif. Nilai valid: 50% hingga 100%. Nilai default: 80%. | Pengaturan ini berlaku setelah operasi reload dilakukan. |
polar_resource_manager.total_mem_limit_rate | Ambang batas untuk pemaksaan eviksi. Nilai valid: 50% hingga 100%. Nilai default: 95%. | Pengaturan ini berlaku setelah operasi reload dilakukan. |
polar_resource_manager.total_mem_limit_remain_size | Ukuran memori cadangan. Nilai valid: 131072 hingga INT_MAX (nilai maksimum tipe data integer). Unit: KB. Nilai default: 256000. | Pengaturan ini berlaku setelah operasi reload dilakukan. |
polar_resource_manager.enable_log | Menentukan apakah akan mengaktifkan log. Nilai valid:
| Pengaturan ini berlaku setelah operasi reload dilakukan. |
Penggunaan
Untuk menggunakan multi-tenancy, Anda harus membuat ekstensi polar_resource_manager di basis data tempat Anda menentukan parameter polar_resource_manager.database_name.
Jika Anda mengubah nama polar_resource_manager.database_name basis data yang menyimpan metadata penyewa, pengaturan multi-tenancy yang ada menjadi tidak valid.
CREATE EXTENSION polar_resource_manager;Buat konfigurasi sumber daya
Anda dapat membuat konfigurasi sumber daya dengan menggunakan fungsi polar_create_resource_config.
SELECT polar_resource_manager.polar_create_resource_config('resource_config_name');Parameter resource_config_name harus memenuhi persyaratan untuk nama basis data: Panjangnya bisa hingga 64 karakter. Jika tidak, mereka secara otomatis dipotong.
Hapus konfigurasi sumber daya
Anda dapat membuat konfigurasi sumber daya menggunakan fungsi polar_drop_resource_config.
SELECT polar_resource_manager.polar_drop_resource_config('resource_config_name');Ubah konfigurasi sumber daya
Anda dapat mengubah konfigurasi sumber daya dengan menggunakan fungsi polar_alter_resource_config.
SELECT polar_resource_manager.polar_alter_resource_config('resource_config_name', 'config_name', value);Nilai valid untuk parameter config_name:
cpu_rate_limit: Batas CPU, dalam satuan inti CPU.mem_limit: Batas memori, dalam byte.
Buat penyewa
Anda dapat membuat penyewa dengan menggunakan fungsi polar_create_tenant.
SELECT polar_resource_manager.polar_create_tenant('tenant_name', 'resource_config_name');
Parameter
tenant_nameharus memenuhi persyaratan untuk nama basis data: Panjangnya bisa hingga 64 karakter. Jika tidak, mereka secara otomatis dipotong.Nilai
resource_config_nameharus merupakan konfigurasi sumber daya yang ada. Jika tidak, penyewa tidak dapat dibuat.
Hapus penyewa
Anda dapat membuat tenant menggunakan fungsi polar_drop_tenant. Setelah tenant dihapus, konfigurasi sumber dayanya tetap ada.
SELECT polar_resource_manager.polar_drop_tenant('tenant_name');Ubah penyewa
Anda dapat membuat tenant menggunakan fungsi polar_alter_tenant.
SELECT polar_resource_manager.polar_alter_tenant('tenant_name', 'config_name', 'value');Nilai valid untuk parameter config_name:
name: Nama penyewa.resource_config: Konfigurasi sumber daya.
Tetapkan basis data ke penyewa
Anda dapat menetapkan basis data ke penyewa dengan menggunakan fungsi polar_tenant_add_database. Basis data hanya dapat ditetapkan ke satu penyewa. Anda tidak dapat menetapkan basis data ke beberapa penyewa.
SELECT polar_resource_manager.polar_tenant_add_database('tenant_name', 'database_name');Lihat basis data dan penyewanya
Anda dapat melihat basis data dan penyewanya dengan menggunakan fungsi polar_tenants_dbs.
SELECT dbsname, tenantname FROM polar_resource_manager.polar_tenants_dbs;Tetapkan pengguna ke penyewa
Anda dapat menetapkan pengguna ke penyewa dengan menggunakan fungsi polar_tenant_add_user. Pengguna hanya dapat ditetapkan ke satu penyewa. Anda tidak dapat menetapkan pengguna ke beberapa penyewa.
SELECT polar_resource_manager.polar_tenant_add_user('tenant_name', 'user_name');Lihat pengguna dan penyewanya
Anda dapat melihat pengguna dan penyewanya dengan menggunakan fungsi polar_tenants_users.
SELECT username, tenantname FROM polar_resource_manager.polar_tenants_users;Tetapkan proses ke penyewa
Anda dapat menetapkan proses ke penyewa dengan menggunakan fungsi polar_tenant_add_process. Proses hanya dapat ditetapkan ke satu penyewa. Jika Anda menetapkan proses ke beberapa penyewa, hanya penetapan terakhir yang valid.
SELECT polar_resource_manager.polar_tenant_add_process('tenant_name', pid);Lihat sumber daya penyewa
Anda dapat melihat sumber daya penyewa dengan menggunakan tampilan polar_all_resource_configs_detail.
SELECT * FROM polar_resource_manager.polar_all_resource_configs_detail;Tabel berikut menjelaskan kolom dari tampilan.
Nama kolom | Tipe kolom | Deskripsi |
tenantname | NAME | Nama penyewa. |
resource_config_name | NAME | Nama konfigurasi sumber daya. |
num_processes | INTEGER | Jumlah proses. |
num_idle_processes | INTEGER | Jumlah proses idle. |
num_active_processes | INTEGER | Jumlah proses aktif. |
cpu_rate_limit | DOUBLE PRESISION | Sumber daya CPU maksimum penyewa. |
per_process_cpu_rate_limit | DOUBLE PRESISION | Sumber daya CPU maksimum proses. |
mem_limit | DOUBLE PRESISION | Sumber daya memori maksimum. |
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 | Pemanfaatan CPU (%). |
Manajemen sumber daya CPU
Setelah Anda menambahkan proses, pengguna, dan basis data ke penyewa, Anda dapat menetapkan batas CPU dalam konfigurasi sumber daya. Jika proses anak latar belakang dapat dialokasikan, mereka ditetapkan ke penyewa yang memulai kueri paralel, sehingga proses anak latar belakang dan proses sesi keduanya tunduk pada batas sumber daya penyewa. Ketika kueri paralel selesai, proses anak latar belakang dihapus dari penyewa. Mekanisme ini secara dinamis memberlakukan dan menghapus batas sumber daya pada penyewa.
Batas penggunaan CPU
Anda dapat menetapkan batas penggunaan CPU maksimum untuk penyewa. Jika batas tersebut terlampaui, kluster akan menurunkan konsumsi CPU agar tetap berada dalam batas yang ditentukan.
Anda dapat menetapkan nilai cpu_rate_limit (bertipe data float) menggunakan fungsi polar_resource_manager.polar_alter_resource_config.
Nilai parameter menunjukkan penggunaan CPU selama periode waktu tertentu. Misalnya, 0.3 menunjukkan penggunaan 30% dari satu core dan 2 menunjukkan penggunaan penuh dari 2 core. Karena Anda menentukan nilai penggunaan CPU maksimum di sini, jumlah nilai cpu_limit dapat lebih besar dari nilai spesifikasi kluster T: cpu_limit_A + cpu_limit_B + cpu_limit_C + ... >= T.
Manajemen sumber daya memori
Memori merupakan sumber daya kaku yang tidak dapat dibatasi secara dinamis seperti CPU. Jika batas penggunaan memori terlampaui, sistem akan menghentikan proses untuk melepaskan sumber daya memori. Mekanisme ini serupa dengan cara sistem operasi menangani masalah OOM, tetapi batasan ini diterapkan pada tingkat penyewa, bukan seluruh basis data.
Batas penggunaan memori
Anda dapat menetapkan nilai mem_limit (bertipe data float) menggunakan fungsi polar_resource_manager.polar_alter_resource_config. Karena nilai ini menentukan penggunaan memori maksimum, jumlah nilai mem_limit dapat melebihi spesifikasi kluster. Dua kebijakan berikut dapat diterapkan:
Manajemen Ambang Batas Aktif: Ketika ambang batas eviksi aktif (
total_mem_request_rate, default 80%) terlampaui dan penggunaan memori penyewa melebihi batas yang ditentukan, sesi akan dihentikan untuk melepaskan sumber daya memori. Kesalahan kelebihan memori akan dikembalikan. Sistem akan terus menerapkan mekanisme ini hingga penggunaan memori berada di bawah ambang batas eviksi aktif.Manajemen Ambang Batas Paksa: Jika ambang batas eviksi paksa (
total_mem_limit_rate, default 95%) terlampaui, sistem akan menjelajahi semua proses, melepaskan sumber daya sesi, dan mengembalikan kesalahan kelebihan memori. Ini bertujuan untuk mencegah kesalahan OOM di kluster.
Selama eviksi, sesi pengguna dihentikan dan sumber daya yang digunakan oleh proses dilepaskan. Sistem menghentikan sesi dengan mengirimkan sinyal SIGUSR2 ke proses sesi serta mengembalikan kesalahan OOM tertentu. Jika penggunaan memori proses latar belakang dari kueri paralel melebihi batas memori, proses pengguna yang terkait akan dihentikan. Saat ini, hanya proses pengguna yang dapat dihentikan. Proses latar belakang sistem milik penyewa sistem (Pro) dan tidak dapat dihentikan untuk melepaskan sumber daya memori.