忍者ブログ

ブランクがあるインフラエンジニアの備忘録

サーバ構築のメモ

PostgreSQLサーバー構築

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PostgreSQLサーバー構築

◇本稿の構成。
 次稿ではストリーミング・レプリケーション方式を実装し、冗長化する予定ですが、取り敢えず本稿では単体でPostgreSQLサーバーの構築を行います。
〇db1サーバー
・ホスト名:db1.stream.server
・アドレス:192.168.128.91/24
・DNS:192.168.128.101
・ゲートウェイ:192.168.128.1
〇DNSサーバー
・ホスト名:host1.stream.server
・アドレス:192.168.128.101/24
・DNS:192.168.128.101
・ゲートウェイ:192.168.128.1
◇DNSサーバーの追加設定
・DNSサーバーの正引きゾーンファイルの設定追加。
 末尾にdb1を追記します。なお、IPアドレスが降順ではないので、見栄えが気になるのであればhost1の上に記述しても構いません。
[root@host1 ~]# cp -p /var/named/stream.server.zone{,.20230131}
[root@host1 ~]# vi /var/named/stream.server.zone
$TTL 86400
@       IN SOA  host1.stream.server. root.stream.server. (
           0       ; serial
           1D      ; refresh
           1H      ; retry
           1W      ; expire
           3H )    ; minimum
   IN      NS      host1.stream.server.
   IN      MX      10      mail1.stream.server.
   IN      MX      20      mail2.stream.server.
host1   IN      A       192.168.128.101
host2   IN      A       192.168.128.102
mail1   IN      A       192.168.128.101
mail2   IN      A       192.168.128.102
web1   IN      A       192.168.128.100
nginx1  IN      A       192.168.128.103
nginx2  IN      A       192.168.128.103
db1   IN      A       192.168.128.91
・DNSサーバーの逆引きファイルを追加
 db1.stream.server.を追記します。
[root@host1 ~]# cp -p /var/named/128.168.192.in-addr.arpa.zone{,.20230131}
[root@host1 ~]# vi /var/named/128.168.192.in-addr.arpa.zone
$TTL 86400
@       IN SOA  host1.stream.server. root.stream.server. (
           0       ; serial
           1D      ; refresh
           1H      ; retry
           1W      ; expire
           3H )    ; minimum
   IN      NS      host1.stream.server.
   IN      A       255.255.255.0
101     IN      PTR     host1.stream.server.
102     IN      PTR     host2.stream.server.
101     IN      PTR     mail1.stream.server.
102     IN      PTR     mail2.stream.server.
100     IN      PTR     web1.stream.server.
103     IN      PTR     nginx1.stream.server.
103     IN      PTR     nginx2.stream.server.
91      IN      PTR     db1.stream.server.
[root@host1 ~]# named-checkconf -z
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
zone stream.server/IN: loaded serial 0
zone 128.168.192.in-addr.arpa/IN: loaded serial 0
[root@host1 ~]# systemctl reload named-chroot.service
[root@host1 ~]# systemctl is-active named-chroot.service
active
◇db1サーバにPostgreSQLインストール
 db1サーバにPostgreSQLをインストールします。
[root@db1 ~]# dnf install postgresql-server -y
(中略)
================================================================================
 パッケージ                   Arch        バージョン       リポジトリー   サイズ
================================================================================
インストール:
 postgresql-server            x86_64      13.7-1.el9       appstream      5.8 M
依存関係のインストール:
 postgresql                   x86_64      13.7-1.el9       appstream      1.6 M
 postgresql-private-libs      x86_64      13.7-1.el9       appstream      137 k
トランザクションの概要
================================================================================
インストール  3 パッケージ
ダウンロードサイズの合計: 7.5 M
インストール後のサイズ: 29 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/3): postgresql-private-libs-13.7-1.el9.x86_6  45 kB/s | 137 kB     00:03
(2/3): postgresql-13.7-1.el9.x86_64.rpm         267 kB/s | 1.6 MB     00:06
(3/3): postgresql-server-13.7-1.el9.x86_64.rpm  454 kB/s | 5.8 MB     00:13
(中略)
インストール済み:
  postgresql-13.7-1.el9.x86_64        postgresql-private-libs-13.7-1.el9.x86_64
  postgresql-server-13.7-1.el9.x86_64
完了しました!
◇データベースクラスターの初期化
 サービスを開始する前にデータベースクラスターを必ず初期化します。この操作はroot権限で一度だけ実施します。
[root@db1 ~]# postgresql-setup --initdb --unit postgresql
 * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
◇サービスの起動設定
 postgresqlの起動及び自動起動を設定し、サービスの起動を確認します。
[root@db1 ~]# systemctl enable postgresql --now
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service  → /usr/lib/systemd/system/postgresql.service.
[root@db1 ~]# systemctl is-active postgresql.service
active
◇firewalldの設定
 postgresqlのサービスを受け付けるようにfirewalldを設定します。
