[PostgreSQL] 안쓰는 노트북으로 데이터베이스 서버 만들기!
- -
[PostgreSQL] 안쓰는 노트북으로 데이터베이스 서버 만들기!
TODO List
- LVM
- 포트포워딩
- 방화벽설정
- Postgresql 설정 파일 수정 (postgresql.conf, pg_hba.conf)
이전 포스팅에서는 AWS에서 클라우드 서버로 Postgresql 서버를 만들고, 크롤러와 연동하는 내용을 다뤘었다.
하지만 프리티어, 즉 무료로 사용할 수 있는 데이터베이스 용량은 매우 매우 매우 부족하다.
뭐 간단한 유저 정보 관리 용으로 만든 데이터베이스라면 가능하겠다만,
필자는 매일 항공권 데이터를 수집하기 때문에 이정도의 용량으로는 터무니 없이 부족했다. (기억상 20기가정도가 max였던거로 기억함)
그래서 지금은 클라우드에서 VPC, 방화벽 설정해본 경험을 토대로, 직접 홈서버를 구현해 약 2테라 정도까지 사용가능한 데이터베이스 서버를 만들어서 운영중에 있다.
지금부터 홈서버 구현까지의 나름대로의 가이드를 작성할 예정이니, 홈서버 구현에 관심있다면 도전해보는 것을 추천한다.
(클라우드에서 2테라 데이터베이스 운영하려면 한달에 40만원은 나오지 않을까싶음...ㅎㅎ)
1. LVM
먼저 나는 내가 가진 SSD 1테라 2개를 달고 있는 그램 노트북을 DB로 사용했다.
이때 1테라짜리 SSD를 2개 달고 있다고 해서, 2테라를 DB 용량으로 사용할 수는 없다.
왜냐하면 두 SSD카드, 즉 물리적으로 나눠져 있기 때문이다.
(개인적으로 포인터 같이 다루면 되지 않을까 생각하기도함)
따라서 두 SSD카드를 마치 하나의 SSD카드인 것처럼 컴퓨터에서 인식하도록 하는 방법이 LVM(Logical Volume Manager)이다.
LVM이란 쉽게 말해 물리적으로 분리된 디스크를 하나의 논리적 디스크로 볼 수 있게 해주는 시스템이다.
물리 디스크(Physical Volume) → 볼륨 그룹(Volume Group) → 논리 볼륨(Logical Volume) 순으로 추상화된다.
일단 현재 디스크 상황을 확인해보자:
lsblk
결과는 다음과 같이 나올 것이다 (아마도...기억을 더듬어 포스팅하는거라 확실하진 않다...):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 931.5G 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /boot/efi
└─nvme0n1p2 259:2 0 931G 0 part /
nvme1n1 259:3 0 931.5G 0 disk
└─nvme1n1p1 259:4 0 931.5G 0 part /data
이제 LVM을 구성하기 위해 필요한 패키지를 설치한다:
sudo apt update
sudo apt install lvm2
기존에 마운트된 파티션을 해제한다:
sudo umount /dev/nvme0n1p2
sudo umount /dev/nvme1n1p1
물리 볼륨(PV)을 생성한다:
sudo pvcreate /dev/nvme0n1
sudo pvcreate /dev/nvme1n1
물리 볼륨이 제대로 생성됐는지 확인해보자:
sudo pvs
결과는 다음과 비슷하게 나온다:
PV VG Fmt Attr PSize PFree
/dev/nvme0n1 lvm2 --- 931.51g 931.51g
/dev/nvme1n1 lvm2 --- 931.51g 931.51g
이제 이 물리 볼륨들을 묶어서 볼륨 그룹(VG)을 만들자:
sudo vgcreate my_vg /dev/nvme0n1 /dev/nvme1n1
볼륨 그룹이 잘 생성됐는지 확인:
sudo vgs
결과:
VG #PV #LV #SN Attr VSize VFree
my_vg 2 0 0 wz--n- 1863.02g 1863.02g
이제 필요한 용도에 맞게 논리 볼륨(LV)을 생성하자.
먼저 운영체제용 100GB:
sudo lvcreate -L 100G -n root_lv my_vg
그리고 PostgreSQL 데이터베이스용으로 나머지 전체 공간:
sudo lvcreate -l 100%FREE -n pg_data my_vg
논리 볼륨들이 잘 생성됐는지 확인:
sudo lvs
결과:
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
pg_data my_vg -wi-a----- 1763.02g
root_lv my_vg -wi-a----- 100.00g
이제 파일 시스템을 생성하자 (ext4 타입):
sudo mkfs.ext4 /dev/my_vg/root_lv
sudo mkfs.ext4 /dev/my_vg/pg_data
마운트 포인트를 생성하고 마운트하자:
sudo mkdir -p /mnt/root
sudo mkdir -p /mnt/pgdata
sudo mount /dev/my_vg/root_lv /mnt/root
sudo mount /dev/my_vg/pg_data /mnt/pgdata
마운트가 제대로 됐는지 확인:
df -h
결과:
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/my_vg-root_lv 98G 42G 52G 45% /
/dev/mapper/my_vg-pg_data 1.8T 578G 1.1T 35% /data
주의할 점: Ubuntu 재설치할 때 파티션 선택 화면에서 수동 파티션을 선택하고, LVM 볼륨을 마운트 포인트에 할당해야 한다. 이때 root_lv는 /
로, pg_data는 PostgreSQL 데이터 디렉토리(예: /data
)로 마운트하면 된다.
2. Ubuntu 설치 및 PostgreSQL 설정
이제 Ubuntu를 설치하고, PostgreSQL을 설치해보자.
2.1 Ubuntu 설치
Ubuntu 설치 과정은 생략하고, 설치 시에 LVM 볼륨을 적절히 마운트하는 부분만 짚고 넘어가자:
- Ubuntu 설치 미디어로 부팅
- 설치 진행 중 "설치 유형" 화면에서 "기타(수동 파티셔닝)" 선택
- LVM 볼륨 선택:
/dev/mapper/my_vg-root_lv
를 선택하고 마운트 포인트를/
로 설정/dev/mapper/my_vg-pg_data
를 선택하고 마운트 포인트를/data
로 설정
- 설치 완료 후 재부팅
2.2 PostgreSQL 설치
Ubuntu 설치가 완료되면 PostgreSQL을 설치하자:
sudo apt update
sudo apt install postgresql
설치가 완료되면 PostgreSQL 서비스가 자동으로 시작된다. 상태를 확인해보자:
sudo systemctl status postgresql
결과:
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Tue 2025-03-25 12:34:56 KST; 1min 2s ago
Process: 1234 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 1234 (code=exited, status=0/SUCCESS)
CPU: 1ms
Mar 25 12:34:56 hostname systemd[1]: Starting PostgreSQL RDBMS...
Mar 25 12:34:56 hostname systemd[1]: Finished PostgreSQL RDBMS.
PostgreSQL 데이터 디렉토리를 LVM의 pg_data에 설정하자. 먼저 PostgreSQL 서비스를 중지:
sudo systemctl stop postgresql
PostgreSQL 설정 파일을 수정하여 데이터 디렉토리 위치를 변경:
sudo vim /etc/postgresql/12/main/postgresql.conf
다음 줄을 찾아 수정:
data_directory = '/data/postgresql/14/main'
이제 PostgreSQL을 다시 시작:
sudo systemctl restart postgresql
4. 포트포워딩 설정
우리 노트북이 내부 네트워크에 있다면, 외부에서 접속하기 위해 공유기(라우터)에서 포트포워딩을 설정해야 한다.
4.1 노트북의 IP 주소 확인
ip addr show
결과에서 내부 IP 주소를 확인한다 (보통 192.168.0.x 또는 10.0.0.x 형식).
4.2 공유기 포트포워딩 설정 (필자는 KT 공유기를 사용중임)
- 공유기 관리 페이지 접속 (http://homehub.kt.com:8899/login)
- 장치설정 -> 트래픽 관리
3. 다음과 같이 설정:
- 소스 IP 주소 : 외부에서 접속할 IP (접속 출발지)
- 외부 포트: 5432 (PostgreSQL 기본 포트)
- 내부 IP: DB 노트북의 내부 IP 주소 (접속 도착지)
- 내부 포트: 5432
- 프로토콜: TCP
이외에도 SSH 연결을 위한 포트, 레디스 등등의 설정도 동일하게 진행하면 된다!
5. 방화벽 설정
Ubuntu의 기본 방화벽인 UFW를 설정하여 필요한 포트만 열어두자:
sudo apt install ufw
sudo ufw allow ssh # SSH 접속을 위해 (22번 포트)
sudo ufw allow 5432/tcp # PostgreSQL 접속을 위해
sudo ufw allow from 172.30.1.0/24 to any port 22 # 특정 IP만 열어줄때
sudo ufw enable
방화벽 상태 확인:
sudo ufw status
결과:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
5432/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
5432/tcp (v6) ALLOW Anywhere (v6)
6. PostgreSQL 설정 파일 수정
PostgreSQL의 주요 설정 파일 두 개를 수정해야 한다:
- postgresql.conf: 서버의 일반적인 설정
- pg_hba.conf: 클라이언트 인증 설정
6.1 postgresql.conf 수정
sudo vim /etc/postgresql/12/main/postgresql.conf
다음 설정들을 수정하자:
# 모든 IP에서 접속 허용
listen_addresses = '*'
이외에도 병렬 CPU, 메모리 설정을 통해 DB 성능 최적화도 가능하지만, 이건 다음 포스팅에서 진행하겠다!!
6.2 pg_hba.conf 수정
sudo vim /etc/postgresql/12/main/pg_hba.conf
외부에서 접속할 수 있도록 다음 줄을 추가:
# 모든 IP에서 모든 데이터베이스, 모든 사용자의 접속 허용 (비밀번호 필요)
host all all 0.0.0.0/0 md5
# 특정 IP 범위에서의만 모든 데이터베이스에 대한 접속 허용(/24)
host all all 172.30.1.0/24 md5
# 특정 IP 하나에서만 모든 데이터베이스에 대한 접속 허용 (/32)
host all all 35.216.67.190/32 md5
주의: 사실 이 설정 파일에서도 포트포워딩, ufw 설정에서처럼 정해진 IP만 열어놓는 것이 권장된다. (2번, 3번 방식)
하지만 포트포워딩, ufw(방화벽)에서 철저하게 IP 접속 관리를 하고 있다면 0.0.0.0으로 간단하게 해놔도 상관은 없다.
(어차피 방화벽단계에서 이미 필터링을 거친 경우에만 접속될 것이기 때문)
변경 사항을 적용하기 위해 PostgreSQL을 재시작:
sudo systemctl restart postgresql
7. PostgreSQL 사용자 및 데이터베이스 생성
이제 실제 사용할 데이터베이스와 사용자를 생성해보자:
sudo -u postgres psql
PostgreSQL 쉘에서:
-- 새 사용자 생성 (비밀번호 설정 필수)
CREATE USER gunu WITH PASSWORD 'pwd';
-- 새 데이터베이스 생성
CREATE DATABASE sample_db;
-- 사용자에게 데이터베이스 접근 권한 부여
GRANT ALL PRIVILEGES ON DATABASE sample_db TO gunu;
-- 연결 확인을 위해 나가기
\q
외부에서 접속 테스트:
psql -h <공인IP주소> -U myuser -d mydb
7. 추가 툴
장기간 실행될 서버이므로 기본적인 모니터링 도구를 설치하자:
sudo apt install htop
디스크 사용량 모니터링:
df -h
cpu 및 메모리 사용량 모니터링:
htop
정리: 홈 PostgreSQL 서버 구축의 핵심
지금까지 살펴본 홈 PostgreSQL 서버 구축 과정을 요약해보자:
- LVM 설정: 여러 물리 디스크를 논리적으로 하나로 통합
- Ubuntu 설치: 기본 운영체제 설치 및 LVM 볼륨 마운트
- 포트포워딩: 외부에서 접속할 수 있도록 공유기 설정
- 방화벽 설정: 필요한 포트만 열어 보안 강화
- PostgreSQL 설치 및 설정: 데이터베이스 서버 설치 및 외부 접속 허용
- 사용자 및 데이터베이스 생성: 실제 사용할 DB 환경 구성
아마존 RDS나 Google Cloud SQL 같은 클라우드 서비스를 사용하면 이 모든 과정을 자동으로 처리해주지만, 그에 따른 비용이 상당하다.
특히 대용량 데이터를 저장해야 한다면 더더욱 그렇다.
필자의 경우 이렇게 홈서버를 구축해서 약 2테라의 데이터베이스 공간을 확보했고, 클라우드에서 이만한 용량을 운영했다면 매달 수십만원의 비용이 발생했을 것이다.
물론 고가용성이나 자동 백업, 스케일링 같은 기능은 직접 구현해야 하지만, 개인 프로젝트나 소규모 서비스라면 이 정도로도 충분히 안정적인 운영이 가능하다.
유휴 노트북이 있고, 클라우드 쓸 돈은 없고, DB가 필요하다면 이 방법을 시도해보길 추천한다!
ㄱㅊㅁ_ㅇㅈ
'데이터 엔지니어링' 카테고리의 다른 글
[AWS EC2] 가상 머신 인스턴스 생성 (외부 IP, 내부 IP 설정) (0) | 2025.02.18 |
---|---|
[AWS RDS] 서버 DB 인스턴스 생성 및 로컬 크롤러 연동 (0) | 2025.02.17 |
[Tableau]Tableau Desktop 설치 및 대시보드 구현 (0) | 2025.02.17 |
[Postgres, Crawler] part 1. 로컬 DB 생성 및 크롤러 연동 (0) | 2025.02.17 |
[Tableau, AWS] 클라우드 활용 대시보드 제작 스터디 운영 회고록 (0) | 2025.02.17 |
소중한 공감 감사합니다