web-dev-qa-db-ja.com

Postgresに何千人ものユーザーを抱えることは可能ですか?

最大50.000の顧客を持つSAASを作成しています。各顧客のPostgresデータベースにユーザーを作成することを検討しています。サービスにログインする各ユーザーをデータベース内のユーザーにマップして、ユーザーが自分のデータにのみアクセスできることを確認します。また、トリガーを利用する this solution によって、監査証跡をデータベースに直接実装したいと考えています。各顧客に独自のデータベースユーザーがいる場合、2人の顧客が同じデータを共有する場合でも、誰が何をしたかを簡単に確認できます。

データベースに50.000人のユーザーがいるため、予期しない問題が発生しますか?パフォーマンス面または管理面。たぶん接続プーリングはもっと難しいでしょうが、私はそれが必要になるかどうか本当に知りません。

9
David

はい、大丈夫です。ただし、pgは接続ごとにかなりの量のメモリを使用するため(約10MBのAFAIK)、接続プールを使用する必要があります。

ただし、ボックスごとに500を超える同時接続は問題になります(正確に同時にデータベースにクエリを実行するなど)。 CPU /コアが多いほど良いです。 RAID 10でSSDを使用します。

SaaSアプリケーションは1人のユーザーとして接続する必要があり、次にset roleを実際のユーザーに。接続文字列は同じですが、異なるユーザーを使用するため、これにより接続プーリングを使用できます。あなたがすべき reset role接続をプールに戻す場合。

これは実際にはデータベース認証ではありません。プロキシ認証(別名偽装)です。

また、会社ごとまたは役割ごとに個別のプールを検討することもできます。

管理を簡単にするために、ユーザーをグループに入れ、グループを介して権限を設定できます。これはRBACと呼ばれます。

更新:2.4秒で50,000人のユーザーを作成できました。ユーザー数が原因で、PGAdminは著しく遅くなります。ただし、JDBC経由の接続は以前と同じくらい高速です。一度に50,000人のユーザーを削除することはできませんでしたが、一度に約10,000人を削除することができました。

12
Neil McGuigan

パフォーマンス:数千の同時接続はメモリを消費します。約1,000の同時接続を超える値は、接続プールを使用することをお勧めします。pgbouncerはskypeによって開発された優れたものです。

管理:50,000人のユーザーを管理することは、IMOの大きな仕事になります。異なるapplication_nameを使用して、同じデータアクセスを持つ貸衣装を区別し、各貸衣装が同じユーザー名を使用してデータベースに接続するようにします。

例:

異なるユーザー名を使用すると、各クライアントの接続文字列は--user user1--user user2などになります。

ただし、異なるapplication_nameを使用すると、各クライアントの接続文字列は--user user1 --application_name costumer1--user user1 --aplication_name costumer2などになります。

application_namepg_stat_activityに記録され、記録することもできます。それを実装する方が簡単だと思います。また、application_nameは、適用する監査トリガーにも記録されます。詳細 こちら

それが役に立てば幸い。

2
Soni Harriz