修正版 - LizardFS による分散ファイルシステムの構築（RC 版 3.13 RPM パッケージ編）

## 1. 要約
先日投稿しました “<a href='https://qiita.com/KyojiOsada/items/b0b32b2fcda4e967164b'> LizardFS  による分散ファイルシステムの構築（RC 版 3.13 RPM パッケージ編）</a>” の記事に一部誤りがありましたので修正版を投稿します。

## 2. はじめに
先日、LicardFS Inc. の Mark Mulrainey とディスカッションしてた際、私の lizard-uraft パッケージの解釈に誤りがある事が発覚しましたので、この修正版をアップしました。
誤りの内容ですが、<a href='https://qiita.com/KyojiOsada/items/b0b32b2fcda4e967164b#4-lizardfs-%E6%A7%8B%E7%AF%89%E3%81%AE%E5%89%8D%E3%81%AB'>先日の記事のセクション 4 </a>で、

>マスタフェイルオーバー機構の提供については商用版のみのようで...

と説明しましたが、LizardFS 3.12 以前についてはこの通りですが、LizardFS 3.13 以降については、商用ライセンスが無くても lizardfs-uraft パッケージによって利用できるようになりました。
マスターサーバーの構成要件は、Vote 形式や、Master / Shadow の主副関係維持のため、3 台以上の構成が必要となります。
（“<a href='https://qiita.com/KyojiOsada/items/e28f5de9e9bb2e7c9c16'>LizardFS による分散ファイルシステムの構築（GA 版 3.12 yum インストール編）</a>” については、この件による修正はありません。）
また、彼によると
>We expect to have it released as an official version within the 1st quarter of next year.

と、来年の第一四半期には 3.13 を公式バージョンとしてリリースする予定との事です。
プロダクトの重要な要素をオープンソース化した事について、同じ OSS コミッターとしてリスペクトを感じます。
アドバイスくれた LizardFS Inc. の Mark Mulrainey に改めて感謝します。

以降では再度、LizardFS（RC 版 3.13 RPM パッケージ）の構築例と、uRaft パッケージによるフェイルオーバーテストを投稿します。

## 3. LizardFS 構築環境
* RHEL 7 系
* LizardFS 3.13.0-rc1

## 4. LizardFS 設計
* LizardFS マスターサーバー x 3
  * mfs-master1
  * mfs-master2
  * mfs-master3
* LizardFS チャンクサーバー x 2
  * mfs-chunk1
  * mfs-chunk2 
* LizardFS クライアント x 2
  * mfs-client1
  * mfs-client2 

### LizardFS パッケージ一覧
```
lizardfs-3.13.0-0el7.src.rpm
lizardfs-debuginfo-3.13.0-0el7.x86_64.rpm
lizardfs-adm-3.13.0-0el7.x86_64.rpm
lizardfs-lib-client-3.13.0-0el7.x86_64.rpm
lizardfs-cgi-3.13.0-0el7.x86_64.rpm
lizardfs-master-3.13.0-0el7.x86_64.rpm
lizardfs-cgiserv-3.13.0-0el7.x86_64.rpm
lizardfs-metalogger-3.13.0-0el7.x86_64.rpm
lizardfs-chunkserver-3.13.0-0el7.x86_64.rpm
lizardfs-nfs-ganesha-3.13.0-0el7.x86_64.rpm
lizardfs-client-3.13.0-0el7.x86_64.rpm
lizardfs-uraft-3.13.0-0el7.x86_64.rpm
lizardfs-client3-3.13.0-0el7.x86_64.rpm
```

