요즘은 DBMS 자체에서도 압축 기능을 가지고 있습니다.
오라클(특히 엑사데이터) 나 MySQL/MariaDB의 TokuDB 엔진 같은 경우 대단한 압축 효율성을 자랑하죠
하지만 PostgreSQL 은 내장된 데이터 압축 저장 기능이 없습니다. 하지만 그렇다고 방법이 없는 건 아니죠.
압축기능이 있는 파일시스템인 ZFS(Zettabye File System) 이나 BTRFS(B-tree file system) 로 구축하고 그 위에서 PostgreSQL 을 구동하면 됩니다. (리눅스 운영환경에서는 아직 권장 사항아닙니다.)
둘다 COW(copy-on-write) 메큐니즘을 기반으로 한 화일시스템으로 데이터의 무결성 저장능력이 뛰어나고, 무제한으로 화일시스템을 늘릴수 있으며
volume snapshot 기능(데이터베이스의 백업/복구에 필요한 기능으로 순식간에 화일시스템을 복제하는 기능)이 매우 훌륭합니다.
먼저 ZFS 간단히 설명하겠습니다.
* http://zfsonlinux.org/
* 썬 마이그로시스템에서 만든 파일시스템으로 killer application 입니다. 볼륨 매니저 기능을 가지고 있으며, 성능과 편의성에서 최고의 파일시스템입니다.
* 오픈소스이기는 하나 CDDL(Common Development and Distribution License) 라이센스 인지라, GPL 과 어긋나는 부분이 있어 리눅스쪽에서 공식배포는 하지 못하고 있습니다.
* Solaris 나 FreeBSD os 를 사용하신다면 최적화되어 화일시스템이므로 무조건(?) 쓰시면 되고, 리눅스에서도 설치사용은 가능하나 성능면 특히 메모리 관리 측면에서 최적화되어 있지 못합니다.(현재 버전 0.6x)
* 필자가 PostgreSQL 을 리눅스가 아닌 Solaris 나 FreeBSD 를 사용해야만 한다면 무조건(?) ZFS 화일시스템위에서 구동할겁니다.
* 128bit 파일시스템으로 생성가능한 화일시스템 사이즈가 거의 무제한이라고 보시면 됩니다.
* 지원하는 압축 알고리즘은 lzjb, "gzip[1-9], zle, lz4 입니다. (특히 lz4 알고리즘이 물건입니다. 아쉽게도 btrfs 에서는 지원안합니다.)
다음은 BTRFS 입니다.
* https://btrfs.wiki.kernel.org/ (버젓한? 싸이트가 별도로 없습니다.)
* ZFS 과 다르게 리눅스에서만 지원되는 파일시스템입니다.
* BTRFS 화일시스템을 개발자를 페이스북에서 올해 채용했으니 페이스북 엔지니어가 개발하고 있다고 할수 있습니다.
* 현재 지원하는 압축 알고리즘은 zlib 과 LZO 입니다.
* 생성가능한 최대 화일 사이즈가 16 Exabytes 으로 zfs 처럼 거의 무제한이라고 보면 됩니다.
* GPL 라이센스하의 오픈소스로서, 오라클에서 만들기 시작했습니다.
두파일 시스템 모두 훌륭한 data checksum 기능으로 인해 데이터의 무결정 저장에 장점을 가지고 있으며
무제한의 화일시스템 생성 가능, 편리한 snapshot 기능, 압축기능을 가진 파일시스템입니다.
(공교롭게도 둘 다 태생이 오라클이네요. ㅎㅎ)
리눅스진영에서는 btrfs 이 향후 차세대 화일시스템이 될 가능성이 커보입니다.(zfs 는 라이센스 문제로 인해..)
참고로, ext4 는 벌써 레드햇 7에서 버려졌습니다? 레드햇의 기본 파일시스템인 ext4 이, 올해 레드햇 7 이 릴리즈 되면서 xfs(zfs 아님)에게 기본 파일시스템 왕좌를 뺏겼습니다.
요약하자면 리눅스 진영에서는 zfs 나 btrfs 화일시스템은 아직 "운영환경" 에서 쓸수 있는 파일시스템은 아닙니다.
즉 그 파일시스템을 PostgreSQL 의 실시간 데이터 저장공간으로 사용하면 안됩니다. 테스트 머신이 아닌이상...
하지만, 필자가 보기에 "PostgreSQL 의 백업저장 파일시스템" 으로 사용하기에는 충분해보입니다. 압축기능이 너무 매력적입니다.
아래는 각각 필자의 머신에서 zfs 와 btrfs 파일시스템을 구축한후 각 파일시스템에 1000m 짜리 더미 화일을 생성하는 예제입니다. 압축기능을 넣어 활성화한 파일시스템이므로 더미 화일의 실제 생성 사이즈는 얼마 안되는걸 확인할수있습니다.
-- ZFS
[root@node2:/pgZFS/data]# which zfs
/sbin/zfs
[root@node2:/pgZFS/data]# rpm -qf /sbin/zfs
zfs-0.6.3-1.1.el6.x86_64
[root@node2:/pgZFS/data]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 18G 13G 4.4G 74% /
tmpfs 1.5G 72K 1.5G 1% /dev/shm
/dev/sda1 283M 60M 209M 23% /boot
pgZFS 1.5G 32K 1.5G 1% /pgZFS
pgZFS/data 1.5G 32K 1.5G 1% /pgZFS/data
/dev/drbd0 488M 2.3M 460M 1% /DRBD
[root@node2:/pgZFS/data]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
pgZFS 162K 1.42G 31K /pgZFS
pgZFS/data 30K 1.42G 30K /pgZFS/data
[root@node2:/pgZFS/data]# zfs get all | grep compression
pgZFS compression lz4 local
pgZFS/data compression lz4 inherited from pgZFS
[root@node2:/pgZFS/data]# dd if=/dev/zero of=dummy.txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 3.65983 s, 287 MB/s
[root@node2:/pgZFS/data]# ls -lh
total 512
-rw-r--r-- 1 root root 1000M Nov 17 21:58 dummy.txt
[root@node2:/pgZFS/data]# du -sh
2.0K .
[root@node2:/pgZFS/data]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 18G 13G 4.4G 74% /
tmpfs 1.5G 72K 1.5G 1% /dev/shm
/dev/sda1 283M 60M 209M 23% /boot
pgZFS 1.5G 32K 1.5G 1% /pgZFS
pgZFS/data 1.5G 32K 1.5G 1% /pgZFS/data
/dev/drbd0 488M 2.3M 460M 1% /DRBD
[root@node2:/pgZFS/data]#
-- BTRFS
[root@node04:/pgBTRFS]# btrfs --version
Btrfs v3.17.1
[root@node04:/pgBTRFS]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 18G 4.7G 13G 27% /
devtmpfs 1.4G 0 1.4G 0% /dev
tmpfs 1.4G 80K 1.4G 1% /dev/shm
tmpfs 1.4G 9.0M 1.4G 1% /run
tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
/dev/sda1 497M 120M 377M 25% /boot
/dev/mapper/kssVG-lvol0 1016M 116K 1012M 1% /pgBTRFS
[root@node04:/pgBTRFS]# btrfs filesystem show
Label: none uuid: b8cf11a4-6d21-4ce8-831a-e5a11c1dd479
Total devices 1 FS bytes used 583.30MiB
devid 1 size 1016.00MiB used 908.00MiB path /dev/mapper/kssVG-lvol0
Btrfs v3.17.1
[root@node04:/pgBTRFS]#
[root@node04:/pgBTRFS]# cat /etc/fstab |grep pgBTRFS
/dev/kssVG/lvol0 /pgBTRFS/ btrfs compress=lzo 0 1
[root@node04:/pgBTRFS]# dd if=/dev/zero of=dummy.txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 17.8828 s, 58.6 MB/s
[root@node04:/pgBTRFS]# ls -lh
total 1000M
drwxr-xr-x. 1 root root 20 Nov 17 13:45 data/
drwxr-xr-x. 1 root root 0 Nov 17 13:41 data2/
drwxr-xr-x. 1 root root 10 Nov 17 13:47 data_snapshot/
-rw-r--r--. 1 root root 1000M Nov 17 22:10 dummy.txt
[root@node04:/pgBTRFS]# du -sh
1001M .
[root@node04:/pgBTRFS]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 18G 4.7G 13G 27% /
devtmpfs 1.4G 0 1.4G 0% /dev
tmpfs 1.4G 80K 1.4G 1% /dev/shm
tmpfs 1.4G 9.0M 1.4G 1% /run
tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
/dev/sda1 497M 120M 377M 25% /boot
/dev/mapper/kssVG-lvol0 1016M 116K 1012M 1% /pgBTRFS
[root@node04:/pgBTRFS]#