[root@db1 ~]# firewall-cmd --add-service=postgresql
success
[root@db1 ~]# firewall-cmd --runtime-to-permanent
success
 
◇最大接続数の設定、及び自ホスト以外からの接続の設定
 検証なので最大接続数が足りなくなるという事は無いですが、本番環境を想定して最大接続数を増やす設定を行ってみます。また、初期設定ではサービスを受け付けるアドレスが自ホスト(localhost)のみとなっているので、全てのIPアドレスに紐づけ出来るように設定を変更します。
[root@db1 ~]# cp -p /var/lib/pgsql/data/postgresql.conf{,.20230131}
[root@db1 ~]# vi /var/lib/pgsql/data/postgresql.conf
(中略)
#listen_addresses = 'localhost'         # what IP address(es) to listen on; ←この行を以下に変更します
listen_addresses = '*' 
(中略)
#max_connections = 100                  # (change requires restart) ←下行を100から200に変更しクライアント接続数を増やす。
max_connections = 200                   # (change requires restart)
 また、pg_hba.confの設定を変更し、他のホストからの接続を可能にします。
[root@db1 ~]# cp -p /var/lib/pgsql/data/pg_hba.conf{,.20230131}
[root@db1 ~]# vi /var/lib/pgsql/data/pg_hba.conf
(中略)
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
host    all             all             192.168.128.0/24        md5 ←この行を追記
 上記設定後、必ずサービスを再起動します。
[root@db1 ~]# systemctl restart postgresql
[root@db1 ~]# systemctl status postgresql
● postgresql.service - PostgreSQL database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; prese>
     Active: active (running) since Tue 2023-01-31 19:17:54 JST; 8s ago
    Process: 3746 ExecStartPre=/usr/libexec/postgresql-check-db-dir postgresql >
   Main PID: 3749 (postmaster)
(略)
 ポート5432が開いている事を確認します。
[root@db1 ~]# ss -lnt | grep 5432
LISTEN 0      244          0.0.0.0:5432      0.0.0.0:*
LISTEN 0      244             [::]:5432         [::]:*
 正常起動を確認後、PostgreSQLへ接続します。
 なお、上記で127.0.0.1と表示されている場合はローカルホストからの接続しか許可されていないので、次稿で行うストリーミング・レプリケーションが行えない為、設定を忘れていないか見直して下さい。
◇PostgreSQLへの接続
 インストール後に自動的にPostgreSQLの管理者ユーザーである「postgres」がシステムユーザーとして作成されます。このユーザーを使用してPostgreSQLへ接続します。
[root@db1 ~]# sudo -i -u postgres psql
psql (13.7)
"help"でヘルプを表示します。
postgres=#    ←表示が切り替わる
 上記に表示切替後「\c」で接続します。
postgres=# \c
データベース"postgres"にユーザ"postgres"として接続しました。
 接続を確認出来たら、一旦「\q」で切断します。
postgres=# \q
[root@db1 ~]#  ←表示が切り替わる
◇ユーザー作成と簡単なテスト。
 接続が出来ましたら引き続き、簡単なテストを行っていきます。
 SQLに関しては詳しく触れず、取り敢えず動いているのを確認すると言った程度ですがご了承ください。
①PostgreSQLのユーザーを追加
 postgresのアカウントでPostgreSQLのユーザーを追加します。
[root@db1 ~]# sudo -i -u postgres
[postgres@db1 ~]$ createuser --pwprompt pguser1
新しいロールのためのパスワード:
もう一度入力してください:
 また、--superuserオプションを付ける事で管理者権限を持つPostgreSQLのユーザーを作成できます。
[postgres@db1 ~]$ createuser --pwprompt pgadmin --superuser
新しいロールのためのパスワード:
もう一度入力してください:
 作成したユーザーは\duコマンドで属性を確認出来ます。
[postgres@db1 ~]$ psql
psql (13.7)
"help"でヘルプを表示します。
postgres=# \du
                                             ロール一覧
 ロール名 |                                   属性
     | 所属グループ
----------+---------------------------------------------------------------------
-----+--------------
 pgadmin  | スーパユーザ, ロール作成可, DB作成可
     | {}
 pguser1  |
     | {}
 postgres | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイ
パス | {}
postgres=# \q
[root@db1 ~]#
②データベースの作成。
 本稿では作者の趣味である上代文献の巻数を使って極々簡単なデータベースを作成してみます。
 具体的には以下のデータベースを作成してみます。
