Layak untuk memiliki ribuan pengguna di Postgres?

9

Kami menciptakan SAAS di mana kami paling banyak memiliki 50.000 pelanggan. Kami sedang mempertimbangkan untuk membuat pengguna di database Postgres untuk setiap pelanggan. Kami akan memetakan setiap pengguna yang masuk ke layanan kami ke pengguna di basis data agar sangat yakin bahwa mereka hanya memiliki akses ke data mereka sendiri. Kami juga ingin menerapkan jejak audit langsung dalam database dengan solusi ini , yang memanfaatkan pemicu. Jika setiap pelanggan memiliki pengguna basis data sendiri, maka akan sangat mudah untuk melihat siapa yang melakukan apa, bahkan jika dua pelanggan akan berbagi data yang sama.

Apakah kami akan mengalami beberapa masalah yang tidak terduga karena kami memiliki 50.000 pengguna di basis data kami? Kinerja-bijaksana atau administrasi-bijaksana. Mungkin koneksi pooling akan lebih sulit, tetapi saya tidak benar-benar tahu apakah kita akan membutuhkannya.

David
sumber
2
Anda tidak akan dapat melakukan pooling koneksi apa pun jika Anda menggunakan auth DB? Untuk kinerja, masalah penting adalah jumlah koneksi bersamaan dan berapa banyak sumber daya yang mereka gunakan daripada jumlah pengguna dalam DB.
Jack bilang coba topanswers.xyz
2
@ JackDouglas Ya, Anda dapat menggunakan pooling koneksi. Hubungkan sebagai "pengguna umum"set role actualUser
Neil McGuigan
2
@Neil yakin, tapi itu bukan auth DB. Jika Anda mengautentikasi menggunakan kata sandi pengguna basis data Anda harus menggunakan semacam auth eksternal di postgres.
Jack bilang coba topanswers.xyz
2
@ JackDouglas Anda benar, ini adalah proxy auth dan bukan db auth.
Neil McGuigan
Jawabannya sejauh ini mengasumsikan jumlah pengguna bersamaan yang tinggi, apakah ini yang akan terjadi?
Jack bilang coba topanswers.xyz

Jawaban:

12

Ya, itu seharusnya baik-baik saja. Anda harus menggunakan pooling koneksi, karena pg menggunakan jumlah memori yang cukup per koneksi (sekitar 10MB AFAIK).

Lebih dari 500 koneksi simultan per kotak akan menjadi masalah (seperti secara aktif menanyakan database pada saat yang bersamaan). Lebih banyak cpus / core lebih baik. Gunakan SSD dengan RAID 10.

Aplikasi SaaS Anda harus terhubung sebagai satu pengguna, kemudian set roleke pengguna sebenarnya. Ini memungkinkan Anda untuk menggunakan pooling koneksi, karena string koneksi akan sama, tetapi menggunakan pengguna yang berbeda. Anda harus reset roleketika mengembalikan koneksi ke kolam renang.

Ini sebenarnya bukan otentikasi basis data. Ini otentikasi proksi (alias Peniruan).

Anda juga dapat mempertimbangkan kumpulan terpisah per perusahaan atau per peran.

Untuk membuat admin lebih mudah, Anda dapat menempatkan pengguna ke dalam grup dan mengatur izin melalui grup. Ini disebut RBAC.

Pembaruan: Saya dapat membuat 50.000 pengguna dalam 2,4 detik. PGAdmin terasa lebih lambat, karena jumlah pengguna. Namun menghubungkan melalui JDBC secepat sebelumnya. Saya tidak dapat menurunkan 50.000 pengguna sekaligus, tetapi dapat melakukan sekitar 10.000 pengguna sekaligus.

Neil McGuigan
sumber
Terima kasih banyak atas risetnya. Apakah mungkin bekerja di PGAdmin sama sekali? Apakah itu masalah besar dengan kinerja di sana?
David
@ David PGAdmin baik-baik saja, hanya lambat. psql harus baik-baik saja. Mungkin dapat mengubah PGAdmin untuk mempercepat.
Neil McGuigan
2

Kinerja: ribuan koneksi konkuren akan memakan memori Anda, kira-kira nilai di atas 1.000 koneksi konkuren disarankan untuk menggunakan pooling koneksi, pgbouncer adalah koneksi yang bagus, dikembangkan oleh skype.

Mengelola: Mengelola 50.000 pengguna akan menjadi pekerjaan berat IMO. Bagaimana membedakan pelanggan dengan akses data yang sama menggunakan berbeda application_name, sehingga setiap pelanggan akan terhubung ke database menggunakan nama pengguna yang sama.

Contoh:

menggunakan nama pengguna yang berbeda, koneksi string setiap klien akan: --user user1, --user user2, dll

Tetapi menggunakan yang berbeda application_name, koneksi string setiap klien akan: --user user1 --application_name costumer1, --user user1 --aplication_name costumer2, dll

Itu application_namedirekam pg_stat_activitydan juga bisa dicatat. Saya pikir itu akan lebih mudah diimplementasikan. Dan application_namejuga log dalam pemicu audit yang ingin Anda terapkan. Lebih detail di sini .

Semoga ini bisa membantu.

Soni Harriz
sumber
4
Bagaimana mengelola 50.000 db pengguna lebih sulit dari 50.000 pengguna aplikasi?
Neil McGuigan