Contents
ElasticsearchのDB保存先がストレージサーバ2台しかない時にどうしようかと思いPacemaker + DRBDで冗長構成のNFSストレージサーバを作って問題無くElasticsearchのDBが保存されるか検証してみました。
TL;TD
- Elasticsearchのクラスタは最低3台以上で組まなくてはいけないですが、DBを保存するストレージサーバが2台しかない場合、DRBDとPacemakerを使ってネットワークミラーリングをするストレージクラスタを構築し使用することにします。
- ElasticsearchはNFSをマウントしてDBを保存する事としますが、障害時に切り替わった場合スイッチした側のNFSサーバへ自動でマウントするようにします。
- ようは、ElasticsearchのDBを保存するストレージサーバが2台しかない時の力技対処法です。
環境
項目 | バージョン |
---|---|
OS | CentOS 7.5 |
drbd | 9系 |
pacemaker | 1.1.19-8.el7_6.1 |
pcs | 0.9.165-6.el7 |
構成図
ホスト名 | 役割 |
---|---|
drbd0 | DRBDでストレージを同期しPacemakerで冗長化されたNFSサーバ |
drbd1 | DRBDでストレージを同期しPacemakerで冗長化されたNFSサーバ |
elaskibana | ElasticsearchとKibanaがインストールされたホスト |
logstash | Logstashがインストールされたホスト |
前提条件
動作確認が目的のためセキュリティは意識しません。
- firewalldは無効化しています。
- SELinuxは無効化しています。
- hostsに以下の設定がしてあることを前提とします。
1 2 3 |
192.168.100.1 drbd0 192.168.100.2 drbd1 |
同期パーティション作成
ElasticsearchのDBを保存するためのパーティションを作成します。
ここでは /dev/sdb1
を作成します。
以下の手順を drbd0
と drbd1
で実施してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[root@drbd0 ~]# fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x4fb66ee1. コマンド (m でヘルプ): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p パーティション番号 (1-4, default 1): 1 最初 sector (2048-67108863, 初期値 2048): 初期値 2048 を使います Last sector, +sectors or +size{K,M,G} (2048-67108863, 初期値 67108863): 初期値 67108863 を使います Partition 1 of type Linux and of size 32 GiB is set コマンド (m でヘルプ): w パーティションテーブルは変更されました! ioctl() を呼び出してパーティションテーブルを再読込みします。 ディスクを同期しています。 |
DRBDインストール・設定・起動
DRBDのインストールをします。
以下の手順でRPM化したDRBDを使用します。
DRBDインストール
drbd0
drbd1
に対してDRBD関連パッケージをインストールします。
1 2 3 |
[root@drbd0 drbd9-rpm]# rpm -ivh kmod-drbd-9.0.16_3.10.0_957.1.3-1.x86_64.rpm drbd-man-ja-9.7.0-1.el7.x86_64.rpm [root@drbd0 drbd9-rpm]# rpm -ivh --replacefiles drbd-utils-9.7.0-1.el7.x86_64.rpm |
DRBD設定
DRBDの設定をします。
以下の設定ファイルを drbd0
drbd1
にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[root@drbd0 ~]# cd /etc/drbd.d/ [root@drbd0 drbd.d]# vi global_common.conf common { (snip) net { (snip) protocol C; } (snip) [root@drbd0 drbd.d]# vi r0.res resource r0 { on drbd0 { device /dev/drbd0; disk /dev/sdb1; address 192.168.100.1:7789; meta-disk internal; } on drbd1 { device /dev/drbd0; disk /dev/sdb1; address 192.168.100.2:7789; meta-disk internal; } } |
drbd0
と drbd1
でDRBDのメタデータを作成します。
1 2 3 4 |
[root@drbd0 ~]# drbdadm create-md r0 (snip) New drbd meta data block successfully created. |
drbd0
と drbd1
でdrbdを起動します。
1 2 |
[root@drbd0 ~]# systemctl start drbd |
片方ホストのdrbdを起動すると、もう片方のdrbdが起動するまで待ちます。そのため、プロンプトは対向のdrbdが起動するまで戻ってきません。
DRBDの同期
DRBDの初期同期をします。
これは片方のホストで実施します。
ここでは drbd0
で実施します。
1 2 |
[root@drbd0 ~]# drbdadm primary --force r0 |
ステータスを確認します。
初回のステータス確認時のみ長い改行と共に –== Thank you for participating in the global usage survey ==– が表示されます。
1 2 3 4 5 6 |
[root@drbd0 ~]# drbdadm status r0 r0 role:Primary disk:UpToDate drbd1 role:Secondary replication:SyncSource peer-disk:Inconsistent done:0.06 <- 同期中 |
完全に同期が完了すると以下のようになります。
1 2 3 4 5 6 |
[root@drbd0 ~]# drbdadm status r0 r0 role:Primary disk:UpToDate drbd1 role:Secondary peer-disk:UpToDate |
drbd0デバイスのフォーマット
ここでは、作成した/dev/drbd0をXFSでフォーマットします。
1 2 |
[root@drbd0 ~]# mkfs.xfs /dev/drbd0 |
これで、/dev/drbd0をマウントできるようになりました。
NFSインストール・設定
NFSインストール
drbd0
drbd1
に対してNFS関連パッケージをインストールします。
1 2 |
[root@drbd0 ~]# yum -y install nfs-utils |
NFS設定
NFSの設定をします。
以下のディレクトリと設定ファイルを drbd0
drbd1
にしてください。
ここでは /elasticsearch
ディレクトリをNFSで共有させます。
作成した /elasticsearch
はelasticsearchユーザーが書き込めるようにパーミッションを変更します。
1 2 3 4 5 6 |
[root@drbd0 ~]# mkdir /elasticsearch [root@drbd0 ~]# chmod 750 /elasticsearch/ [root@drbd0 ~]# chown 997.995 /elasticsearch/ [root@drbd0 ~]# vi /etc/exports /elasticsearch 192.168.0.0/24(rw,no_root_squash,async,no_subtree_check,fsid=0) |
もしNFSマウント切り替えで Stale file handle のエラーが出た場合 fsid
を合わせてください。設定がなくてもpacemakerでdrbdの冗長化構成を取っている場合は出ないと思いますが念のためここでは設定を入れておきます。
Pacemakerインストール・設定・起動
Pacemakerインストール
drbd0
drbd1
にpacemakerに関するパッケージをインストールします。
ビルドして作成したdrbdに関するpacemakerパッケージもインストールします。
1 2 3 |
[root@drbd0 ~]# yum install -y pacemaker pcs psmisc policycoreutils-python [root@drbd0 drbd9-rpm]# rpm -ivh drbd-pacemaker-9.7.0-1.el7.x86_64.rpm |
Pacemaker設定
drbd0
drbd1
でPacemakerを起動します。
1 2 |
[root@drbd0 ~]# systemctl start pcsd |
drbd0
drbd1
でpacemakerのステータス確認用アカウントのパスワードを設定します。
1 2 3 4 5 6 |
[root@drbd0 ~]# passwd hacluster ユーザー hacluster のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。 |
pacemaker clusterの認証設定をします。
この手順は片方のホスト(ここではdrbd0)でやればいいです。
1 2 3 4 5 6 |
[root@drbd0 ~]# pcs cluster auth drbd0 drbd1 Username: hacluster Password: drbd1: Authorized drbd0: Authorized |
pacemaker clusterを構築します。ここでは、cluster名は nfs_cluster
とします。
この手順は片方のホスト(ここではdrbd0)でやればいいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@drbd0 ~]# pcs cluster setup --name nfs_cluster drbd0 drbd1 Destroying cluster on nodes: drbd0, drbd1... drbd0: Stopping Cluster (pacemaker)... drbd1: Stopping Cluster (pacemaker)... drbd0: Successfully destroyed cluster drbd1: Successfully destroyed cluster Sending 'pacemaker_remote authkey' to 'drbd0', 'drbd1' drbd0: successful distribution of the file 'pacemaker_remote authkey' drbd1: successful distribution of the file 'pacemaker_remote authkey' Sending cluster config files to the nodes... drbd0: Succeeded drbd1: Succeeded Synchronizing pcsd certificates on nodes drbd0, drbd1... drbd1: Success drbd0: Success Restarting pcsd on the nodes in order to reload the certificates... drbd1: Success drbd0: Success |
clusterの構築が完了したら起動します。
この手順は片方のホスト(ここではdrbd0)でやればいいです。
1 2 3 4 5 6 |
[root@drbd0 ~]# pcs cluster start --all drbd0: Starting Cluster (corosync)... drbd1: Starting Cluster (corosync)... drbd0: Starting Cluster (pacemaker)... drbd1: Starting Cluster (pacemaker)... |
clusterのステータスを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[root@drbd0 ~]# pcs status Cluster name: nfs_cluster WARNINGS: No stonith devices and stonith-enabled is not false Stack: corosync Current DC: drbd0 (version 1.1.19-8.el7_6.1-c3c624ea3d) - partition with quorum Last updated: Sat Dec 8 23:19:31 2018 Last change: Sat Dec 8 23:19:14 2018 by hacluster via crmd on drbd0 2 nodes configured 0 resources configured Online: [ drbd0 drbd1 ] No resources Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/disabled |
Onlineに drbd0 drbd1 のノードが表示されていることを確認します。
次にいくつか不要なプロパティを無効化します。
この手順は片方のホスト(ここではdrbd0)でやればいいです。
- stonith-enabled
- stonithはスプリットブレイン対策でIPMI経由でサーバを停止させる機能ですが、仮想VMでは使わないので停止します。
- no-quorum-policy
- ディスクを使って生存チェックはしないので無効化します。
- resource-stickiness
- 自動フェイルバックさせないように
INFINITY
に設定します。
- 自動フェイルバックさせないように
1 2 3 4 |
[root@drbd0 ~]# pcs property set stonith-enabled=false [root@drbd0 ~]# pcs property set no-quorum-policy="ignore" [root@drbd0 ~]# pcs resource defaults resource-stickiness="INFINITY" |
各種プロパティは以下を参照してください。(現状、RHEL6のページの方が日本語化されています。)
cibファイル作成
clusterに設定を直で入れ込むのでは無く一旦CIBファイルを作成してから一気に設定を流し込みます。
一旦、現状のcluster設定を出力します。
この手順は片方のホスト(ここではdrbd0)でやればいいです。
ここでは最低限動作する設定しかしないので、適切な設定は環境に合わせて設定を変更してください。
1 2 |
[root@drbd0 ~]# pcs cluster cib cluster_cfg.cib |
DRBDリソースエージェント設定
DRBDの監視設定を追加します。
1 2 3 4 |
[root@drbd0 ~]# pcs -f cluster_cfg.cib resource create res_drbd ocf:linbit:drbd \ > drbd_resource=r0 drbdconf=/etc/drbd.conf \ > op monitor interval=60s |
DRBDを両方のノードで実行できるように追加のリソースを設定します。
1 2 3 4 5 |
[root@drbd0 ~]# pcs -f cluster_cfg.cib resource master ms_drbd res_drbd \ > master-max=1 master-node-max=1 \ > clone-max=2 clone-node-max=1 \ > notify=true |
ファイルシステムマウントリソースエージェント設定
/dev/drbd0
を /elasticsearch
ディレクトリにマウントするようにします。
1 2 3 |
[root@drbd0 ~]# pcs -f cluster_cfg.cib resource create elastic_fs ocf:heartbeat:Filesystem \ > device=/dev/drbd0 directory=/elasticsearch fstype=xfs |
NFSサーバリソースエージェント設定
1 2 3 |
[root@drbd0 ~]# pcs -f cluster_cfg.cib resource create res_nfs systemd:nfs-server \ > op monitor interval=60s |
VIPリソースエージェント設定
1 2 3 4 |
[root@drbd0 ~]# pcs -f cluster_cfg.cib resource create VIP ocf:heartbeat:IPaddr2 \ > ip=192.168.0.130 nic=ens192 cidr_netmask=24 \ > op monitor interval=30s |
起動順番設定
DRBDが起動してからファイルシステムをマウントするようにする。
1 2 |
[root@drbd0 ~]# pcs -f cluster_cfg.cib constraint order ms_drbd then elastic_fs |
リソースグルーピング設定
ファイルシステムマウントとNFSサーバとVIPのリソースエージェントをグルーピングして同じホストで動作するようにします。
また、マスター側のDRBDでグループが動作するようにconstraintで設定を追加します。
1 2 3 4 |
[root@drbd0 ~]# pcs -f cluster_cfg.cib resource group add group-nfs elastic_fs res_nfs VIP [root@drbd0 ~]# pcs -f cluster_cfg.cib constraint colocation add master ms_drbd with group-nfs INFINITY [root@drbd0 ~]# pcs cluster cib-push cluster_cfg.cib |
ステータスを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[root@drbd0 ~]# pcs status Cluster name: nfs_cluster Stack: corosync Current DC: drbd0 (version 1.1.19-8.el7_6.1-c3c624ea3d) - partition with quorum Last updated: Sun Dec 9 12:52:06 2018 Last change: Sun Dec 9 12:52:03 2018 by root via cibadmin on drbd0 2 nodes configured 5 resources configured Online: [ drbd0 drbd1 ] Full list of resources: Master/Slave Set: ms_drbd [res_drbd] Masters: [ drbd0 ] Slaves: [ drbd1 ] Resource Group: group-nfs elastic_fs (ocf::heartbeat:Filesystem): Started drbd0 res_nfs (systemd:nfs-server): Started drbd0 VIP (ocf::heartbeat:IPaddr2): Starting drbd0 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/disabled |
Elasticsearch・Kibanaインストール・設定・起動
Javaインストール
elaskibana
にElasticsearchとKibanaで必要なJavaをインストールします。
1 2 |
[root@elaskibana ~]# yum -y install java-1.8.0-openjdk |
Elasticsearchインストール
elaskibana
にElasticsearchをインストールします。
インストールは以下のページを参考にしてください。
Elasticsearch設定
Elasticsearchの設定をします。
1 2 3 4 5 6 7 8 |
[root@elaskibana ~]# vi /etc/elasticsearch/elasticsearch.yml (snip) cluster.name: cluster01 (snip) node.name: node01 (snip) network.host: 0.0.0.0 |
Kibanaインストール
elaskibana
にKibanaをインストールします。
インストールは以下のページを参考にしてください。
Kibana設定
Kibanaの設定をします。
1 2 3 4 5 6 7 8 9 |
[root@elaskibana ~]# vi /etc/kibana/kibana.yml (snip) server.host: "0.0.0.0" (snip) server.name: "elaskibana" (snip) elasticsearch.url: "http://localhost:9200" (snip) |
NFSインストール
elaskibana
でNFS共有ボリュームをマウントするためにNFSをインストールします。
1 2 |
[root@elaskibana ~]# yum -y install nfs-utils |
NFSマウント・設定
NFSのマウントをします。
1 2 |
[root@elaskibana ~]# mount -t nfs 192.168.0.130:/elasticsearch /var/lib/elasticsearch/ |
OS再起動時にも自動でマウントするようにします。
1 2 3 4 |
[root@elaskibana ~]# vi /etc/fstab (snip) 192.168.0.130:/elasticsearch /var/lib/elasticsearch nfs defaults 0 0 |
Elasticsearch起動
Elasticsearchを起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@elaskibana ~]# systemctl start elasticsearch [root@elaskibana ~]# systemctl enable elasticsearch [root@elaskibana ~]# curl -XGET http://localhost:9200 { "name" : "node01", "cluster_name" : "cluster01", "cluster_uuid" : "6yDiSwTJSta0bRyknTd4GA", "version" : { "number" : "6.5.2", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "9434bed", "build_date" : "2018-11-29T23:58:20.891072Z", "build_snapshot" : false, "lucene_version" : "7.5.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" } |
Kibana起動
Kibanaを起動します。
1 2 3 |
[root@elaskibana ~]# systemctl start kibana [root@elaskibana ~]# systemctl enable kibana |
ブラウザからKibanaへアクセスして問題無く表示されることを確認します。
ここでは http://192.168.0.133:5601
です。
Logstashインストール・設定・起動
logstash
にElasticsearchとKibanaで必要なJavaをインストールします。
1 2 |
[root@logstash ~]# yum -y install java-1.8.0-openjdk |
Logstashインストール
logstash
にLogstashをインストールします。
インストールは以下のページを参考にしてください。
Logstash設定
今回はテストとして /opt/example.txt
と言うファイルを読み込んで追記された文字列をElasticserachへ送信する簡単な設定にしてみようと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@logstash ~]# vi /etc/logstash/conf.d/example.conf input { file { path => "/opt/example.txt" } } filter { grok { match => { "message" => "%{GREEDYDATA:msg}$" } } } output { elasticsearch { hosts => ["192.168.0.133"] index => "example" } } |
テスト用ファイルを作成します。
1 2 |
[root@logstash ~]# touch /opt/example.txt |
Logstash起動
Logstashを起動します。
1 2 3 |
[root@logstash ~]# systemctl start logstash [root@logstash ~]# systemctl enable logstash |
テスト
テスト内容 | 結果 |
---|---|
example.txtに文字列を出力してElasticsearchに取り込まれる | ○ |
NFSサーバが切り替わっても自動切り替えマウントが実行される | ○ |
NFSサーバ切り替え後にeaxmple.txtに出力された文字列が取り込まれる | ○ |
一旦clusterを停止してexample.txtに文字列を出力して再度clusterを起動して状態を復旧させてもログ欠けしないこと | ○ |
最後のテストは2重取り込みがあった
参考文献
付録
今回使ったPacemakerのCIB例です。