クラスタ環境を作った際にハマったこと2

おつかれさまです!Dです。

前回もクラスター構成(PacemakerやDRBD)についての記事を書いたのですが、書ききれなかったので今回はパート2です。

またまた、その際にハマってしまったことを備忘録として残しておきます。

内容

OSは前回同様にRHEL8で2台構成でマスター、スレーブ構成になります。

マスターがダウンすると、スレーブ側がマスターに切り替わって
サービスを引き継いてダウンタイムを減らすといったイメージになります。

構築時はMariaDB10.3をPacemakerのリソースに登録して冗長構成を構成したのですが、MySQL8.0をインストールした場合、うまくpcs経由で立ち上がらない事象がありました。

その際の「pcs status 」コマンドで確認した内容は以下です。
MySQL8.0を登録しているリソース名をmariadbにしてるのでややこしいのですが、failしていることが確認できます。(後からリソース名も変更すればよかったと思いました。。)

# pcs status
---------------------------------------------------------------
Cluster name: db_cluster
Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: db2 (version 2.1.6-8.el8-6fdc9deea29) - partition with quorum
  * Last updated: Wed Nov 22 20:01:18 2023 on db1
  * Last change:  Wed Nov 22 20:00:57 2023 by hacluster via crmd on db1
  * 2 nodes configured
  * 3 resource instances configured

Node List:
  * Online: [ db1 db2 ]

Full List of Resources:
  * Resource Group: db-ha:
    * filesystem        (ocf::heartbeat:Filesystem):     Started db1
    * mariadb   (ocf::heartbeat:mysql):  Stopped
    * virtual_ip        (ocf::heartbeat:IPaddr2):        Stopped

Failed Resource Actions:
  * mariadb_start_0 on db2 'not installed' (5): call=23, status='complete', exitreason='Setup problem: couldn't find command: /usr/bin/mysqld_safe', last-rc-change='Wed Nov 22 20:00:57 2023', queued=0ms, exec=69ms
  * mariadb_start_0 on db1 'not installed' (5): call=27, status='complete', exitreason='Setup problem: couldn't find command: /usr/bin/mysqld_safe', last-rc-change='Wed Nov 22 20:00:59 2023', queued=0ms, exec=84ms

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

前回同様「Full List of Resources」部分が失敗してて激萎えですね。
何はともあれ「/var/log/masseges」のログを見てみます。

----------------------------------
mysql(mariadb)[805881]: ERROR: Setup problem: couldn't find command: /usr/bin/mysqld_safe
----------------------------------

なんか起動時に利用されるファイルが見つからないってエラーが出てるようです。

とりあえずほんとに無いのか確認してみると。。。ないですね。。

# ls -la /usr/bin/mysqld_safe
ls: cannot access '/usr/bin/mysqld_safe': No such file or directory

結論から言うとMySQL8.0とMariaDB10.3はそこまで変わらないと思い込んでいたのですが、起動ファイルが違ったり、PIDファイルの場所が違ったりするので、違う点ををpacemakerのリソースに反映させてやる必要がありました。

MySQL8の起動ファイルを探していきます。
MySQL8のステータスを確認して、ロードしているサービスファイルから確認します。(Loadedの部分)

# systemctl status mysqld
---------------------------------------------------------
* mysqld.service - MySQL 8.0 database server

   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

サービスファイルの中身を見てみます。

# less /usr/lib/systemd/system/mysqld.service
※いろいろ書いてあるので抜粋しています。


----------------------------------------

ExecStart=/usr/libexec/mysqld --basedir=/usr

----------------------------------------

サービス起動時に実行しているファイルは上記になるので、こちらを指定する必要があります。
また、PIDファイルの場所は「/etc/my.cnf.d/mysql-server.cnf」に記載があり
「/run/mysqld/mysqld.pid」のパスを指定する必要があるそうです。


# cat /etc/my.cnf.d/mysql-server.cnf
-----------------------------------------
#
# This group are read by MySQL server.
# Use it for options that only the server (but not clients) should see
#
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/en/server-configuration-defaults.html

# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
-----------------------------------------

まとめるとMySQL8ではPacemakerのMySQL8制御用リソース起動設定を変更する必要があるので変更していく。

まずは現在のPacemakerリソース設定を確認。


※リソース全部表示される。
# pcs config show

------------------------------------------------------
Cluster Name: db_cluster
Corosync Nodes:
 db1 db2
Pacemaker Nodes:
 db1 db2

Resources:
  Group: db-ha
    Resource: filesystem (class=ocf provider=heartbeat type=Filesystem)
      Attributes: filesystem-instance_attributes
        device=/dev/drbd0
        directory=/data
        fstype=xfs
      Operations:
        monitor: filesystem-monitor-interval-20
          interval=20
          timeout=40
        start: filesystem-start-interval-0
          interval=0
          timeout=60
        stop: filesystem-stop-interval-0
          interval=0
          timeout=60
    Resource: mariadb (class=ocf provider=heartbeat type=mysql)
      Attributes: mariadb-instance_attributes
        binary=/usr/bin/mysqld_safe
        pid=/var/lib/mysql/Rhel8.pid
      Operations:
        demote: mariadb-demote-interval-0s
          interval=0s
          timeout=120s
        monitor: mariadb-monitor-interval-10
          interval=10
          timeout=30
        notify: mariadb-notify-interval-0s
          interval=0s
          timeout=90s
        promote: mariadb-promote-interval-0s
          interval=0s
          timeout=120s
        start: mariadb-start-interval-0
          interval=0
          timeout=120
        stop: mariadb-stop-interval-0
          interval=0
          timeout=120
    Resource: virtual_ip (class=ocf provider=heartbeat type=IPaddr2)
      Attributes: virtual_ip-instance_attributes
        cidr_netmask=24
        ip=192.168.230.187
      Operations:
        monitor: virtual_ip-monitor-interval-10
          interval=10
          timeout=20
        start: virtual_ip-start-interval-0
          interval=0
          timeout=20
        stop: virtual_ip-stop-interval-0
          interval=0
          timeout=20

