[Database][Cluster]データ領域の拡張例

Windowsだと楽なんだけどなぁ

というのは、現在我が家にあるPostgreSQLクラスターのデータ領域拡張。

我が家のクラスター領域のディスク割り当てはこんな風になってます。

[root@elephant-1 ~]# df -h
ファイルシス                サイズ  使用  残り 使用% マウント位置
devtmpfs                      4.8G     0  4.8G    0% /dev
tmpfs                         4.9G   54M  4.8G    2% /dev/shm
tmpfs                         4.9G  441M  4.4G    9% /run
tmpfs                         4.9G     0  4.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root        35G  4.9G   31G   14% /
/dev/sda1                    1014M  232M  783M   23% /boot
192.168.110.243:/share-data   400G   57G  344G   15% /bkup
/dev/sdb1                     60G   52G   8G   86% /data
tmpfs                         984M     0  984M    0% /run/user/0

そして、容量を圧迫してる原因であるデータベースの容量使用状況

7.8M	./data/base/1
7.6M	./data/base/13807
7.6M	./data/base/13808
12G	./data/base/16386
8.7M	./data/base/32832
8.9M	./data/base/75945
38G	./data/base/76176
0	./data/base/pgsql_tmp
49G	./data/base

監視基盤から/dataの領域が圧迫してるとのことで通知がやってきて、それで初めて気づきました。

なんていうかここ最近ZABBIXのデータベースとして使うようになったことが要因なのかなーと思われます。12GBとなってる領域がMastodonデータベース、38GBに達してるのがZABBIX DBの使用容量になってます。やっぱZABBIXのデータベースって容量くうなぁ。
dfの結果を見てわかるように、我が家のクラスタのデータベース領域は「独立した単一パーティション・非LVM」で構成されています。Windowsだと末尾パーティションであればオンラインで手軽に拡張できるようになってるんですが、悲しいかなLinuxの場合その手段がありません・・というか、本当はpartedで拡張可能だったかなと思うのですが、今回partedではオンライン拡張できませんでした。

というわけで、DB止めて拡張することに。ただ、厄介なことにpcsコマンドでの停止・起動は割と面倒でした。

拡張フロー

仮想ディスク拡張・再スキャン

まずはVMwareレイヤーでそれぞれのDBサーバの/dev/sdbに相当するディスク容量を変更し、60GB->120GBへ変更。
そして、1号機に入り、拡張の反映を行います。

echo 1 > /sys/block/sdb/device/rescan

リソースの停止

PostgreSQLリソースの停止を行います。

pcs resource disable pgsql

リソースの停止ですが、単純にPostgreSQLそのものを停止したかったので、msPostgreSQLではなく、pgsqlリソースを停止しました。停止したかどうかをpsコマンドで確認します。

  pcs status
  ps -ef|grep postgres

ディスクアンマウント・パーティション拡張

停止を確認したら、以下のようにしてマウントを解除します。まずは1号機から拡張を行います。

 umount /data
 parted /dev/sdb

ここで、以下のように入力して拡張を行いました。

print
->パーティションのNumを確認する

resizepart 1 100%
->ここでは1というのがNumを示しており、これを100%まで拡張することを示している

quit
->動的に反映されるので、これでpartedを終了する。再度printで確認するのもありだと思う

ファイルシステムの拡張

今回このディスクを構成するファイルシステムはXFSであるため、一度マウントしてからファイルシステムの拡張を行います。

mount /data
xfs_growfs /data

続いて2号機で以下のように1号機に対して行った処理をしていきます。

2号機でも同等の作業を実施する

2号機でディスク拡張の反映を行います。

echo 1 > /sys/block/sdb/device/rescan
  pcs status
  ps -ef|grep postgres

停止を確認したら、以下のようにしてマウントを解除します。まずは1号機から拡張を行います。

 umount /data
 parted /dev/sdb

そしてパーティション拡張を実施。

print
->パーティションのNumを確認する

resizepart 1 100%
->ここでは1というのがNumを示しており、これを100%まで拡張することを示している

quit
->動的に反映されるので、これでpartedを終了する。再度printで確認するのもありだと思う

ファイルシステムの拡張を行います。

mount /data
xfs_growfs /data

ディスク拡張結果の確認

この時点で、ディスクの状態は双方以下のようになっていることを確認・・

ファイルシス                サイズ  使用  残り 使用% マウント位置
devtmpfs                      4.8G     0  4.8G    0% /dev
tmpfs                         4.9G   54M  4.8G    2% /dev/shm
tmpfs                         4.9G  441M  4.4G    9% /run
tmpfs                         4.9G     0  4.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root        35G  4.9G   31G   14% /
/dev/sda1                    1014M  232M  783M   23% /boot
192.168.110.243:/share-data   400G   57G  344G   15% /bkup
/dev/sdb1                     120G   52G   69G   43% /data
tmpfs                         984M     0  984M    0% /run/user/0

上記のように60GBのディスクは120GBに広がりました。

リソースの起動

なので、以下のようにしてpgsqlリソースの起動に入ります。ロックファイルが配置されていることがあるため、これはどうやら事前に削除したほうが良いようです。

rm /var/lib/pgsql/tmp/PGSQL.lock
pcs resource enable pgsql

本来はこれで動いてくれる・・はずなんですけどね。なかなかうまく動いてくれませんで、私の場合は何度か pcs resource cleanupを繰り返して何とか起動できました。

クラスタ状態の確認

クラスタの状態を詳細モードで確認します。

[root@elephant-1 ~]# pcs status --full
Cluster name: pgcluster
Stack: corosync
Current DC: elephant-1 (1) (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Sun Aug  8 19:39:30 2021
Last change: Sun Aug  8 12:21:04 2021 by root via crm_attribute on elephant-1

2 nodes configured
4 resource instances configured

Online: [ elephant-1 (1) elephant-2 (2) ]

Full list of resources:

 Master/Slave Set: msPostgresql [pgsql]
     pgsql      (ocf::heartbeat:pgsql): Master elephant-1
     pgsql      (ocf::heartbeat:pgsql): Slave elephant-2
     Masters: [ elephant-1 ]
     Slaves: [ elephant-2 ]
 Resource Group: master-group
     vip-master (ocf::heartbeat:IPaddr2):       Started elephant-1
     vip-rep    (ocf::heartbeat:IPaddr2):       Started elephant-1

Node Attributes:
* Node elephant-1 (1):
    + master-pgsql                      : 1000
    + pgsql-data-status                 : LATEST
    + pgsql-master-baseline             : 000000B3C7000098
    + pgsql-status                      : PRI
* Node elephant-2 (2):
    + master-pgsql                      : 100
    + pgsql-data-status                 : STREAMING|SYNC
    + pgsql-status                      : HS:sync

Migration Summary:
* Node elephant-1 (1):
* Node elephant-2 (2):

Fencing History:

PCSD Status:
  elephant-2: Online
  elephant-1: Online

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

とりあえずはStatusが「HS:sync」となっていれば大丈夫そうです。

正直に感じたこと

やっぱりLVMを基本的には使ったほうが良いのだろうか・・・なぁ?と。拡張を必要としたとき、やっぱりオンライン拡張はLVMのほうが楽なように思えます。これまでもそうでしたし。ext4だと拡張に少々時間を要しますが、XFSだと一瞬で終わりますしね。

localYouser

www.bluecore.net

九州在住のITインフラエンジニアです。 若干病気等に苦しめられながらも、小さな幸せをじっくり噛み締めながらお仕事頑張ってます。