## 5. LizardFS マスターサーバー
### 5-1. LizardFS ダウンロード
[LizardFS ダウンロードページ](http://lizardfs.com/download/)
@ mfs-master1, 2, 3
`$ sudo mkdir /usr/local/src/lizardfs`
`$ sudo cd /usr/local/src/lizardfs`
`$ sudo wget https://lizardfs.com/wp-content/uploads/2018/07/lizardfs-bundle-CentOS-7.5.1804.tar `

### 5-2. LizardFS インストール
@ mfs-master1, 2, 3
`$ sudo tar -xvf lizardfs-bundle-CentOS-7.5.1804.tar`
`$ sudo cd lizardfs-bundle-CentOS-7.5.1804`
`$ sudo yum -y localinstall lizardfs-master-3.13.0-0el7.x86_64.rpm lizardfs-uraft-3.13.0-0el7.x86_64.rpm lizardfs-adm-3.13.0-0el7.x86_64.rpm`

### 5-3. hosts ファイル設定
@ mfs-master1, 2, 3
`$ sudo vim /etc/hosts`

```conf:/etc/hosts
10.0.0.9    mfs-cluster
10.0.0.1    mfs-master1
10.0.0.2    mfs-master2
10.0.0.3    mfs-master3
10.0.0.4    mfs-chunk1
10.0.0.5    mfs-chunk2
10.0.0.6    mfs-client1
10.0.0.7    mfs-client2
```

### 5-4. metadata.mfs 設定
@ mfs-master1, 2, 3
`$ sudo cd /var/lib/mfs`
`$ sudo cp -a metadata.mfs.empty metadata.mfs`

### 5-5. mfsmaster.cfg 設定
@ mfs-master1, 2, 3
`$ sudo cd /etc/mfs`
`$ sudo cp -a mfsmaster.cfg.dist mfsmaster.cfg`
`$ sudo vim /etc/mfs/mfsmaster.cfg`

```conf:/etc/mfs/mfsmaster.cfg
PERSONALITY = ha-cluster-managed
ADMIN_PASSWORD = パスワード
#  VIP アドレスまたは VIP ホスト名
MASTER_HOST = mfs-cluster
```

### 5-6. lizardfs.cfg 設定
@ mfs-master1, 2, 3
`$ sudo cd /etc/mfs`
`$ sudo cp -a lizardfs-uraft.cfg.dist lizardfs-uraft.cfg`
`$ sudo vim /etc/mfs/lizardfs-uraft.cfg`

@ mfs-master1

```conf:/etc/mfs/lizardfs-uraft.cfg
URAFT_PORT = 9427
URAFT_STATUS_PORT = 9428
URAFT_NODE_ADDRESS = 10.0.0.1
URAFT_NODE_ADDRESS = 10.0.0.2
URAFT_NODE_ADDRESS = 10.0.0.3
URAFT_ID = 0
LOCAL_MASTER_ADDRESS = localhost
LOCAL_MASTER_MATOCL_PORT = 9421
ELECTION_TIMEOUT_MIN = 400
ELECTION_TIMEOUT_MAX = 600
HEARTBEAT_PERIOD = 20
LOCAL_MASTER_CHECK_PERIOD = 250
URAFT_FLOATING_IP = 10.0.0.9
URAFT_FLOATING_NETMASK = 255.255.255.0
URAFT_FLOATING_IFACE = eth0
```

@ mfs-master2

```conf:/etc/mfs/lizardfs-uraft.cfg
URAFT_PORT = 9427
URAFT_STATUS_PORT = 9428
URAFT_NODE_ADDRESS = 10.0.0.1
URAFT_NODE_ADDRESS = 10.0.0.2
URAFT_NODE_ADDRESS = 10.0.0.3
URAFT_ID = 1
LOCAL_MASTER_ADDRESS = localhost
LOCAL_MASTER_MATOCL_PORT = 9421
ELECTION_TIMEOUT_MIN = 400
ELECTION_TIMEOUT_MAX = 600
HEARTBEAT_PERIOD = 20
LOCAL_MASTER_CHECK_PERIOD = 250
URAFT_FLOATING_IP = 10.0.0.9
URAFT_FLOATING_NETMASK = 255.255.255.0
URAFT_FLOATING_IFACE = eth0
```

@ mfs-master3

```conf:/etc/mfs/lizardfs-uraft.cfg
URAFT_PORT = 9427
URAFT_STATUS_PORT = 9428
URAFT_NODE_ADDRESS = 10.0.0.1
URAFT_NODE_ADDRESS = 10.0.0.2
URAFT_NODE_ADDRESS = 10.0.0.3
URAFT_ID = 2
LOCAL_MASTER_ADDRESS = localhost
LOCAL_MASTER_MATOCL_PORT = 9421
ELECTION_TIMEOUT_MIN = 400
ELECTION_TIMEOUT_MAX = 600
HEARTBEAT_PERIOD = 20
LOCAL_MASTER_CHECK_PERIOD = 250
URAFT_FLOATING_IP = 10.0.0.9
URAFT_FLOATING_NETMASK = 255.255.255.0
URAFT_FLOATING_IFACE = eth0
```

### 5-7. mfsgoals.cfg 設定
@ mfs-master1, 2, 3
`$ sudo cd /etc/mfs/`
`$ sudo cp -a mfsgoals.cfg.dist mfsgoals.cfg`
`$ sudo vim mfsgoals.cfg`

```conf:/etc/mfs/mfsgoals.cfg
2 2 : _ _
```

### 5-8. 他の cfg ファイル設定
@ mfs-master1, 2, 3
`$ sudo cd /etc/mfs`
`$ sudo cp -a globaliolimits.cfg.dist globaliolimits.cfg`
`$ sudo cp -a mfsexports.cfg.dist mfsexports.cfg`
`$ sudo cp -a mfstopology.cfg.dist mfstopology.cfg`

```
globaliolimits.cfg       lizardfs-uraft.cfg.dist  mfsgoals.cfg       mfsmaster.cfg.dist
globaliolimits.cfg.dist  mfsexports.cfg           mfsgoals.cfg.dist  mfstopology.cfg
lizardfs-uraft.cfg       mfsexports.cfg.dist      mfsmaster.cfg      mfstopology.cfg.dist
```

### 5-9. カーネル設定
@ mfs-master1, 2, 3
`$ sudo echo 1 > /proc/sys/net/ipv4/conf/all/arp_accept`

## 6. Lizardfs チャンクサーバー
### 6-1. Lizardfs ダウンロード
[LizardFS ダウンロードページ](http://lizardfs.com/download/)
@ mfs-chunk1, 2
`$ sudo mkdir /usr/local/src/lizardfs`
`$ sudo cd /usr/local/src/lizardfs`
`$ sudo wget https://lizardfs.com/wp-content/uploads/2018/07/lizardfs-bundle-CentOS-7.5.1804.tar` 

### 6-2. Lizardfs インストール
@ mfs-chunk 1, 2
`$ sudo tar -xvf lizardfs-bundle-CentOS-7.5.1804.tar`
`$ sudo cd lizardfs-bundle-CentOS-7.5.1804`
`$ sudo yum -y localinstall lizardfs-master-3.13.0-0el7.x86_64.rpm lizardfs-uraft-3.13.0-0el7.x86_64.rpm lizardfs-adm-3.13.0-0el7.x86_64.rpm`

### 6-3. hosts ファイル設定
@ mfs-chunk 1, 2
`$ sudo vim /etc/hosts`

```conf:/etc/hosts
10.0.0.9    mfs-cluster
10.0.0.1    mfs-master1
10.0.0.2    mfs-master2
10.0.0.3    mfs-master3
10.0.0.4    mfs-chunk1
10.0.0.5    mfs-chunk2
10.0.0.6    mfs-client1
10.0.0.7    mfs-client2
```

### 6-4. mfschunkserver.cfg 設定
@ mfs-chunk 1, 2
`$ sudo cd /etc/mfs/`
`$ sudo cp -a mfschunkserver.cfg.dist mfschunkserver.cfg`
`$ sudo vim mfschunkserver.cfg`

```cfg:/etc/mfs/mfschunkserver.cfg
# ホスト名または IP アドレス
MASTER_HOST = mfs-cluster
```

### 6-5. mfshdd.cfg 設定
@ mfs-chunk 1, 2
`$ sudo mkdir /mnt/mfs`
`$ sudo chown -R mfs:mfs /mnt/mfs`
`$ sudo cd /etc/mfs/`
`$ sudo cp -a mfshdd.cfg.dist mfshdd.cfg`
`$ sudo vim mfshdd.cfg`

```conf:/et/mfs/mfshdd.cfg
/mnt/mfs
```

## 7. LizardFS クライアント
### 7-1. LizardFS ダウンロード
[LizardFS ダウンロードページ](http://lizardfs.com/download/)
@ mfs-client 1, 2
`$ sudo mkdir /usr/local/src/lizardfs`
`$ sudo cd /usr/local/src/lizardfs`
`$ sudo wget https://lizardfs.com/wp-content/uploads/2018/07/lizardfs-bundle-CentOS-7.5.1804.tar`

### 7-2. LizardFS クライアントインストール
@ mfs-client 1, 2
`$ sudo tar -xvf lizardfs-bundle-CentOS-7.5.1804.tar`
`$ sudo cd lizardfs-bundle-CentOS-7.5.1804`
`$ sudo yum -y localinstall lizardfs-master-3.13.0-0el7.x86_64.rpm lizardfs-uraft-3.13.0-0el7.x86_64.rpm lizardfs-adm-3.13.0-0el7.x86_64.rpm`

### 7-3. hosts ファイル 設定
@ mfs-client 1, 2
`$ sudo vim /etc/hosts`

```conf:/etc/hosts
10.0.0.9    mfs-cluster
10.0.0.1    mfs-master1
10.0.0.2    mfs-master2
10.0.0.3    mfs-master3
10.0.0.4    mfs-chunk1
10.0.0.5    mfs-chunk2
10.0.0.6    mfs-client1
10.0.0.7    mfs-client2
```

### 7-4. mfsmount.cfg 設定
@ mfs-client 1, 2
`$ sudo cd /etc/mfs/`
`$ sudo cp -a mfsmount.cfg.dist mfsmount.cfg`
`$ sudo vim mfsmount.cfg`

```conf:/etc/mfs/mfsmount.cfg
mfsmaster=mfs-cluster,mfsport=9421
/mnt/mfs
```

## 8. LizardFS 起動
### 8-1. クラスター起動
@ mfs-master1, 2, 3
`$ sudo systemctl start lizardfs-uraft`
`$ sudo systemctl status lizardfs-uraft`
`$ sudo lizardfs-admin list-metadataservers 10.0.0.9 9421`

```
Server 1:
	IP: 10.0.0.9
	Port: 9421
	Hostname: mfs-master1
	Personality: master
	Status: running
	Metadata version: 1
	Version: 3.13.0
Server 2:
	IP: 10.0.0.2
	Port: 9421
	Hostname: mfs-master2
	Personality: shadow
	Status: connected
	Metadata version: 1
	Version: 3.13.0
Server 3:
	IP: 10.0.0.3
	Port: 9421
	Hostname: mfs-master3
	Personality: shadow
	Status: connected
	Metadata version: 1
	Version: 3.13.0
```

### 8-2. チャンクサーバー起動
@ mfs-chunk1, 2
`$ sudo systemctl start lizardfs-chunkserver`
`$ sudo systemctl status lizardfs-chunkserver`
`$ sudo lizardfs-admin list-chunkservers 10.0.0.9 9421`

```
Server 10.0.0.4:9422:
	version: 3.13.0
	label: _
	chunks: 0
	used space: 6.5GiB / 27GiB
	chunks marked for removal: 0
	used space marked for removal: 0B / 0B
	errors: 0
Server 10.0.0.5:9422:
	version: 3.13.0
	label: _
	chunks: 0
	used space: 6.5GiB / 27GiB
	chunks marked for removal: 0
	used space marked for removal: 0B / 0B
	errors: 0
```

### 8-3. クライアントマウント
@ mfs-client1, 2
`$ sudo mkdir /mnt/mfs`
`$ sudo mfsmount -o cacheexpirationtime=0 -o readaheadmaxwindowsize=4096 -o big_writes,nosuid,nodev,noatime /mnt/mfs`
`$ sudo lizardfs-admin list-mounts 10.0.0.9 9421`

```
session 1: 
	ip: 10.0.0.6
	mount point: /mnt/mfs
	version: 3.13.0
	root dir: /
	root uid: 0
	root gid: 0
	users uid: 999
	users gid: 999
	read only: no
	restricted ip: yes
	ignore gid: no
	all can change quota: no
	map all users: no
session 2: 
	ip: 10.0.0.7
	mount point: /mnt/mfs
	version: 3.13.0
	root dir: /
	root uid: 0
	root gid: 0
	users uid: 999
	users gid: 999
	read only: no
	restricted ip: yes
	ignore gid: no
	all can change quota: no
	map all users: no
```

## 9. 同期テスト
@ mfs-client1
`$ sudo touch /mnt/mfs/test`

@ mfs-client2
`$ sudo ls /mnt/mfs`
`$ sudo rm -rf /mnt/mfs/test`

@ mfs-client1
`$ sudo ls /mnt/mfs`

## 10. フェイルオーバーテスト
@ mfs-master1, 2, 3
`$ sudo lizardfs-admin list-metadataservers 10.0.0.9 9421`

```
Server 1:
	IP: 10.0.0.9
	Port: 9421
	Hostname: mfs-master1
	Personality: master
	Status: running
	Metadata version: 11
	Version: 3.13.0
Server 2:
	IP: 10.0.0.2
	Port: 9421
	Hostname: mfs-master2
	Personality: shadow
	Status: connected
	Metadata version: 11
	Version: 3.13.0
Server 3:
	IP: 10.0.0.3
	Port: 9421
	Hostname: mfs-master3
	Personality: shadow
	Status: connected
	Metadata version: 11
	Version: 3.13.0

```
@ mfs-master1
`$ sudo systemctl stop lizardfs-uraft`

@ mfs-master2, 3
`$ sudo lizardfs-admin list-metadataservers 10.0.0.9 9421`

```
Server 1:
	IP: 10.0.0.9
	Port: 9421
	Hostname: mfs-master2
	Personality: master
	Status: running
	Metadata version: 13
	Version: 3.13.0
Server 2:
	IP: 10.0.0.3
	Port: 9421
	Hostname: mfs-master3
	Personality: shadow
	Status: connected
	Metadata version: 13
	Version: 3.13.0
```

上記のように、マスターフェイルオーバーが無事に実行されている事が確認できます。
LizardFS 3.13 以降からオープンソース化された lizardfs-uraft パッケージを利用することで、マスターフェイルオーバー機構がシンプルに実現可能になります。

## 11. まとめ
この記事では、先日投稿した “<a href='https://qiita.com/KyojiOsada/items/b0b32b2fcda4e967164b'>LizardFS による分散ファイルシステムの構築（RC 版 3.13 RPM パッケージ編）</a>” の記事に一部誤りがありましたので修正版を投稿しました。
LizardFS 3.13 以降については、マスターフェイルオーバー機構も lizardfs-uraft パッケージによってオープンソース化され、商用版のライセンスが無くても利用できるようになり、マスターフェイルオーバー機構がとてもシンプルに実現可能になりました。

実用におきましては、ユースケースによる有用性次第になってくると思いますが、私の関わるプロジェクトでも、この後パフォーマンスに関するベンチマークテスト、管理工数の比較、管理コストなどを算出する予定ですので、公開できる範囲でこれらの結果を投稿しようと思います。