Stonith Devices:
Fencing Levels:

Location Constraints:
  Resource: db-ha
    Enabled on:
      Node: db1 (score:100) (id:location-db-ha-db1-100)
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

Alerts:
 No alerts defined

Resources Defaults:
  Meta Attrs: rsc_defaults-meta_attributes
    migration-threshold=1
    resource-stickiness=200
Operations Defaults:
  No defaults set

Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: db_cluster
 dc-version: 2.1.6-8.el8-6fdc9deea29
 have-watchdog: false
 last-lrm-refresh: 1700650857
 no-quorum-policy: ignore
 stonith-enabled: false

Tags:
 No tags defined

Quorum:
  Options:
------------------------------------------------------

後から知りましたが、個々のリソースを確認したい場合は
「pcs resource config」の引数にリソース名を指定すれば確認可能でした....


# pcs resource config mariadb

----------------------------------------------
Resource: mariadb (class=ocf provider=heartbeat type=mysql)
  Attributes: mariadb-instance_attributes
    binary=/usr/bin/mysqld_safe
    pid=/var/lib/mysql/Rhel8.pid
  Operations:
    demote: mariadb-demote-interval-0s
      interval=0s
      timeout=120s
    monitor: mariadb-monitor-interval-10
      interval=10
      timeout=30
    notify: mariadb-notify-interval-0s
      interval=0s
      timeout=90s
    promote: mariadb-promote-interval-0s
      interval=0s
      timeout=120s
    start: mariadb-start-interval-0
      interval=0
      timeout=120
    stop: mariadb-stop-interval-0
      interval=0
      timeout=120
----------------------------------------------

この部分がMySQL8では差異があるので、アップデートしていきます。

----------------------------------------------
    binary=/usr/bin/mysqld_safe
    pid=/var/lib/mysql/Rhel8.pid
----------------------------------------------

リソース設定値の変更は以下コマンドで反映します。

# pcs resource update mariadb binary=/usr/libexec/mysqld
# pcs resource update mariadb pid=/run/mysqld/mysqld.pid

設定確認すると変更されているのが分かります。

# pcs resource config mariadb

---------------------------------------------------
Resource: mariadb (class=ocf provider=heartbeat type=mysql)
  Attributes: mariadb-instance_attributes
    binary=/usr/libexec/mysqld
    pid=/run/mysqld/mysqld.pid
  Operations:
    demote: mariadb-demote-interval-0s
      interval=0s
      timeout=120s
    monitor: mariadb-monitor-interval-10
      interval=10
      timeout=30
    notify: mariadb-notify-interval-0s
      interval=0s
      timeout=90s
    promote: mariadb-promote-interval-0s
      interval=0s
      timeout=120s
    start: mariadb-start-interval-0
      interval=0
      timeout=120
    stop: mariadb-stop-interval-0
      interval=0
      timeout=120
---------------------------------------------------

設定変更出来たので一旦失敗したリソースをリセットします。


# pcs resource cleanup

起動を確認します。無事に立ち上がりましたね。。

# pcs status
---------------------------------------------------
Cluster name: db_cluster
Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: db1 (version 2.1.6-8.el8-6fdc9deea29) - partition with quorum
  * Last updated: Thu Nov 23 16:54:43 2023 on db1
  * Last change:  Thu Nov 23 16:54:26 2023 by root via cibadmin on db1
  * 2 nodes configured
  * 3 resource instances configured

Node List:
  * Online: [ db1 db2 ]

Full List of Resources:
  * Resource Group: db-ha:
    * filesystem        (ocf::heartbeat:Filesystem):     Started db1
    * mariadb   (ocf::heartbeat:mysql):  Started db1
    * virtual_ip        (ocf::heartbeat:IPaddr2):        Started db1

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

念のためスレーブにフェイルオーバーしても同じDBが見れるか確認していきます。

適当なテストDB(test)を作成。


-------------------------------------------------------
mysql> create database test;
Query OK, 1 row affected (0.06 sec)


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
-------------------------------------------------------

フェイルオーバーさせるために1号機再起動して、2号機のステータスを確認します。起動は問題無さそうですね。

# pcs status
-------------------------------------------------------
Cluster name: db_cluster
Cluster Summary:
  * Stack: corosync (Pacemaker is running)
  * Current DC: db2 (version 2.1.6-8.el8-6fdc9deea29) - partition with quorum
  * Last updated: Thu Nov 23 17:04:30 2023 on db2
  * Last change:  Thu Nov 23 16:54:26 2023 by root via cibadmin on db1
  * 2 nodes configured
  * 3 resource instances configured

Node List:
  * Online: [ db2 ]
  * OFFLINE: [ db1 ]

Full List of Resources:
  * Resource Group: db-ha:
    * filesystem        (ocf::heartbeat:Filesystem):     Started db2
    * mariadb   (ocf::heartbeat:mysql):  Started db2
    * virtual_ip        (ocf::heartbeat:IPaddr2):        Started db2

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

2号機にて同じtestDBが存在することを確認。


# mysql -u root 
-------------------------------------------------------
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
-------------------------------------------------------

ちゃんと先ほど作成したテストDBが存在しますね。成功です!

【まとめ】

今回はMariadb10.3をMySQL8.0に置き換えてハマりましたが、OSのリプレイス等でミドルウェアのバージョンが上がることで少しパラメータが変わる場合もあるかと思うので、きちんと実際の値を確認しながら進めることが大事かと思いました。