技術戦略部より、tipsやノウハウなど技術的な話題を発信いたします。by2017.9.27インフラGlusterFSの導入とGeo-ReplicationGlusterFS分散ストレージこんにちは。管理チームのいとうです。今回は分散ストレージのGlusterFSをご紹介します。これまでNFSやiSCSI、ZFSなど様々なストレージ技術を扱ってきましたが、まだ分散ストレージについては未経験でした。そこで今回はGlusterFSの導入をやってみることにしました。GlusterFSについてGlusterFSはRedhatにより開発されている、ファイルシステムです。簡単に仕組みを説明すると、複数のサーバ上にある「ブリック」を統合することで論理的なボリュームを作り、ファイルシステムとして利用できる仕組みです。ボリュームの構成方法もストライピングやミラーリング、冗長データを使った対障害性の向上、それらの組合せなど種類が多く、目的の用途に合わせて柔軟な構成を取ることが出来ます。用語についてGlusterFSを利用する際に出てくる用語について解説します。ノードノードとは、GlusterFSのデーモンが動作しているサーバを指します。複数のノードがお互いに信頼関係を結び、ボリュームを構成します。各サーバのローカルストレージ上のディレクトリを利用します。このブリックを統合することで、論理的なボリュームを見せることになります。ボリュームボリュームは実際にファイルシステムとして利用されるストレージ領域を指します。先述のように、複数のブリックによって構成されます。今回は以下の内容を検証してみようと思います。GlusterFSの導入GlusterFSの導入と初期設定、そしてReplicatedボリュームの作成を行ってみます。Geo-Replicationディザスタリカバリ環境の構築を想定してローカルサイトとリモートサイトを用意し、サイト間でボリュームのレプリケーションが行えるGeo-Replication機能の検証をしてみます。検証環境について今回は以下の環境を用意しました。ストレージとなるサーバが2ノード×2系統で4台用意します。local-sv01local-sv02remote-sv01remote-sv02そしてクライアントとして振る舞うサーバを1台用意します。CPU)で構築しています。OS用領域とは別にGlusterFSのブリック用ディスクとして16GBのディスク(/dev/sdb)を追加しています。導入を始める前に、事前準備をいくつか行う必要があります。ブリック用領域の作成GlusterFSのブリック用領域として、/dev/sdb1を作成します。作成手順は割愛しますが、今回はext4で作成しました。これを/gluster/brick01にマウントしておきます。各ノードの名前解決が正常に行われるように、hostsファイルまたはDNSに各ノードのレコードを追加しておきましょう。ノードの時刻を同期する時刻同期が正しく行われていないと、ファイル同期の際に問題が発生します。NTPで時刻同期を行っておきましょう。GlusterFSの導入パッケージのインストール(サーバ側)ではインストールに入っていきます。GlusterFSはCentOSが提供しているレポジトリから入手可能です。いくつかのバージョンが提供されていますが、今回は最新のものを利用します。remote-sv02で以下のコマンドを実行します。glusterfs-geo-replicationインストールが完了したら、glusterdを起動しましょう。]次に、自動起動の設定を確認します。gluster以下のようにglusterdとglusterfsdが登録されているかと思います。6:offもしglusterdの自動起動が有効になっていない場合は、以下のコマンドで有効にしておきましょう。Userspace)機構を利用した、ユーザ空間で動作するファイルシステムとして振る舞います。そのためglusterfs-fuseパッケージをインストールしておく必要があります。glusterfs-fuseコマンドを実行して正しくインストールされていることを確認します。Poolを構成するGlusterFSではノード同士が信頼関係を結ぶことで、ストレージプールを構成します。このプール(≒ブリックの集まり)からボリュームの切り出しを行います。現在のlocal-sv01の接続ノード数を確認してみましょう。以下のコマンドを実行します。0まだどのノードとも接続を行っていないので、ピア数は0と表示されます。次に以下のコマンドを実行し、local-sv02と接続を確立してみましょう。local-sv02以下のようなメッセージが表示されれば、正常に接続が確立できています。エラーが出る場合は、名前解決がきちんとできているかなど確認してみて下さい。success.では、もう一度接続ノード数を確認してみましょう。1"となっており、local-sv02が追加されていることが確認できました。local-sv01自身がカウントされていませんが、自分自身は暗黙的に接続ノードになっているので問題ありません。local-sv02の2台でストレージプールを構築できました。ボリュームタイプこれからボリュームを作成していきますが、その前にいくつかあるボリュームのタイプについて説明します。VolumeこのタイプのボリュームはRAID1に相当します。ファイルの完全なコピーをボリュームを構成する各ブリックに保存するので、いずれかのノードに障害が発生しても、データの喪失を防ぐことができます。利用できる容量はボリューム内の最も小さいブリックのサイズになります。VolumeこのタイプのボリュームはRAID0に相当します。データを決められたブロックサイズに分割し、各ブリックに分散して書き込みます。書き込み処理は各ブリックに並列で行われるため大きなサイズのファイルを扱うのに適していますが、いずれかのノードに障害が発生した場合、データの喪失が発生する可能性があります。従い別途ノード側でRAID構成を取るなどして、対障害性を高める対策が必要になります。Volumeこのタイプのボリュームは各ブリックへの書き込みがファイル単位で分散されます。大容量のボリュームを利用したい際に有効です。利用できる容量はボリューム内のブリックサイズの総和です。Volumeに似ていますが、イレイジャーコードを付加して書き込むという点で異なっています。これによりブリックに障害が発生した場合でも、正常なブリックのデータに含まれたイレイジャーコードを利用してデータを復旧することが可能になります。その他その他にも、上記のタイプを組合せたボリュームも作成することが可能です。ReplicationとStripedの組合せや、ReplicationとDistributedの組合せなどが選択可能です。ストレージに対する要件や掛けられるコストに応じて、適切なタイプはどれか?を検討しましょう。ボリュームを作成するでは実際にボリュームを作成してみましょう。GlusterFSの管理には主にglusterコマンドを通して行います。createコマンドセットを利用します。Volumeを作成する際の必要最低限のコマンドは以下のようになります。Volumeを作成します。local-sv02:/gluster/brick01/volume01正常にボリュームが作成されると、以下のように結果が表示されます。dataボリュームは作成が完了した時点では利用可能になっていません。startコマンドを実行して明示的に開始する必要があります。volume01正常に開始されると以下のメッセージが表示されます。successボリュームの情報を確認する場合は以下のコマンドを実行します。volume01ボリュームを構成するブリックの数やオプション設定などを確認することができます。onそれでは実際に作成したボリュームをマウントしてみましょう。client-sv01でマウントを実行します。/mntボリュームがクライアントから利用可能になったので、サイズを確認してみましょう。Volumeなので、使用可能な容量はブリックと同じサイズで表示されていることがわかります。試しにファイルを一つ作成して、レプリケーションが正常に行われることを確認してみましょう。/mnt/testfileクライアント側からはファイルが作成されていることが確認できました。それぞれのブリック上のファイルを参照します。/gluster/brick01/volume01/testfileテストファイルを作成してみるどちらのブリックにも正しくファイルが作成されていることが確認できましたね。次に、local-sv01をシャットダウンしたら、クライアントからファイルがどう見えるのかを確認してみます。nowシャットダウン後、クライアントで先ほどのファイルを確認します。/mnt/testfileテストファイルを作成してみるlocal-sv01をマウント先に指定していましたが、接続は切れずに正常にファイルが表示されています。これはクライアント側でファイルアクセスの振り分け処理を行っているため、local-sv01がダウンしていても、正常に動作しているlocal-sv02に処理が振り分けられたためです。分散ストレージとしての機能を実現しています。Geo-Replicationを試すここまでは基本的なボリュームの作成方法について見てきましたが、ここからはGeo-Replicationの検証を行っていきたいと思います。Geo-Replicationとは、マスター-スレーブ形式で遠隔地のボリュームに対して非同期でボリュームの内容を複製する機能です。remote-sv02)でストレージプールを構成し、ボリュームを作成します。ローカル側のボリューム(volume01)をマスターとし、リモート側のボリュームをスレーブとして同期を行う設定を検証してみたいと思います。以後ローカル側をレプリケーションマスター、リモート側をレプリケーションスレーブとします。Geo-Replicationの要件Geo-Replicationを行うためには、いくつかの要件を満たす必要があります。時刻の同期レプリケーションマスター間で時刻が同期されていない場合、レプリケーションスレーブへのファイル同期に遅延が発生する可能性があります。NTPなどを利用して確実に時刻を同期しておきましょう。rsyncコマンドGeo-Replicationではrsyncコマンドを利用します。従い、レプリケーションマスター・レプリケーションスレーブ共にrsyncコマンドが利用可能である必要があります。peerコマンドでストレージプールを構成します。success.接続が確立されたことを確認しましょう。1正常に接続ができたようです。次にボリュームの作成を行います。createコマンドを利用します。ボリューム名はvolume02とします。dataボリュームの作成が完了したので、ボリュームを開始します。successではvolume02の情報を確認してみましょう。remote-sv02のブリックでボリュームが構成されていることが確認できたかと思います。Geo-Replication専用ユーザの作成Geo-Replicationではボリューム間のファイルを同期するためにSSHを利用します。rootユーザと非特権ユーザのどちらでもGeo-Replicationは可能ですが、セキュリティの事を考えるとSSHでrootログイン可能にするのは避けたいところです。従って、今回はレプリケーション専用のユーザを作成し、レプリケーションを行う方法を取りたいと思います。以下、レプリケーションマスターからレプリケーションスレーブへ公開鍵認証を利用したログインができるよう、設定を行っていきます。レプリケーションスレーブにGeo-Replication専用のグループ(geogroup)とユーザ(geouser)を作成します。併せてgeouserにパスワードを設定しておきましょう。非特権ユーザでレプリケーションを行う場合、gluster-mountbrokerというサービスを介してレプリケーションが行われます。レプリケーションスレーブにて、rootユーザでgluster-mountbrokerで利用するためのディレクトリを作成します。/var/mountbroker-root次にmountbrokerのセットアップを行い、非特権ユーザを特定のボリュームにアクセス可能にする設定を行います。rootを設定します。|+-------------+-------------+--------------+次にgeouserのvolume02に対するアクセスを設定します。|+-------------+-------------+------------+設定が完了したのでmountbrokerの状態を確認してみます。|+-------------+-------------+-----------------------+--------------+--------------------+うまく設定できているようです。設定を反映するため、一度glusterdを再起動します。次にSSHの設定です。レプリケーション時のログイン用にレプリケーションマスターの両方でSSH鍵を生成し、レプリケーションスレーブ両方のgeouserに公開鍵を配布します。geouserにSSHログインした際の実行コマンドをgsyncdのみに制限するため、公開鍵に設定を追加しています。ssh-copy-idコマンドではgeouserのパスワードを尋ねられるので、先ほど設定したパスワードを入力しましょう。geouser@remote-sv02Geo-Replicationの設定mountbrokerおよびSSHログインの設定が完了したので、本題のGeo-Replicationの設定に移ります。Geo-Replicationセッションを作成するGeo-Replicationのセッションを作成します。レプリケーションマスターのプライマリノード(local-sv01)で以下のコマンドを実行します。successfullyGeo-Replicationセッションを開始するGeo-Replicationの準備が完了したので、セッションを開始します。レプリケーションマスターのプライマリノードで以下のコマンドを実行します。successful"と出力されたので、セッションの開始に成功したようです。Geo-Replicationセッションの状況を確認する念のためセッションの状況を確認しておきましょう。レプリケーションマスターのプライマリノードで以下のコマンドを実行します。N/Aここで注目すべきは"STATUS"の項目です。正常にレプリケーションが行われていると、"Active"もしくは"Passive"になっているかと思います。何らかの原因でレプリケーションに失敗していると"Faulty"というステータスになるはずです。その際は、/var/log/glusterfs/geo-replication/以下にあるログを確認して、原因を調査・修正して下さい。クライアントからローカルのボリュームに接続し、ファイルを作ってみる無事にレプリケーションが動作したようなので、実際にクライアントからファイルに書き込みを行って、レプリケーションが行われるか確認したいと思います。client-sv01でlocal-sv01のvolume01をマウントして、何かファイルを書き込んでみて下さい。/mnt/reptest書き込んだら、まずレプリケーションマスターのブリック内のファイルを参照してみます。/gluster/brick01/volume01/reptestレプリケーションテストこちらは正常に書き込まれていますね。次にレプリケーションスレーブのブリック内のファイルを参照してみます。/gluster/brick01/volume02/reptestレプリケーションテストこちらにも正常に書き込まれています。レプリケーションが行われていることが確認できたと思います。ファイルを削除してみる今度は作ったファイルを削除してみます。クライアントで以下のコマンドを実行します。/mnt/reptest削除したらレプリケーションマスターのブリック内のファイルを参照してみます。そのようなファイルやディレクトリはありませんファイルが削除されています。次にレプリケーションスレーブのブリック内も消えていることを確認します。そのようなファイルやディレクトリはありませんこちらも消えていますね。これでファイルの作成・削除などのオペレーションがマスター-スレーブ間で正しく同期されていることが確認できました。まとめ今回はGlusterFSの導入と基本的な操作、そしてGeo-Replicationについて検証を行いました。簡単なオペレーションを試すにとどまったので、ファイル数やファイルサイズが大きくなった時に、性能にどのような影響があるのかは気になるところです。簡易な設定で導入ができるという点では、初めて分散ストレージを使いたい場合の選択肢として、良いのではないかと思います。GlusterFSには今回紹介した機能の他にも、スナップショットやTierなど試してみたい機能がまだまだあります。この機会に是非、触ってみてもらえればと思います。