Postgres에 수천 명의 사용자가 있습니까?


9

우리는 최대 50.000 명의 고객이있는 SAAS를 만들고 있습니다. 각 고객에 대해 Postgres 데이터베이스에 사용자를 작성하는 것을 고려하고 있습니다. 서비스에 로그인 한 각 사용자를 자신의 데이터에만 액세스 할 수 있도록 데이터베이스의 사용자에게 매핑합니다. 또한 트리거를 사용 하는 이 솔루션으로 데이터베이스에 직접 감사 추적을 구현하려고 합니다. 각 고객에게 고유 한 데이터베이스 사용자가있는 경우 두 고객이 동일한 데이터를 공유하더라도 누가 누가 무엇을했는지 쉽게 알 수 있습니다.

데이터베이스에 50.000 명의 사용자가 있기 때문에 예기치 않은 문제가 발생합니까? 성능 측면 또는 관리 측면 연결 풀링이 더 어려울 수 있지만 실제로 필요한지 모르겠습니다.


2
DB 인증을 사용하는 경우 어떤 종류의 연결 풀링도 수행 할 수 없습니까? 성능의 중요한 문제는 동시 연결 수와 DB의 사용자 수가 아니라 사용중인 리소스의 양입니다.
Jack은 topanswers.xyz 시도

2
@JackDouglas 예, 연결 풀링을 사용할 수 있습니다. "commonUser"로 연결 한 다음set role actualUser
Neil McGuigan

2
@Neil은 확실하지만 DB 인증은 아닙니다. 데이터베이스 사용자 비밀번호를 사용하여 인증하는 경우 postgres에서 일종의 외부 인증을 사용해야합니다.
잭 topanswers.xyz 시도라고

2
@JackDouglas 당신 말이 맞습니다 .DB 인증과 반대로 프록시 인증입니다.
Neil McGuigan

지금까지의 답변은 많은 수의 동시 사용자를 가정하고 있습니다. 이것이 사실입니까?
Jack은 topanswers.xyz를 5

답변:


12

예, 괜찮습니다. pg는 연결 당 상당한 양의 메모리 (약 10MB AFAIK)를 사용하므로 연결 풀링을 사용해야합니다.

상자 당 500 개 이상의 동시 연결이 문제가 될 수 있습니다 (정확하게 동시에 데이터베이스를 쿼리하는 것과 같이). CPU / 코어가 많을수록 좋습니다. RAID 10과 함께 SSD를 사용하십시오.

SaaS 애플리케이션은 한 명의 사용자로 연결 한 다음 set role실제 사용자에게 연결해야합니다 . 연결 문자열은 동일하지만 다른 사용자를 사용하므로 연결 풀링을 사용할 수 있습니다. reset role풀에 연결을 반환 할 때 해야 합니다.

이것은 실제로 데이터베이스 인증이 아닙니다. 프록시 인증입니다 (일명 가장).

회사 또는 역할별로 별도의 풀을 고려할 수도 있습니다.

관리자를보다 쉽게하기 위해 사용자를 그룹에 넣고 그룹을 통해 권한을 설정할 수 있습니다. 이것을 RBAC라고합니다.

업데이트 : 2.4 초 만에 50,000 명의 사용자를 만들 수있었습니다. 사용자 수로 인해 PGAdmin이 현저하게 느려집니다. 그러나 JDBC를 통한 연결은 이전과 같이 빠릅니다. 한 번에 50,000 명의 사용자를 삭제할 수 없었지만 한 번에 약 10,000 명을 처리 할 수있었습니다.


연구 해 주셔서 대단히 감사합니다. PGAdmin에서 전혀 작업 할 수 있었습니까? 성능에 큰 문제가 있었습니까?
David

@David PGAdmin은 괜찮 았습니다. psql은 괜찮을 것입니다. 작업 속도를 높이기 위해 PGAdmin을 조정할 수 있습니다.
Neil McGuigan

2

성능 : 수천 개의 동시 연결이 메모리를 소모합니다. 약 1,000 개의 동시 연결이 연결 풀링을 사용하는 것이 좋습니다. pgbouncer는 skype에서 개발 한 좋은 것입니다.

관리 : 50,000 명의 사용자를 관리하는 것은 큰 직업 IMO가 될 것입니다. 다른를 사용하여 동일한 데이터 액세스 권한을 가진 costumer를 차별화 application_name하여 각 costumer가 동일한 사용자 이름을 사용하여 데이터베이스에 연결 하는 방법은 무엇입니까 ?

예 :

다른 사용자 이름을 사용하여 각 클라이언트의 연결 문자열은 다음과 같습니다 --user user1, --user user2

그러나 다른을 사용 application_name하면 각 클라이언트의 연결 문자열은 다음 --user user1 --application_name costumer1과 같습니다 . --user user1 --aplication_name costumer2, 등

application_name에 기록 pg_stat_activity하고도 기록 할 수있다. 구현하기가 더 쉽다고 생각합니다. 또한 application_name적용하려는 감사 트리거에 기록됩니다. 자세한 내용은 여기를 참조 하십시오 .

도움이 되길 바랍니다.


4
50,000 명의 db 사용자를 관리하는 것이 50,000 명의 앱 사용자보다 어려우십니까?
Neil McGuigan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.