2018年11月19日月曜日

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する① (準備・インストール編)

RHEL 7やCentOS 7では、サーバークラスターを実装するソフトウェアとして、Pacemaker + Corosyncによる実装が標準となっている。これらの機能は、CentOSでは当然無償で利用することができるが、RHELでは「High Availability Add-On」のサブスクリプション購入が必要となる。

Red Hat Enterprise Linux 7 向け High Availability Add-On のリファレンスドキュメント

Linux環境でクラスターを組んだことがなかったので、勉強がてらCentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化してみた。

実施内容がそこそこ多いので、今回含めて、全3回で記載することにする。
  1. 準備・インストール編
    Pacemaker・CorosyncおよびMariaDBをインストールし初期設定を行う。
  2. クラスター・リソース構成編
    クラスターを作成し、リソースの構成を行う。
  3. 障害試験編
    疑似障害を発生させて、フェイルオーバーの動作確認を行う。
それでは、まずは今回構成する環境からみていこう。

環境および用語

今回はESXi上に仮想マシンを2台作成し、クラスター構成にする。

  • ノード#1 ホスト名:t1113cent
  • ノード#2 ホスト名:t1114cent



PacemakerとCorosyncがクラスターの機能を提供する。それぞれの役割については、以下に他の用語と合わせて記載をする。
  • Pacemaker (ペースメーカー):クラスターのリソース制御(リソースの起動・監視・停止、フェイルオーバー等)を行う
  • Corosync (コロシンク):クラスターノード間の死活監視を行う。後述するSTONITHもCorosyncの機能
  • STONITH (ストニス):Shoot The Other Node In The Headの略。スプリットブレイン時に、複数ノードがActiveになることを防止する機能
  • スプリットブレイン:ネットワーク断によりクラスター間で相互に監視ができなくなり、どのノードがActiveで動作しているか不明となっている状況
  • リソース:クラスターが起動・監視・停止を制御する対象。たとえば、仮想IPアドレス、ディスクマウント、DBサービスなど多岐にわたる
  • リソースエージェント:起動・監視・停止を制御するためのスクリプト。クラスター管理ソフトウェアで用意されている
  • リソースグループ:複数のリソースエージェントをグループ化し、同一ノードで複数のリソースの起動・監視・停止を制御するためのもの
クラスター監視用のネットワークは、すべて切断されるとスプリットブレインとなってしまうため、2本の冗長構成とする。

共有ディスクはSCSIバスの共有を行い、同一のvmdkファイルを2台の仮想マシンからマウントできるように構成し、本ディスクにMariaDBのデータベースを配置する構成とする。

ESXi環境でSCSIバスの共有を行い、共有ディスクを作成

1. ノード#1側にSCSIコントローラーを追加

ESXiにてノード#1の仮想マシンの「設定の編集」を開き、「SCSIコントローラー」を追加する。


「SCSIバスの共有」で仮想または物理を選ぶ。同一のESXiに存在する仮想マシン間でディスクを共有したい場合は「仮想」を選び、複数のESXiをまたいでディスクを共有したい場合は「物理」を選べばよい。今回は、同一ESXiだったので「仮想」で設定した。


2. ノード#1側にディスクを追加

SCSIコントローラーを追加したら、続けて新規ハードディスクを作成する。ディスクを共有する場合は「シック プロビジョニング (Eager Zerod)」を選択する必要がある。「コントローラーの場所」は、先ほど作成した「SCSI コントローラ 1」を選択する。


3. ノード#2側にSCSIコントローラーを追加

もう一台のノード#2側に対しても、同様にSCSIコントローラーを追加する。「SCSIバスの共有」はノード#1と同様「仮想」を選択する。


4. ノード#2側にディスクを追加

新規ではなく「既存のハードディスク」にてディスクを追加する。


ディスク選択画面が表示されるので、ノード#1に作成した共有ディスクとして利用するvmdkファイルを選択する。


最後に、SCSIコントローラーを「SCSI コントローラ 1」に設定すれば完了。


以上で、共有ディスクの作成が完了となる。OS側でも確認すると、以下の通り両ノードでディスクのデバイスが見えていることがわかる。

※ノード#1で実施
# fdisk -l /dev/sdb
------------------------------
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
------------------------------

※ノード#2で実施
# fdisk -l /dev/sdb
------------------------------
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
------------------------------

今回は本題から外れるので詳細な手順は割愛するが、上記領域に適当にファイルシステムを作成し、ノード#1の/shareにマウントしておこう。

MariaDBのインストール・初期設定

1. MariaDBをインストール

yumでインストールするのが手っ取り早い。

※両ノードで実施
# yum install mariadb
# yum install mariadb-server

インストール後、状態を確認する。最終的にクラスターで起動・停止が制御されるため、現時点ではinactive / disabledになっていればよい。

※両ノードで実施
# systemctl status mariadb
------------------------------
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
------------------------------

2. 初期設定

MariaDBのデータベース保存先を/share/mysqlに変更するため、/etc/my.cnfに変更と追記を行う。

