

# 풀링으로 Aurora PostgreSQL 연결 이탈 관리
<a name="AuroraPostgreSQL.BestPractices.connection_pooling"></a>

클라이언트 애플리케이션이 너무 자주 연결 및 연결 해제되어 Aurora PostgreSQL DB 클러스터 응답 시간이 느려지면 클러스터에 *연결 이탈*이 발생한다고 합니다. Aurora PostgreSQL DB 클러스터 엔드포인트에 대한 각각의 새로운 연결은 리소스를 소비하므로 실제 워크로드를 처리하는 데 사용할 수 있는 리소스가 줄어듭니다. 연결 이탈은 다음에 설명하는 모범 사례 중 일부를 따라 관리하는 것이 좋습니다.

우선 연결 이탈률이 높은 Aurora PostgreSQL DB 클러스터에서 응답 시간을 개선할 수 있습니다. 이렇게 하려면 RDS 프록시와 같은 연결 풀을 사용할 수 있습니다. *연결 풀러*는 클라이언트에 사용할 수 있는 연결 캐시를 제공합니다. Aurora PostgreSQL에서는 거의 모든 버전이 RDS 프록시를 지원합니다. 자세한 내용은 [Aurora PostgreSQL과 Amazon RDS 프록시](Concepts.Aurora_Fea_Regions_DB-eng.Feature.RDS_Proxy.md#Concepts.Aurora_Fea_Regions_DB-eng.Feature.RDS_Proxy.apg) 섹션을 참조하세요.

특정 버전의 Aurora PostgreSQL에서 RDS 프록시를 지원하지 않는 경우 PGBouncer와 같은 다른 PostgreSQL 호환 연결 풀러를 사용할 수 있습니다. 자세히 알아보려면 [PgBouncer](https://www.pgbouncer.org/) 웹 사이트를 참조하세요.

Aurora PostgreSQL DB 클러스터가 연결 풀링의 이점을 누릴 수 있는지 알아보려면 `postgresql.log` 파일에서 연결 및 연결 해제를 확인하면 됩니다. 또한 성능 개선 도우미를 사용하여 Aurora PostgreSQL DB 클러스터에서 발생하는 연결 이탈의 정도를 확인할 수 있습니다. 아래에서 두 주제에 대한 정보를 확인할 수 있습니다.

## 로깅 연결 및 연결 해제
<a name="AuroraPostgreSQL.BestPractices.connection_pooling.log_connections"></a>

PostgreSQL `log_connections` 및 `log_disconnections` 파라미터는 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 대한 연결 및 연결 해제를 캡처할 수 있습니다. 기본적으로 이 파라미터는 해제되어 있습니다. 이러한 파라미터를 설정하려면 사용자 지정 파라미터 그룹을 사용하고 값을 1로 변경하여 설정합니다. 사용자 지정 파라미터 그룹에 대한 자세한 내용은 [Amazon Aurora DB 클러스터의 DB 클러스터 파라미터 그룹](USER_WorkingWithDBClusterParamGroups.md) 단원을 참조하세요. 설정을 확인하려면 psql을 사용하여 Aurora PostgreSQL용 DB 클러스터 엔드포인트에 연결하고 다음과 같이 쿼리합니다.

```
labdb=> SELECT setting FROM pg_settings
  WHERE name = 'log_connections';
 setting
---------
on
(1 row)
labdb=> SELECT setting FROM pg_settings
  WHERE name = 'log_disconnections';
setting
---------
on
(1 row)
```

이 두 파라미터가 모두 설정되어 있으면 로그가 모든 새 연결 및 연결 해제를 캡처합니다. 인증된 각 연결의 사용자 및 데이터베이스를 볼 수 있습니다. 연결이 끊기면 다음 예와 같이 세션 기간도 기록됩니다.

```
2022-03-07 21:44:53.978 UTC [16641] LOG: connection authorized: user=labtek database=labdb application_name=psql
2022-03-07 21:44:55.718 UTC [16641] LOG: disconnection: session time: 0:00:01.740 user=labtek database=labdb host=[local]
```

애플리케이션의 연결 이탈을 확인하기 위해 해당 파라미터가 아직 설정되어 있지 않다면 설정하세요. 그런 다음 실제 워크로드 및 기간으로 애플리케이션을 실행하여 분석을 위해 PostgreSQL 로그에 데이터를 수집합니다. RDS 콘솔에서 로그 파일을 볼 수 있습니다. Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 선택한 다음 **Logs & events**(로그 및 이벤트) 탭을 선택합니다. 자세한 내용은 [데이터베이스 로그 파일 보기 및 나열](USER_LogAccess.Procedural.Viewing.md) 섹션을 참조하세요.

또는 콘솔에서 로그 파일을 다운로드하고 다음 명령 순서를 사용할 수 있습니다. 이 시퀀스는 분당 인증되거나 삭제된 총 연결 수를 찾습니다.

```
grep "connection authorized\|disconnection: session time:" postgresql.log.2022-03-21-16|\
awk {'print $1,$2}' |\
sort |\
uniq -c |\
sort -n -k1
```

예제 출력에서는 인증된 연결이 급증한 후 16:12:10 부터 연결이 끊기는 것을 볼 수 있습니다.

```
.....
,......
.........
5 2022-03-21 16:11:55 connection authorized:
9 2022-03-21 16:11:55 disconnection: session
5 2022-03-21 16:11:56 connection authorized:
5 2022-03-21 16:11:57 connection authorized:
5 2022-03-21 16:11:57 disconnection: session
32 2022-03-21 16:12:10 connection authorized:
30 2022-03-21 16:12:10 disconnection: session
31 2022-03-21 16:12:11 connection authorized:
27 2022-03-21 16:12:11 disconnection: session
27 2022-03-21 16:12:12 connection authorized:
27 2022-03-21 16:12:12 disconnection: session
41 2022-03-21 16:12:13 connection authorized:
47 2022-03-21 16:12:13 disconnection: session
46 2022-03-21 16:12:14 connection authorized:
41 2022-03-21 16:12:14 disconnection: session
24 2022-03-21 16:12:15 connection authorized:
29 2022-03-21 16:12:15 disconnection: session
28 2022-03-21 16:12:16 connection authorized:
24 2022-03-21 16:12:16 disconnection: session
40 2022-03-21 16:12:17 connection authorized:
42 2022-03-21 16:12:17 disconnection: session
40 2022-03-21 16:12:18 connection authorized:
40 2022-03-21 16:12:18 disconnection: session
.....
,......
.........
1 2022-03-21 16:14:10 connection authorized:
1 2022-03-21 16:14:10 disconnection: session
1 2022-03-21 16:15:00 connection authorized:
1 2022-03-21 16:16:00 connection authorized:
```

이 정보를 바탕으로 워크로드가 연결 풀러의 이점을 누릴 수 있는지 여부를 결정할 수 있습니다. 자세한 분석을 위해 성능 개선 도우미를 사용할 수 있습니다.

## 성능 개선 도우미로 연결 이탈 감지
<a name="AuroraPostgreSQL.BestPractices.connection_pooling.detect-churn"></a>

성능 개선 도우미를 사용하여 Aurora PostgreSQL 호환 에디션 DB 클러스터의 연결 변동 정도를 평가할 수 있습니다. Aurora PostgreSQL DB 클러스터를 생성하면 성능 개선 도우미에 대한 설정이 기본적으로 켜져 있습니다. DB 클러스터를 생성할 때 이 선택을 취소했다면 클러스터를 수정하여 기능을 켜세요. 자세한 내용은 [Amazon Aurora DB 클러스터 수정](Aurora.Modifying.md) 섹션을 참조하세요.

Aurora PostgreSQL DB 클러스터에서 성능 개선 도우미를 실행하면 모니터링할 지표를 선택할 수 있습니다. 콘솔의 탐색 창에서 성능 개선 도우미에 액세스할 수 있습니다. 다음 이미지와 같이 Aurora PostgreSQL DB 클러스터에 대한 라이터 인스턴스의 **Monitoring**(모니터링) 탭에서 성능 개선 도우미에 액세스할 수도 있습니다.

![RDS 콘솔 및 선택한 Aurora PostgreSQL DB 클러스터 내에서 성능 개선 도우미 인사이트에 액세스하는 이미지.](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_pooling_PI_1.png)


성능 개선 도우미 콘솔에서 **Manage metrics**(지표 관리)를 선택합니다. Aurora PostgreSQL DB 클러스터의 연결 및 연결 해제 활동을 분석하려면 다음 지표를 선택하세요. 다음은 모두 PostgreSQL의 지표입니다.
+ `xact_commit` - 커밋된 트랜잭션의 수입니다.
+ `total_auth_attempts` - 분당 인증된 사용자 연결 시도 횟수입니다.
+ `numbackends` - 현재 데이터베이스에 연결된 백엔드 수입니다.

![RDS 콘솔 및 선택한 Aurora PostgreSQL DB 클러스터 내에서 성능 개선 도우미 인사이트에 액세스하는 이미지.](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_churn_PI_4.png)


설정을 저장하고 연결 활동을 표시하려 면**그래프 업데이트**를 선택합니다.

다음 이미지에서 100명의 사용자와 함께 pgbench를 실행할 때의 영향을 확인할 수 있습니다. 연결을 나타내는 선은 일정한 상향 경사면에 있습니다. pgbench 및 사용 방법에 대한 자세한 내용은 PostgreSQL 설명서의 [pgbench](https://www.postgresql.org/docs/current/pgbench.html)를 참조하세요.

![연결 풀링의 필요성을 보여주는 성능 개선 도우미 이미지.](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_pooling_PI_2.png)


이 이미지는 연결 풀러 없이 100명 정도의 사용자로 워크로드를 실행하면 워크로드 처리 기간 동안 `total_auth_attempts` 수가 크게 증가할 수 있음을 보여줍니다. `total_auth_attempts`가 가능한 한 0에 가깝게 유지되도록 하는 것이 좋습니다.

RDS 프록시 연결 풀링을 사용하면 워크로드가 시작될 때 연결 시도 횟수가 늘어납니다. 연결 풀을 설정한 후에는 평균이 감소합니다. 트랜잭션과 백엔드 사용에 사용되는 리소스는 워크로드 처리 전반에 걸쳐 일관되게 유지됩니다.

![연결 풀링을 위한 RDS 프록시의 이점을 보여주는 성능 개선 도우미 이미지.](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/images/postgres_connection_pooling_PI_3.png)


Aurora PostgreSQL DB 클러스터에서 성능 개선 도우미를 사용하는 방법에 대한 자세한 내용은 [성능 개선 도우미를 통한 Amazon Aurora 모니터링](USER_PerfInsights.md) 단원을 참조하세요. 지표를 분석하려면 [성능 개선 도우미 대시보드를 사용한 지표 분석](USER_PerfInsights.UsingDashboard.md) 단원을 참조하세요.

## 연결 풀링의 이점 시연
<a name="AuroraPostgreSQL.BestPractices.connection_pooling.demo-benefit-pooling"></a>

앞서 설명한 것처럼 Aurora PostgreSQL DB 클러스터에 연결 이탈 문제가 있다고 판단되면 RDS 프록시를 사용하여 성능을 개선할 수 있습니다. 다음에서는 연결이 풀링된 경우와 연결되지 않은 경우의 워크로드 처리 차이점을 보여주는 예를 확인할 수 있습니다. 이 예에서는 pgbench를 사용하여 트랜잭션 워크로드를 모델링합니다.

psql과 마찬가지로 pgbench는 로컬 클라이언트 컴퓨터에서 설치하고 실행할 수 있는 PostgreSQL 클라이언트 애플리케이션입니다. Aurora PostgreSQL DB 클러스터를 관리하는 데 사용하는 Amazon EC2 인스턴스에서 설치하고 실행할 수도 있습니다. 자세한 내용은 PostgreSQL 설명서의 [pgbench](https://www.postgresql.org/docs/current/pgbench.html)를 참조하세요.

이 예를 단계별로 진행하려면 먼저 데이터베이스에 pgbench 환경을 만들어야 합니다. 다음 명령은 지정된 데이터베이스에서 pgbench 테이블을 초기화하기 위한 기본 템플릿입니다. 이 예에서는 로그인에 기본 주 사용자 계정인 `postgres`를 사용합니다. Aurora PostgreSQL DB 클러스터에서 필요에 따라 변경합니다. 클러스터의 라이터 인스턴스에 있는 데이터베이스에 pgbench 환경을 생성합니다.

**참고**  
pgbench 초기화 프로세스는 `pgbench_accounts`,`pgbench_branches`,`pgbench_history`, 및 `pgbench_tellers`라는 테이블을 삭제하고 다시 만듭니다. pgbench를 초기화할 때 `{{dbname}}`에 대해 선택한 데이터베이스가 이러한 이름을 사용하지 않는지 확인합니다.

```
pgbench -U postgres -h {{db-cluster-instance-1.111122223333}}.{{aws-region}}.rds.amazonaws.com -p 5432 -d -i -s 50 {{dbname}}
```

pgbench의 경우 다음 파라미터를 지정합니다.

**-d**  
pgbench 실행 시 디버깅 보고서를 출력합니다.

**-h**  
Aurora PostgreSQL DB 클러스터의 라이터 인스턴스의 엔드포인트를 지정합니다.

**-i**  
벤치마크 테스트를 위해 데이터베이스에서 pgbench 환경을 초기화합니다.

**-p**  
데이터베이스 연결에 사용되는 포트를 식별합니다. Aurora PostgreSQL 기본값은 일반적으로 5432 또는 5433입니다.

**-s**  
테이블을 행으로 채우는 데 사용할 배율 인수를 지정합니다. 기본 배율 인수는 1이며, `pgbench_branches` 테이블에 1개 행, `pgbench_tellers` 테이블에 10개 행, `pgbench_accounts` 테이블에 100000개 행을 생성합니다.

**-U**  
Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 대한 사용자 계정을 지정합니다.

pgbench 환경이 설정되면 연결 풀링을 사용하거나 사용하지 않고 벤치마킹 테스트를 실행할 수 있습니다. 기본 테스트는 지정된 시간 동안 반복적으로 실행되는 트랜잭션당 5개의 SELECT, UPDATE 및 INSERT 명령 시리즈로 구성됩니다. 배율 인수, 클라이언트 수 및 기타 세부 정보를 지정하여 고유한 사용 사례를 모델링할 수 있습니다.

예를 들어 다음 명령은 20개의 동시 연결(-c 옵션)로 60초(-T 옵션, 시간을 나타냄) 동안 벤치마크를 실행합니다. -C 옵션은 클라이언트 세션당 한 번이 아니라 매번 새로운 연결을 사용하여 테스트를 실행합니다. 이 설정은 연결 오버헤드를 나타냅니다.

```
pgbench -h docs-lab-apg-133-test-instance-1.c3zr2auzukpa.us-west-1.rds.amazonaws.com -U postgres -p 5432 -T 60 -c 20 -C labdb
Password:**********
pgbench (14.3, server 13.3)
  starting vacuum...end.
  transaction type: <builtin: TPC-B (sort of)>
    scaling factor: 50
    query mode: simple
    number of clients: 20
    number of threads: 1
    duration: 60 s
    number of transactions actually processed: 495
    latency average = 2430.798 ms
    average connection time = 120.330 ms
    tps = 8.227750 (including reconnection times)
```

연결을 재사용하지 않고 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에서 pgbench를 실행하면 초당 약 8개의 트랜잭션만 처리됨을 알 수 있습니다. 이는 1분 테스트 동안 총 495건의 트랜잭션을 제공합니다.

연결을 재사용하면 사용자 수에 대한 Aurora PostgreSQL DB 클러스터의 응답이 거의 20배 빨라집니다. 재사용을 통해 동일한 시간 및 동일한 수의 사용자 연결에 대해 495개에 비해 총 9,042개의 트랜잭션이 처리됩니다. 차이점은 다음에서는 각 연결이 재사용된다는 것입니다.

```
pgbench -h docs-lab-apg-133-test-instance-1.c3zr2auzukpa.us-west-1.rds.amazonaws.com -U postgres -p 5432 -T 60 -c 20 labdb
Password:*********
pgbench (14.3, server 13.3)
      starting vacuum...end.
      transaction type: <builtin: TPC-B (sort of)>
      scaling factor: 50
      query mode: simple
      number of clients: 20
      number of threads: 1
      duration: 60 s
      number of transactions actually processed: 9042
      latency average = 127.880 ms
      initial connection time = 2311.188 ms
      tps = 156.396765 (without initial connection time)
```

이 예에서는 연결 풀링이 응답 시간을 크게 개선할 수 있음을 보여줍니다. Aurora PostgreSQL DB 클러스터용 RDS 프록시 설정에 대한 자세한 내용은 [Aurora용 Amazon RDS Proxy](rds-proxy.md) 단원을 참조하세요.