HP ProliantでDebian12 Postgres15で、ストリーミングレプリケーションするまでまとめ

Linux

本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^

環境

ハードウェア

HP Proliant DL20 Gen10

[    0.000000] DMI: HPE ProLiant DL20 Gen10/ProLiant DL20 Gen10, BIOS U43 09/16/2021
[    0.000000] tsc: Detected 3400.000 MHz processor
[    0.000000] tsc: Detected 3399.906 MHz TSC

[    1.027289] smartpqi 0000:04:00.0: added 0:2:0:0 0000000000000000 RAID              HPE      E208i-a SR Gen10

[    1.057253] sd 0:1:0:0: [sda] 1875319472 512-byte logical blocks: (960 GB/894 GiB)

Debian

# cat /etc/debian_version
12.1

Postgres

# apt-cache show postgresql
Package: postgresql
Source: postgresql-common (248)
Version: 15+248
Installed-Size: 15
Maintainer: Debian PostgreSQL Maintainers <team+postgresql@tracker.debian.org>
Architecture: all
Depends: postgresql-15

IPアドレス

マスター 192.168.0.12 ,IPエイリアス 192.168.0.13

ホットスタンバイ 192.168.0.17

UPS

OMRON BN50T

Omron SimpleShutdownSoftware

サーバ管理ツール

iLO5

ハードウェア RAID1

E208i-a smart array card を利用して、RAID1構成にします。

SSDはMicron製のエンタープライズ製品を選定しました

Debianインストール初期設定

初期設定では、NTPを設定したくらいです。ウィンドウマネージャも設定せず、すべてコマンドラインで設定しました。ウィンドウマネージャを利用していると、何かとトラブルが起こったりするので、私は採用してません。クライアントパソコンならまだ入れる意味も出てくると思うのですが、DBサーバ管理に、ウィンドウマネージャ―は必要ないかなぁという感覚です。

NTP設定

編集するファイル

/etc/systemd/timesyncd.conf

[Time]
NTP=ntp.nict.jp

リスタート

systemctl restart systemd-timesyncd

同期できているか確認する

# systemctl -l status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-04-29 15:23:24 JST; 19s ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 4629 (systemd-timesyn)
     Status: "Initial synchronization to time server 61.205.120.130:123 (ntp.nict.jp)."
      Tasks: 2 (limit: 28637)
     Memory: 1004.0K
        CPU: 40ms
     CGroup: /system.slice/systemd-timesyncd.service
             mq4629 /lib/systemd/systemd-timesyncd

 4月 29 15:23:24 testdb systemd[1]: Starting Network Time Synchronization...
 4月 29 15:23:24 testdb systemd[1]: Started Network Time Synchronization.
 4月 29 15:23:24 testdb systemd-timesyncd[4629]: Initial synchronization to time server 61.205.120.130:123 (ntp.nict.jp).

syslog設定

使い慣れたsyslogも入れておきます。

apt-get install rsyslog

UPS設定

UPSで電源供給する事はすぐできますが、停電が起こった時に安全にシャットダウンしたいです。その時に必要なのが、UPS管理ソフトになります。

USB接続しておき、UPSへの電源供給状態によって規定の時間以上停電が起こった時にシャットダウンスクリプトを走らせます。

1台のOMRON UPSとUSB接続する場合

PowerActPro を利用し、Slaveとして動作させる場合

PowerAct Pro Slave Agent をダウンロード

# wget https://socialsolution.omron.com/jp/ja/products_service/ups/support/download/soft/poweractpro/slave/PAPV460_Slave_Linux9.zip

unzipインストール

# apt-get install unzip

解凍

# unzip PAPV460_Slave_Linux9.zip

rpm → deb 変換ツールインストール

apt-get -y install alien

rpm → deb 変換

/PAPV460_Slave_Linux9/source# alien PowerActPro-SlaveAgent-4.60-20230811.x86_64_Redhat9.rpm
Warning: Skipping conversion of scripts in package PowerActPro-SlaveAgent: postinst postrm preinst prerm
Warning: Use the --scripts parameter to include the scripts.
poweractpro-slaveagent_4.60-20230812_amd64.deb generated

インストール

PAPV460_Slave_Linux9/source# dpkg -i poweractpro-slaveagent_4.60-20230812_amd64.deb

設定

/usr/lib/PowerActPro/SlaveAgent/slaveconfig.sh

1.PA Proを選択

********************************************************************************
   Master Agent
********************************************************************************
   1. PA Pro
   2. SC20G
   3. SC20G2
   4. SC21
   5. SC22

   Select Number ->

