壓縮 PGDATA 的小實驗

你的磁碟沒有變大,你只是更善用了你的空間

古哥
古哥
May 3 · 5 min read

VDO (Virtual Data Optimizer) 技術可以製作一個即時壓縮的檔案系統,那麼,我可以讓我的 PostgreSQL 變大嗎?壓縮標的是 PGDATA 的所有檔案。

有關 VDO 的說明,可以先參閱:

  1. Configure Virtual Data Optimizer (VDO) on CentOS 8
    這篇有操作可以照著做。
  2. PART III. DATA DEDUPLICATION AND COMPRESSION WITH VDO
    詳細說明就看 RedHat 的手冊吧。

先打預防針,這個實驗我只做了一次,主要想要快速分享這個過程,提供給想要提升系統資源使用率的朋友瞭解如何嘗試。

壓縮技術的假設前提就是,相信資料是以某種規律重覆儲存著,而資料庫系統通常是以某種應用規則而建置起來的,相同的資料在資料庫中不斷出現是很合理的事情。所以類似的技術和做法,我認為都很有嘗試的價值。

Image for post
Image for post

先談理論上可能得到的優勢,總之不就是把 PGDATA 壓縮起來嗎?還有別的嗎?因為資料庫系統多數的情況是屬於 I/O Bound,所以檔案系統的改變是會直接影響到資料處理的過程。以下是預期可以得到的好處:

  1. 增加磁碟空間:因為檔案被壓縮了,多少可以多一些空間可以使用。
  2. 增加資料處理效能:因為檔案被壓縮了,磁碟讀取的磁區數減少,使得資料載入的效率可以加快,進一步增加資料處理的速度。

成本就是壓縮解壓縮的過程,會增加 CPU 和記憶體的使用率。也有可能在壓縮率不張的情況下,沒有得到更多的磁碟空間,反而花費了更多的處理時間。所以壓縮機制永遠必須和你的實際資料一起評估,以確保你真的得到了好處。

基礎的系統環境是 CentOS 8 建立了 VDO 檔案系統之後,指定 PGDATA 在該檔案系統上,然後啓動 PostgreSQL,執行 pgbench 來測試。

為避免內容冗長,詳細的操作步驟就省略,僅列出關鍵的指令。

實體磁碟有 3 個:

  • /dev/sda : 作業系統
  • /dev/sdb:8GB,ext4,對照組,mount on /ext4
  • /dev/sdc:8GB,vdo,實驗組,mount on /vdo

建立對照組 ext4 檔案系統,實體大小就 8GB:

# fdisk /dev/sdb (省略,全部給sdb1)
# mkfs.ext4 /dev/sdb1
# mkdir /ext4
# mount /dev/sdb1 /ext4

建立 VDO 檔案系統,實體還是只有 8GB,但我宣稱有 32GB,先假裝有(Overcommit)而已,實際上能不能用到這麼多還是要看壓縮率而定。

# vdo create --name=vdo --device=/dev/sdc --vdoLogicalSize=32G
# mkfs.ext4 /dev/mapper/vdo
# mkdir /vdo
# mount /dev/mapper/vdo /vdo

以 CentOS 8 已經內建了 PostgreSQL 的安裝套件,預設初始化的 PGDATA 在 /var/lib/pgsql/data:

# postgresql-setup initdb
# cp -R /var/lib/pgsql/data /vdo/pgdata
# cp -R /var/lib/pgsql/data /ext4/pgdata
# chown postgres:postgres /vdo/pgdata
# chown postgres:postgres /ext4/pgdata

接下來就切換到 postgres 使用者比較方便操作:

$ pg_ctl -D /vdo/pgdata -l logfile start
$ pgbench -i -s 100
$ pgbench -c 50 -j 50 -rv -T 60
$ pg_ctl -D /vdo/pgdata -l logfile stop

這樣操作完就可以以 pgbench 產生一定量的資料庫內容,並且得到效能測試結果。ext4 的對照組操作亦同。

提醒:因為 pgbench 的內容和測試是隨機產生的,只有資料量會相近,每次實驗都會有些許不同,壓縮率可能也會有起伏。

當 scale factor = 100 時,壓縮率為 24%,總共 3.2G 的內容,僅使用 765MB 實體磁碟空間。效能測試(TPS)則提高了約 14%。再對照前面說的兩點好處:

  1. 增加磁碟空間:+76%
  2. 增加資料處理效能:+14%

最後測試到 scale factor = 500,壓縮率為 34%,總資料量為 9.08GB,ext4 無壓縮的磁碟明顯已經吃不下了,VDO 實驗組仍然可以正常使用資料庫,表示壓縮是真的。成功可以使用超過 8GB 以上的空間。

不過,由於 VDO 的 metadata,需求是至少 4GB,所以以這個實驗而言,8GB 是勉強划算(賺 1.08GB)而已。前段所描述的總資料量 9.08GB,實際使用磁碟空間:

9.08 * 34% + 4 = 7.08 (GB)

基本上也快用完實體空間了。所以以這個壓縮率,要真的撐到宣告的 32GB 是不太可能的。

歷史測試不代表未來績效,投資有賺有賠,請詳閱系統使用說明書。

pgsql-tw

這裡是 PostgreSQL 台灣使用者社群,歡迎任何人投稿!

古哥

Written by

古哥

解決不了問題,就解決提出問題的人

pgsql-tw

pgsql-tw

你懂資料庫,資料庫就會幫你🐘

古哥

Written by

古哥

解決不了問題,就解決提出問題的人

pgsql-tw

pgsql-tw

你懂資料庫,資料庫就會幫你🐘

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store