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回で記載することにする。
- 準備・インストール編
Pacemaker・CorosyncおよびMariaDBをインストールし初期設定を行う。 - クラスター・リソース構成編
クラスターを作成し、リソースの構成を行う。 - 障害試験編
疑似障害を発生させて、フェイルオーバーの動作確認を行う。
それでは、まずは今回構成する環境からみていこう。
環境および用語
今回はESXi上に仮想マシンを2台作成し、クラスター構成にする。
PacemakerとCorosyncがクラスターの機能を提供する。それぞれの役割については、以下に他の用語と合わせて記載をする。
- ノード#1 ホスト名:t1113cent
- ノード#2 ホスト名:t1114cent
PacemakerとCorosyncがクラスターの機能を提供する。それぞれの役割については、以下に他の用語と合わせて記載をする。
- Pacemaker (ペースメーカー):クラスターのリソース制御(リソースの起動・監視・停止、フェイルオーバー等)を行う
- Corosync (コロシンク):クラスターノード間の死活監視を行う。後述するSTONITHもCorosyncの機能
- STONITH (ストニス):Shoot The Other Node In The Headの略。スプリットブレイン時に、複数ノードがActiveになることを防止する機能
- スプリットブレイン:ネットワーク断によりクラスター間で相互に監視ができなくなり、どのノードがActiveで動作しているか不明となっている状況
- リソース:クラスターが起動・監視・停止を制御する対象。たとえば、仮想IPアドレス、ディスクマウント、DBサービスなど多岐にわたる
- リソースエージェント:起動・監視・停止を制御するためのスクリプト。クラスター管理ソフトウェアで用意されている
- リソースグループ:複数のリソースエージェントをグループ化し、同一ノードで複数のリソースの起動・監視・停止を制御するためのもの
共有ディスクは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)
※ノード#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
# yum install fence-agents-all
2. 初期設定
クラスター用ユーザーを設定する。yumでインストールすると、「hacluster」ユーザーが作成されているはずなので確認する。
※両ノードで実施
# cat /etc/passwd | tail
# 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
# passwd hacluster
------------------------------
ユーザー hacluster のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
------------------------------
ここで、Pacemakerのサービスを起動させる。
※両ノードで実施
# systemctl start pcsd.service
# systemctl start pcsd.service
# systemctl enable pcsd.service
起動後の状態を確認し、エラーなくacitive / enabledとなっていればOK。
起動後の状態を確認し、エラーなく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アドレスを登録しておく。
クラスターを組む際に名前解決できるように、hostsにお互いのIPアドレスを登録しておく。
※両ノードで実施
# vi /etc/hosts
# 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
------------------------------
# pcs cluster auth t1113cent t1114cent
------------------------------
Username: hacluster
Password:
Error: Unable to communicate with t1114cent ←★失敗。。。
t1113cent: Authorized
------------------------------
どうやらfirewalldが原因のようなので止めておく。
※両ノードで実施
どうやら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をクラスター化する② (クラスター・リソース構成編)
CentOS 7 + Pacemaker + CorosyncでMariaDBをクラスター化する③ (障害試験編)
https://tech-mmmm.blogspot.com/2018/12/centos-7-pacemaker-corosyncmariadb.html
0 件のコメント:
コメントを投稿