冗長化電源は2を選択

********************************************************************************
   Redundant Power Supply Setting
********************************************************************************
   1. Enable
   2. Disable

   Select Number ->

同じセグメントにいるサーバは自動で探してくれるので3 を選択

********************************************************************************
   IP Address of Master Agent
********************************************************************************
   1. End
   2. Add a New IP Manually
   3. Add a New IP Manually From Net Search

   Select Number ->

探してこられたサーバを選択

********************************************************************************
   Select a New IP From Net Search
********************************************************************************
   Net Search is in Process, Please wait ...

     1. 192.168.11.5
     0. Return

   Select Number ->

ポップアップメッセージは表示させたいので1.Enable

********************************************************************************
   Popup Message
********************************************************************************
   1. Enable
   2. Disable

   Select Number ->

シャットダウンに入るまで180秒で設定

********************************************************************************
   Shutdown Start Delay Tiem(Sec.)
********************************************************************************
   * The range of Shutdown start delay time is from 0 Sec to 600 Sec
   * The step between "0 Sec to 600 Sec" is "60 Sec".

   Input Value:

外部コマンドは実行しないので0

********************************************************************************
   Run External Command Time(Sec.)
********************************************************************************
   * The range of Ext cmd run time is from 0 Sec to 600 Sec.
   * The step between "0 Sec to 600 Sec" is "60 Sec".
   * If you use External Command for Virtual Server shutdown, please
     setup External Command needs time for Guest OS shutdown.

   Input Value:

外部実行コマンドはないので、空白のままエンター

********************************************************************************
   Run External Command
********************************************************************************
   Input a executable file:

シャットダウンに必要な時間は120秒で設定

********************************************************************************
   Shutdown Need Time(Sec.)
********************************************************************************
   * The range of Shutdown need time is from 0 Sec to 600 Sec.
   * The step between "0 Sec to 600 Sec" is "60 Sec".

   Input Value: 120

Shutdown Mode は、1.Shutdown

********************************************************************************
   Select OS Shutdown Mode
********************************************************************************
   1. Shutdown
   2. Hibernate

   Select Number ->

バーチャルサーバは利用していない 1.を選択

********************************************************************************
   Select Virtual Server Shutdown Mode
********************************************************************************
   1. Shutdown by Linux System
   2. Shutdown by PowerAct Pro

   Select Number ->

ポップアップメッセージにて正常稼働を確認

#
Broadcast message from root (Tue Jan 16 15:24:57 2024):

Agent Start

Broadcast message from root (Tue Jan 16 15:25:02 2024):

Network Communication starts with master agent

systemdにて自動起動できるように

# vi /etc/systemd/system/omron-ups.service
[Unit]
Description=Simple Shutdown Software

[Service]
Type=forking
ExecStart=/usr/lib/PowerActPro/SlaveAgent/ControlCenter/ControlCenter
KillSignal=SIGUSR1
Restart=on-abort
RestartSec=3

[Install]
WantedBy=multi-user.target

登録・再起動

# systemctl daemon-reload
# systemctl enable omron-ups.service

# systemctl start omron-ups
# /usr/sbin/reboot

PowerAct Pro Master Agentマシンにてコンソール確認

+------------------------------------------------------------------------------+
   [ NetSearch Window Menu ]
+------------------------------------------------------------------------------+
   1. Show NetSearch Information
   2. Monitor PowerAct Pro Master Agent
   0. Exit PowerAct Pro Console

   Select Number -> 1
+------------------------------------------------------------------------------+
   [ NetSearch Window ]
+------------------------------------------------------------------------------+
 ID  Master/Slave      UPS Model   UPS Status   Battery Status   Communication
 1   AD01          BN100T      On Line      Normal           USB1:Normal
     AD02
     TestDB
--------------------------------------------------------------------------------

※TestDB が今回Linux上に設定したPower Act Pro Slave Agent

ステータスの確認

