1 서버에서 PostgreSQL 인스턴스를 여러 개 시작하는 방법

소개



같은 서버의 PostreSQL에서 여러 인스턴스를 동시에 시작하여 애플리케이션의 동작을 쉽게 확인할 필요가 있어 비망록으로 정리했습니다.
이번에는 쉽게 환경을 구축하기 위해 PostgreSQL 계정을 만들지 않고 자신의 계정을 사용하여 소스 코드에서 PostgreSQL을 설치합니다.

환경



OS는 Ubuntu 20.04를 사용합니다. PostgreSQL 버전은 현재 최신 PostgreSQL 13.3을 사용합니다.
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"

사전 준비



PostgreSQL에 필요한 패키지를 설치합니다.bash
$ sudo apt install libreadline-dev zlib1g-dev bison flex

PostgreSQL을 설치하고 실행하는 데 필요한 디렉토리를 만듭니다. src는 소스 코드를 저장하고 pgsql은 PosthreSQL을 설치하고 data는 데이터베이스 클러스터를 저장합니다.
$ cd $HOME
$ mkdir src
$ mkdir pgsql
$ mkdir data

PostgreSQL 설치



PostgreSQL 소스 코드의 아카이브 파일을 얻고 아카이브 파일을 확장합니다.
$ cd src
$ wget https://ftp.postgresql.org/pub/source/v13.3/postgresql-13.3.tar.gz
$ tar xvzf postgresql-13.3.tar.gz

PostgreSQL을 빌드합니다. configure를 실행할 때 prefix 옵션으로 PostgreSQL을 설치할 위치를 지정합니다. 이번에는 $HOME/pgsql/postgresql-13.3입니다.
$ cd postgresql-13.3
$ ./configure --prefix=$HOME/pgsql/postgresql-13.3
$ make
$ make install

데이터베이스 클러스터 만들기



데이터베이스 클러스터를 만듭니다. 이번에는 3개의 클러스터 cluster1, cluster2, cluster3을 작성합니다.
$ cd $HOME/pgsql/postgresql-13.3/bin
$ ./initdb $HOME/data/cluster1
$ ./initdb $HOME/data/cluster2
$ ./initdb $HOME/data/cluster3

인스턴스를 동시에 시작하기 위해 서로 다른 포트 번호를 설정합니다. cluster1은 PostgreSQL 기본 포트 번호 5432를 사용하고 cluster2는 5433으로, cluster3은 5434로 포트 번호를 변경합니다.
$ cd $HOME/data/cluster2
$ vi postgresql.conf
port = 5433
$ cd $HOME/data/cluster3
$ vi postgresql.conf
port = 5434

PostgreSQL 인스턴스 시작



pg_ctl 명령으로 PostgreSQL 인스턴스를 시작합니다. 시작할 때 데이터베이스 클러스터와 로그 파일을 지정합니다.
$ cd $HOME/pgsql/postgresql-13.3/bin
$ ./pg_ctl -D $HOME/data/cluster1 -l $HOME/data/cluster1/postgres1.log start
$ ./pg_ctl -D $HOME/data/cluster2 -l $HOME/data/cluster2/postgres2.log start
$ ./pg_ctl -D $HOME/data/cluster3 -l $HOME/data/cluster3/postgres3.log start

데이터베이스 및 테이블 만들기



createdb 명령을 사용하여 각 데이터베이스를 작성하십시오.
$ ./createdb -p 5432 postgresdb1
$ ./createdb -p 5433 postgresdb2
$ ./createdb -p 5434 postgresdb3

psql 명령을 사용하여 각 인스턴스에 연결하여 테이블 dbnmae를 작성하여 레코드를 한 행 추가합니다.
$ ./psql -p 5432 postgresdb1
postgresdb1=# CREATE TABLE dbname(name text);
postgresdb1=# INSERT INTO dbname VALUES('postgres database1');
$ ./psql -p 5433 postgresdb2
postgresdb2=# CREATE TABLE dbname(name text);
postgresdb2=# INSERT INTO dbname VALUES('postgres database2');
$ ./psql -p 5434 postgresdb3
postgresdb3=# CREATE TABLE dbname(name text);
postgresdb3=# INSERT INTO dbname VALUES('postgres database3');

PostgreSQL 인스턴스 시작 확인



위의 psql에서 인스턴스 시작을 확인할 수 있지만 동시에 각 인스턴스에 액세스할 수 있는지 확인해 보겠습니다.

print_dbname.py
import psycopg2
# PostgreSQLインスタンス接続情報、実行SQL 
dsn1 = "dbname=postgresdb1 host=localhost"
dsn2 = "dbname=postgresdb2 host=localhost port=5433"
dsn3 = "dbname=postgresdb3 host=localhost port=5434"
sql = "SELECT * FROM dbname"
# PostgreSQLインスタンスと接続 
conn1 = psycopg2.connect(dsn1)
conn2 = psycopg2.connect(dsn2)
conn3 = psycopg2.connect(dsn3)
# カーソルの取得
cur1 = conn1.cursor()
cur2 = conn2.cursor()
cur3 = conn3.cursor()
# SQL実行
cur1.execute(sql)
cur2.execute(sql)
cur3.execute(sql)
# 取得結果を出力
print(cur1.fetchone())
print(cur2.fetchone())
print(cur3.fetchone())
# カーソルを閉じる
cur1.close()
cur2.close()
cur3.close()
# PostgreSQLインスタンスとの接続を切断
conn1.close()
conn2.close()
conn3.close()

위의 python 프로그램을 실행하면 다음과 같이 각 인스턴스의 테이블에 저장된 레코드가 표시됩니다.
$ python3 print_dbname.py 
('postgres database1',)
('postgres database2',)
('postgres database3',)

아래 그림과 같은 이미지가 됩니다.



python3, psycopg2가 설치되어 있지 않고 위 프로그램을 실행할 수없는 경우 다음 명령으로 설치를 요청하십시오.
$ sudo apt install python3
$ sudo apt install python3-pip
$ pip install psycopg2-binary

PostgreSQL 인스턴스 종료



pg_ctl 명령을 사용하여 PostgreSQL 인스턴스를 종료합니다.
$ cd $HOME/pgsql/postgresql-13.3/bin
$ ./pg_ctl -D $HOME/data/cluster1 stop
$ ./pg_ctl -D $HOME/data/cluster2 stop
$ ./pg_ctl -D $HOME/data/cluster3 stop

요약



포트 번호를 변경하여 동일한 서버의 PostreSQL에서 여러 인스턴스를 동시에 시작했습니다. 내 계정으로 쉽게 PostgreSQL의 여러 인스턴스를 확인할 수있었습니다.

설명에 오류가 있거나 신경이 쓰이는 경우 편집 요청이나 의견으로 피드백해 주시면 도움이 됩니다.

참조



이하의 정보를 참고로 했습니다.

  • 데이터베이스 클러스터 작성 순서 【복수 작성하는 경우에 해설】 【PostgreSQL】
  • 좋은 웹페이지 즐겨찾기