1.古事記 3巻
2.日本書紀 30巻
3.先代旧事本紀 10巻
[root@db1 ~]# sudo -i -u postgres
[postgres@db1 ~]$ createdb joudai
[postgres@db1 ~]$ psql joudai
psql (13.7)
"help"でヘルプを表示します。
joudai=# CREATE TABLE ancient
joudai-# (ancient_id integer,
joudai(# ancient_name text,
joudai(# turns integer);
CREATE TABLE
joudai=# INSERT INTO ancient(ancient_id,ancient_name,turns) VALUES
joudai-# (1,' 古事記',3),
joudai-# (2,' 日本書紀',30),
joudai-# (3,'先代旧事本紀',10);
INSERT 0 3
 以下のコマンドで作成したデータベースを確認します。
joudai=# SELECT * FROM ancient;
 ancient_id | ancient_name | turns
------------+--------------+-------
          1 |  古事記      |     3
          2 |  日本書紀    |    30
          3 | 先代旧事本紀 |    10
(3 行)
joudai=# \q
[postgres@db1 ~]$ 
③PostgreSQLのユーザーへの権限の付与
 PostgreSQLへ接続し、GRANT コマンドで①で作成したPostgreSQLユーザーに②で作成したデータベース(joudai)の権限を付与します。
[postgres@db1 ~]$ psql
psql (13.7)
"help"でヘルプを表示します。
postgres=# GRANT ALL PRIVILEGES ON DATABASE joudai TO pguser1 ;
GRANT
postgres=# GRANT ALL PRIVILEGES ON DATABASE joudai TO pgadmin ;
GRANT
postgres=# \q
[postgres@db1 ~]$
④データベースのバックアップ
 pg_dumpallコマンドで全てのデータベースのバックアップを行います。バックアップの拡張子は[.sql]を指定してください。
[postgres@db1 ~]$ pg_dumpall -f backups/pg_dumpall.sql
 あるいは特定のデータベースのバックアップを行いたい場合は以下の様にpg_dumpコマンドを実行します。
 ②で作成したjoudaiのバックアップを行う場合、以下のコマンドを実行します。バックアップの拡張子は[.sql]を指定してください。
[postgres@db1 ~]$ pg_dump joudai -f backups/joudai.sql
⑤データベースの削除
 dropdbコマンドでデータベースの削除をします。以下の例では②で作成したjoudaiを削除します。
[postgres@db1 ~]$ dropdb joudai
[postgres@db1 ~]$ psql -l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |
 アクセス権限
-----------+----------+------------------+-------------+-------------------+----
-------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/
postgres          +
           |          |                  |             |                   | pos
tgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/
postgres          +
           |          |                  |             |                   | pos
tgres=CTc/postgres
(3 行)
 ②で作成したjoudaiが削除されている事を確認します。
⑥データベースの復元
 データベース復元前に削除したテーブル(joudai)を作成し、④で取得したバックアップからデータベースを復元します。
[postgres@db1 ~]$ createdb joudai
 なお、この状態ではjoudaiテーブルが再び作成されただけで、当然ながらデータは復元出来ていません。ご参考までに、リストア前に確認すると以下の様になります。(ここの作業は飛ばしても良いです。リストアから行って下さい)
[postgres@db1 ~]$ psql joudai
psql (13.7)
"help"でヘルプを表示します。
joudai=# SELECT * FROM ancient;
ERROR:  リレーション"ancient"は存在しません
行 1: SELECT * FROM ancient;
joudai=# \q
[postgres@db1 ~]$
 その為、joudaiテーブルにバックアップデータのリストアを実施します。
[postgres@db1 ~]$ psql joudai -f backups/joudai.sql
SET
SET
SET
SET
SET
 set_config
------------
(1 行)
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
COPY 3
 ③で作成したdatabase1が復元されている事を確認します。
[postgres@db1 ~]$ psql -l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |
 アクセス権限
-----------+----------+------------------+-------------+-------------------+----
-------------------
 joudai    | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/
postgres          +
           |          |                  |             |                   | pos
tgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/
postgres          +
           |          |                  |             |                   | pos
tgres=CTc/postgres
(4 行)
 上記でjoudai復元されているので、実際にデータベースに接続して確認しましょう。
[postgres@db1 ~]$ psql joudai
psql (13.7)
"help"でヘルプを表示します。
joudai=# SELECT * FROM ancient;
 ancient_id | ancient_name | turns
------------+--------------+-------
          1 |  古事記      |     3
          2 |  日本書紀    |    30
          3 | 先代旧事本紀 |    10
(3 行)
 データが復元している事を確認出来たのでデータベースから切断します。
joudai=# \q
[postgres@db1 ~]$
 以上でサーバー単体によるPostgreSQLサーバーの構築に成功しました。
 次稿では障害時に備え、もう一台サーバーを立てて、ストリーミングレプリケーションの設定を行います。
PR

コメント

プロフィール

HN:
のらくら
性別:
非公開
自己紹介:
介護と自身の手術でブランクが出来たインフラエンジニアの学習メモ。VirtualBOXで仮想サーバーを建て、GNS3でCiscoルーター&スイッチによるネットワークのエミュレーションもしています。GNS3ネットワーク内に仮想サーバーと連携させて、実際のネットワーク環境におけるサーバーをシミュレートする他、LinuC level3 300の対策もしています。

P R