最大50.000の顧客を持つSAASを作成しています。各顧客のPostgresデータベースにユーザーを作成することを検討しています。サービスにログインする各ユーザーをデータベース内のユーザーにマップして、ユーザーが自分のデータにのみアクセスできることを確認します。また、トリガーを利用する this solution によって、監査証跡をデータベースに直接実装したいと考えています。各顧客に独自のデータベースユーザーがいる場合、2人の顧客が同じデータを共有する場合でも、誰が何をしたかを簡単に確認できます。
データベースに50.000人のユーザーがいるため、予期しない問題が発生しますか?パフォーマンス面または管理面。たぶん接続プーリングはもっと難しいでしょうが、私はそれが必要になるかどうか本当に知りません。
はい、大丈夫です。ただし、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人を削除することができました。
パフォーマンス:数千の同時接続はメモリを消費します。約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_name
はpg_stat_activity
に記録され、記録することもできます。それを実装する方が簡単だと思います。また、application_name
は、適用する監査トリガーにも記録されます。詳細 こちら 。
それが役に立てば幸い。