※両ノードで実施
# vi /etc/my.cnf
------------------------------
[mysqld]
#datadir=/var/lib/mysql           ←★コメントアウト
datadir=/share/mysql              ←★追加
#socket=/var/lib/mysql/mysql.sock ←★コメントアウト
socket=/share/mysql/mysql.sock    ←★追加

[client]                          ←★追加
socket=/share/mysql/mysql.sock    ←★追加
------------------------------

3. MariaDBを起動

設定完了後MariaDBを起動すると、以下の通りエラーとなった。

※ノード#1で実施
# systemctl start mariadb
------------------------------
Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.
------------------------------

SELinuxが悪さするようなので止めておく。

※両ノードで実施
# setenforce 0

再度起動させると、今度は成功するはず。

※ノード#1で実施
# systemctl start mariadb

4. データベース・テーブル作成

MariaDBの動作確認ができるようにデータベースとテーブルを作っておく。mysqlコマンドを用いて、rootユーザーでMariaDBにログインする。

※ノード#1で実施
# mysql -u root

データベースを作成する。

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> create database cluster_test;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cluster_test       | ←★作成された
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

続けてテーブルを作成する。

MariaDB [(none)]> use cluster_test;
Database changed

MariaDB [cluster_test]> show tables;
Empty set (0.00 sec)

MariaDB [cluster_test]> create table test_table(name varchar(20));
Query OK, 0 rows affected (0.00 sec)

MariaDB [cluster_test]> show tables;
+------------------------+
| Tables_in_cluster_test |
+------------------------+
| test_table             | ←★作成された
+------------------------+
1 row in set (0.00 sec)

作成したテーブルに1行追加してみる。

MariaDB [cluster_test]> insert into test_table value('hoge');
Query OK, 1 row affected (0.00 sec)

MariaDB [cluster_test]> select * from test_table;
+------+
| name |
+------+
| hoge | ←★追加された
+------+
1 row in set (0.00 sec)

以上でMariaDBの準備が整った。

Pacemaker・Corosyncのインストール・初期設定

1. Pacemaker・Corosyncをインストール

yumでインストールする。

※両ノードで実施
# yum install pacemaker
# yum install pcs
# yum install fence-agents-all


2. 初期設定

クラスター用ユーザーを設定する。yumでインストールすると、「hacluster」ユーザーが作成されているはずなので確認する。

※両ノードで実施
# cat /etc/passwd | tail
------------------------------
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
hacluster:x:189:189:cluster user:/home/hacluster:/sbin/nologin ←★クラスター用ユーザー
unbound:x:997:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
------------------------------

パスワードを設定しておく。当然、両ノードで同一のパスワードで設定しておくこと。

※両ノードで実施
# passwd hacluster
------------------------------
ユーザー hacluster のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
------------------------------

ここで、Pacemakerのサービスを起動させる。

※両ノードで実施
# systemctl start pcsd.service
# systemctl enable pcsd.service

起動後の状態を確認し、エラーなくacitive / enabledとなっていればOK。

※両ノードで実施
# systemctl status pcsd.service
------------------------------
● pcsd.service - PCS GUI and remote configuration interface
   Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset: disabled)
   Active: active (running) since 木 2018-08-30 10:28:07 JST; 2min 13s ago
     Docs: man:pcsd(8)
           man:pcs(8)
 Main PID: 2004 (pcsd)
   CGroup: /system.slice/pcsd.service
           mq2004 /usr/bin/ruby /usr/lib/pcsd/pcsd > /dev/null &

 8月 30 10:28:01 t1113cent systemd[1]: Starting PCS GUI and remote configur....
 8月 30 10:28:07 t1113cent systemd[1]: Started PCS GUI and remote configura....
Hint: Some lines were ellipsized, use -l to show in full.
------------------------------

クラスターを組む際に名前解決できるように、hostsにお互いのIPアドレスを登録しておく。

※両ノードで実施
# vi /etc/hosts
------------------------------
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.11.113  t1113cent    ←★追加
192.168.55.113  t1113cent-55 ←★追加
192.168.11.114  t1114cent    ←★追加
192.168.55.114  t1114cent-55 ←★追加
------------------------------

クラスターに参加するノードの認証を行う。。。が、失敗してしまった。

※片方のノードで実施
# pcs cluster auth t1113cent t1114cent
------------------------------
Username: hacluster
Password:
Error: Unable to communicate with t1114cent ←★失敗。。。
t1113cent: Authorized
------------------------------

どうやらfirewalldが原因のようなので止めておく。

※両ノードで実施
# systemctl stop firewalld
# systemctl disable firewalld

再度ノードの認証を行うと成功した。

※片方のノードで実施
# pcs cluster auth t1113cent t1114cent
------------------------------
Username: hacluster
Password:
t1114cent: Authorized
t1113cent: Authorized
------------------------------

次回予告

これで準備がようやく終わり、次から本題のクラスター構成作業に進むのだが、長くなってしまったので続きは次回とする。

★次回はこちら↓

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する② (クラスター・リソース構成編)

CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する③ (障害試験編)
https://tech-mmmm.blogspot.com/2018/12/centos-7-pacemaker-corosyncmariadb.html

0 件のコメント:

コメントを投稿

人気の投稿