# systemctl status omron-ups.service
● omron-ups.service - Simple Shutdown Software
     Loaded: loaded (/etc/systemd/system/omron-ups.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-01-16 16:16:37 JST; 2min 28s ago
    Process: 526 ExecStart=/usr/lib/PowerActPro/SlaveAgent/ControlCenter/ControlCenter (code=exited, status=0/SUCCESS)
   Main PID: 534 (ControlCenter)
      Tasks: 2 (limit: 28606)
     Memory: 2.3M
        CPU: 149ms
     CGroup: /system.slice/omron-ups.service
             tq534 /usr/lib/PowerActPro/SlaveAgent/ControlCenter/ControlCenter
             mq582 /usr/lib/PowerActPro/SlaveAgent/Slave/SlaveAgent

 1月 16 16:16:37 TestDB systemd[1]: Starting omron-ups.service - Simple Shutdown Software...
 1月 16 16:16:37 TestDB systemd[1]: Started omron-ups.service - Simple Shutdown Software.

ストリーミングレプリケーション構築

postgres.conf 設定ファイル

最後尾に、以下を追記。ファイルの後の方にあるものが有効になる

# Change Default Settings

# From PGTune https://pgtune.leopard.in.ua/
# DB Version: 15
# OS Type: linux
# DB Type: oltp
# Total Memory (RAM): 64 GB
# CPUs num: 4
# Connections num: 400
# Data Storage: ssd

listen_addresses = '*'          # what IP address(es) to listen on;
#PostgreSQLに同時に接続できるクライアントの最大数。デフォルト値100。値を大きくするとメモリー使用量が増え、性能に影響する
max_connections = 400
#データベースサーバが共有メモリバッファのために使用するメモリ量を設定します。 デフォルトは一般的に128メガバイト
shared_buffers = 16GB
#単一の問い合わせで利用できるディスクキャッシュの実効容量に関するプランナの条件を設定します。 これは、インデックスを使用するコスト推定値の要素となります。 より高い値にすれば、よりインデックススキャンが使用されるようになり、より小さく設定すれば、シーケンシャルスキャンがより使用されるようになります。
effective_cache_size = 48GB
#VACUUM、CREATE INDEX、およびALTER TABLE ADD FOREIGN KEYの様な保守操作で使用されるメモリの最大容量を指定します。
maintenance_work_mem = 2GB
#チェックポイント間隔の割合(ページ書き出しの集中による入出力システムの溢れを防ぐために、チェックポイント期間のダーティバッファの書き出しは一定の期間に分散)
checkpoint_completion_target = 0.9
#高くすることで、各チェックポイントの直後の応答時間を滑らかにする
wal_buffers = 16MB
#デフォルトのまま100
default_statistics_target = 100
#非シーケンシャル的に取り出されるディスクページのコストに対するプランナの推測を設定します。デフォルトは4。小さくすると、システムはなるべくインデックススキャンを使用するようになる。
random_page_cost = 1.1
#設定値を上げるほどより多くのデータを非同期で読み込むようになります。
effective_io_concurrency = 200
#クエリ中の並び替えやハッシュテーブル操作など一部の操作で使用する最大メモリサイズ、一時的にメモリを使用するような一部のクエリで効果が見込める
work_mem = 20971kB
#主共有メモリ領域に対してhuge pageを要求するかどうかを管理、huge pageを使うと、ページテーブルが小さくなり、メモリ管理に使用されるCPU時間が少なくなり、性能が向上
huge_pages = try
#WALファイルの合計サイズの下限
min_wal_size = 2GB
#WALファイルの合計サイズの上限
max_wal_size = 8GB
#システムがサポートするバックグラウンドプロセスの最大数
max_worker_processes = 4
#1つの並行処理に対して起動できるワーカー数の最大値
max_parallel_workers_per_gather = 2
#パラレルクエリ操作用にシステムがサポートできる最大のワーカー数
max_parallel_workers = 4
#単一のユーティリティコマンドで使用されるパラレルワーカーの最大数
max_parallel_maintenance_workers = 2

# For logs
log_destination='stderr'
logging_collector='on'
log_statement='mod'
log_filename='postgresql-%Y-%m-%d.log’
log_line_prefix='[%t]%h %d %p[%l]'
log_rotation_age='1d'
log_rotation_size=800MB
log_min_error_statement=error
log_min_duration_statement=10000
log_directory='/var/local/pgsql/log'

現在の接続数確認方法

postgres=# SHOW max_connections;
 max_connections
-----------------
 400
(1 行)
postgres=# SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend' ;
 count
-------
     1
(1 行)

ここで同時接続数を確認し、最大接続数と比較して値の調整を行う

ユーザパスワードの調整

Linux postgresユーザのパスワード変更

# passwd postgres
新しい パスワード:
新しい パスワードを再入力してください:
passwd: パスワードは正しく更新されました

PostgresDB内 postgresユーザのパスワード変更

# su - postgres
postgres@MainDB:~$ psql
psql (15.3 (Debian 15.3-0+deb12u1))
"help"でヘルプを表示します。

postgres=# alter role postgres with password 'パスワード文字列';
ALTER ROLE

※ pg_hba.confで、どの端末からもパスワードなしでアクセスできるようにしておき、PgAdminでアクセスしてPostgresDB内のpostgresパスワードを変更する方法もある

例 192.168.11.0/24からパスワード無しでアクセス可能にする

host all all 192.168.11.0/24 trust 

DataBaseのデータ復元

データベースのバックアップ方法は、バックアップスクリプトの項を確認

データベースは事前に作成しておく

# su – postgres

postgres@MainDB:~$ psql
psql (15.5 (Debian 15.5-0+deb12u1))
"help"でヘルプを表示します。

postgres=# CREATE DATABASE database01;
CREATE DATABASE
postgres-# CREATE DATABASE database02;
CREATE DATABASE
\q →一度抜ける

→ユーザから先に復元するのがコツ
→psql で戻すのと、pg_restoreで戻すのは意味が違うので注意
/usr/lib/postgresql/15/bin/psql template1 < /home/postgres/2023-11-03.user

→Databaseを戻す
/usr/lib/postgresql/15/bin/pg_restore -U postgres -d database01 /home/postgres/2023-11-03.database01

/usr/lib/postgresql/15/bin/pg_restore -U postgres -d database02 /home/postgres/2023-11-03.database02

IPエイリアス

常時稼働しているサーバが、ダウンした時にスタンバイサーバをプライマリに昇格させる際に、IPエイリアスを用いて、実アドレスの変更なしで利用できるようにします。

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#allow-hotplug eno1
#iface eno1 inet dhcp

allow-hotplug eno1
iface eno1 inet static
        address 192.168.0.12/24
        gateway 192.168.0.254
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 8.8.8.8
        dns-search techlive.tokyo


post-up ip route add 192.168.20.0/24 via 192.168.0.1 dev eno1

post-up ip addr add 192.168.0.13/24 dev eno1

IPエイリアス反映確認

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 5c:ba:2c:5a:5a:78 brd ff:ff:ff:ff:ff:ff
    altname enp2s0f0
    inet 192.168.0.12/24 brd 192.168.0.255 scope global eno1
       valid_lft forever preferred_lft forever
    inet 192.168.0.13/24 scope global secondary eno1
       valid_lft forever preferred_lft forever
    inet6 fe80::5eba:2cff:fe5a:5a78/64 scope link
       valid_lft forever preferred_lft forever
3: eno2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 5c:ba:2c:5a:5a:79 brd ff:ff:ff:ff:ff:ff
    altname enp2s0f1

ルート反映確認

# ip route show
default via 192.168.0.254 dev eno1 onlink
192.168.0.0/24 dev eno1 proto kernel scope link src 192.168.0.12
192.168.20.0/24 via 192.168.0.1 dev eno1

違うセグメントからアクセスできない

IPエイリアスでサーバを変えても同じアドレスにするという構想なのですが、違うサーバに移行すると、同じセグメントからはアクセスできるのに、違うセグメントからはアクセスできないという事がおきました。

サーバA: IPアドレス 192.168.0.12,エイリアス192.168.0.13

サーバB: IPアドレス 192.168.0.17,エイリアス192.168.0.13

サーバBからAに入れ替えてアクセスできなくなり、AからBに入れ替えるとまたPINGが通るという状況で。

C:\Users\hana>ping -t 192.168.0.13

192.168.0.13 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
192.168.0.13 からの応答: バイト数 =32 時間 =7ms TTL=63 →元に戻した
192.168.0.13 からの応答: バイト数 =32 時間 =2ms TTL=63
192.168.0.13 からの応答: バイト数 =32 時間 =4ms TTL=63
192.168.0.13 からの応答: バイト数 =32 時間 =2ms TTL=63
192.168.0.13 からの応答: バイト数 =32 時間 =2ms TTL=63
192.168.0.13 からの応答: バイト数 =32 時間 =2ms TTL=63

同じセグメントのパソコンからだと即反映されるので、どこかでarpキャッシュを持っているやつがいるなぁと思いセグメントの境に設置してあるCisco L3で確認すると

>show arp
Internet  192.168.0.12            1   5cba.2c5a.aaaa  ARPA   Vlan11110
Internet  192.168.0.13           35   5cba.2c59.bbbb  ARPA   Vlan11110
Internet  192.168.0.17           10   5cba.2c59.bbbb  ARPA   Vlan11110

ここで、clear arp します

>clear arp

違うセグメントpingが通るようになり、arpテーブルを確認してみると

>show arp
Internet  192.168.0.12            0   5cba.2c5a.aaaa  ARPA   Vlan11110
Internet  192.168.0.13            0   5cba.2c5a.aaaa  ARPA   Vlan11110
Internet  192.168.0.17            0   5cba.2c59.bbbb  ARPA   Vlan11110

IPエイリアスでうまくアクセスできない場合、L3やルータなどで、arpキャッシュが残っているかもしれません。

備考 IPエイリアス設定では、元々設定していたMACアドレス同じMACアドレスで登録されます。物理的に同じNICに、2つIPアドレスを設定しているので、当たり前といえば当たり前ですね。

サーバ管理 iLO5

fstab chkdskが走らないようにする

長期間サーバを稼働し、メンテナンスで再起動した際に、自動的にchkdskが走って、1時間ほどサーバが起動しなくなるなどという事態が発生する事があるので、起動時に自動的にchkdskが走らないようにする。

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=bsvasd4-faa1-40c3-89c3-6llllsba8d /               ext4    errors=remount-ro 0       0

最後 <pass> を 0とする

※1だと、chkdskが走る

DBのバックアップスクリプト

Databaseを毎日バックアップするスクリプト

毎日このスクリプトを実行するのはCRONに登録する

echo "バックアップ実行"
TDAY=`date +%Y-%m-%d`
/usr/lib/postgresql/15/bin/pg_dumpall -p 5432 -g -U postgres > /var/local/pgsql/backup/$TDAY.group &
/usr/lib/postgresql/15/bin/pg_dump -p 5432 -U postgres  -F c -b -f "/var/local/pgsql/backup/$TDAY.testdb" -l testdb

#実行結果
ls /var/local/pgsql/backup/$TDAY*

#古いバックアップデータを削除
TMDAY1=`date -d '38 days ago' +%Y-%m-%d`
rm  /var/local/pgsql/backup/$TMDAY1*


#古いログファイルを削除
rm  /var/local/pgsql/log/postgresql-$TMDAY1

pg_dumpall オプション

pg_dumpall [connection-option…] [option…]

クラスタの全てのPostgreSQLデータベースを、1つのスクリプトファイルに書き出す(”ダンプする”)ためのユーティリティ

-g グローバルオブジェクト(ロールとテーブル空間)のみをダンプし、データベースのダンプを行いません。

-f 出力を指定したファイルに送ります。 これが省略されると標準出力が使用されます。

pg_dump オプション

Postgres データベースを スクリプトファイルに抽出する

pg_dump [connection-option…] [option…] [dbname]

-F c 出力形式を選択します。pg_restoreへの入力に適したカスタム形式アーカイブを出力します。

-b ラージオブジェクトをダンプに含めます。

-f 出力を指定のファイルに送ります。

ログファイル・バッチファイル置き場

ログやバックアップファイルを置く場所(自分で好きな場所を設定して構わない)

/var/local/pgsql

バッチファイルを置く場所

/usr/local/sbin/pg_bat

mkdir /var/local/pgsql
mkdir /var/local/pgsql/backup
mkdir /var/local/pgsql/log

chown -R postgres:postgres /var/local/pgsql
chmod -R 775 /var/local/pgsql

mkdir /usr/local/sbin/pg_bat
chown -R postgres:postgres /usr/local/sbin/pg_bat
chmod -R 775 /usr/local/sbin/pg_bat

pg_restoreする時

pg_dumpall にてログインロールをバックアップ、pg_dump にて、データベースをバックアップした時の注意

※ユーザ/ログインロール から復元する。でないと、データベースを復元した時に登録されていないユーザのアクセス権は戻らない

ユーザの復元はpsql を利用する。 pg_dumpall はSQLでバックアップファイルが作成される。

Linuxでのコマンドならこんな感じ

#su - postgres
$/usr/lib/postgresql/15/bin/psql -p 5432 template1 < /home/postgres/2023-11-03.group

※Windowsにインストールした Postgresをリストアする時

"C:\Program Files\PostgreSQL\15\bin\psql.exe" -p 5432 -U postgres template1 < C:\Users\hanako\Desktop\2023-11-22.group

データベースを復元する

#su - postgres
$ /usr/lib/postgresql/15/bin/pg_restore -p 5432 -U postgres -d majp /home/postgres/2023-11-03.majp

SSDが故障した時

RAID1でミラーリングしている場合、SSD1本に障害が発生した時の復元手順

プライマリ障害時にスタンバイをプライマリへ

ストリーミングレプリケーションしているサーバを復元する場合

バックアップファイルをスタンバイサーバに残す

sdbに増設したHDDのマウント方法

nfsでホストのハードディスクをマウントする

rsyncでバックアップする

タイトルとURLをコピーしました