【CentOS8】LINSTORでDRBD-SDSを試してみる

Table of Content

広告

はじめに

SDSとは

従来、大規模なストレージが要求される場合、専用ストレージを購入して利用してきました。しかし、性能が良い一方で非常に高価で中小規模には導入が難しいと思います。
これまで専用ストレージで実現してきたストレージ機能をソフトウェアで実装し、x86サーバのみで柔軟なデータ基盤を提供できるのがSDS(Software-Defined Storage)と呼ばれる機能です。

※2021/3/18 wgetでlinstorのソースが取得できなくなりましたので、gitの方法で更新しました。

SDSをDRBD9で行う

DRBD9ではSDSの機能が強化(前回の記事参照)されています。SDSとして必要最低限のノード数は2台で小規模のSDSとしては十分だと思います。ただ、DRBD9単体でSDSとして使うには設定が煩雑で管理ツールと組み合わせて使うのが一般的です。管理ツールとしてはdrbdmanag、LINSTORがありますが、drbdmanagは不安定なのでLINSTORでDRBD-SDSを構築していきたいと思います。

前提

今回立てるサーバは以下の通りです。vagrant-libvirtで仮想マシンを作成しています。

ホスト名 IPアドレス ディスク
node1 192.168.200.10 /dev/vdb
node2 192.168.200.11 /dev/vdb

今回は、SELinux、ファイアウォールを無効化して構築していきます。

SELinuxの無効化は以下の通りです。

sudo setenforce 0
sudo sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

ファイアウォールの無効化は以下の通りです。

sudo systemctl stop firewalld
sudo systemctl disable firewalld

特に表記が無い場合は、両サーバでコマンドを入力します。

インストール

DRBD9インストール

ELRepoリポジトリを有効にしてDRBD9をインストールします。

sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo dnf -y install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
sudo dnf install -y drbd90-utils kmod-drbd90

drbdモジュールを有効化するため、ここでリブートします。

LINSTORインストール

LINSTORはソースコードからrpmをビルドする必要があります。
ビルドにはJavaのビルドツールであるgrade,SDKMAN,が必要になります。

node1でrpmパッケージをビルドします。

[vagrant@node1 ~]$ sudo dnf install -y zip unzip make git
[vagrant@node1 ~]$ curl -s get.sdkman.io | bash
[vagrant@node1 ~]$ source "$HOME/.sdkman/bin/sdkman-init.sh"
[vagrant@node1 ~]$ sdk version
==== BROADCAST =================================================================
* 2021-03-14: jbang 0.67.3 available on SDKMAN! https://git.io/JquYD
* 2021-03-13: jbang 0.67.2 available on SDKMAN! https://git.io/JqC8w
* 2021-03-11: grails 4.0.9 available on SDKMAN!
================================================================================

SDKMAN 5.11.0+644
[vagrant@node1 ~]$ sdk install gradle 6.8.3

Downloading: gradle 6.8.3

In progress...

########################################################################################################### 100.0%

Installing: gradle 6.8.3
Done installing!

Setting gradle 6.8.3 as default.

gradeのインストールが完了したら、rpmをビルドします。

2021/5/14 最新のバージョンだと構築できなかったのでバージョン指定でインストールします。

linstor-serverのインストール

[vagrant@node1 ~]$ sudo dnf install -y rpm-build wget java-1.8.0-openjdk-devel python2 python3 lvm2
[vagrant@node1 ~]$ git clone --recursive git://github.com/LINBIT/linstor-server.git
[vagrant@node1 ~]$ cd linstor-server
[vagrant@node1 linstor-server]$ make tarball
[vagrant@node1 linstor-server]$ mkdir -p ~/rpmbuild/SOURCES
[vagrant@node1 linstor-server]$ cp linstor-server-*.tar.gz ~/rpmbuild/SOURCES
[vagrant@node1 linstor-server]$ rpmbuild -bb linstor.spec
[vagrant@node1 linstor-server]$ ls ~/rpmbuild/RPMS/noarch
linstor-common-1.11.1-1.el8.noarch.rpm
linstor-satellite-1.11.1-1.el8.noarch.rpm
linstor-controller-1.11.1-1.el8.noarch.rpm
[vagrant@node1 linstor-server]$ cd
[vagrant@node1 ~]$ sudo rpm -ivh rpmbuild/RPMS/noarch/*
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:linstor-common-1.11.1-1.el8      ################################# [ 33%]
   2:linstor-controller-1.11.1-1.el8  ################################# [ 67%]
   3:linstor-satellite-1.11.1-1.el8   ################################# [100%]

python-linstorのインストール

[vagrant@node1 ~]$ git clone --recursive git://github.com/LINBIT/linstor-api-py.git
[vagrant@node1 ~]$ cd linstor-api-py
[vagrant@node1 linstor-api-py]$ make rpm
[vagrant@node1 linstor-api-py]$ sudo rpm -ivh dist/python-linstor-*.noarch.rpm
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:python-linstor-1.6.0-1           ################################# [100%]
[vagrant@node1 linstor-api-py]$ cd

linstor-clientのインストール

[vagrant@node1 ~]$ git clone --recursive git://github.com/LINBIT/linstor-client.git
[vagrant@node1 ~]$ cd linstor-client
[vagrant@node1 linstor-client]$ make rpm
[vagrant@node1 linstor-client]$ sudo rpm -ivh -ivh dist/linstor-client-*.noarch.rpm
〜
D: Exit status: 0
[vagrant@node1 linstor-client]$ cd

出来上がったrpmをnode2にも配布

出来上がったrpmをnode2にもコピーし、インストールします。

[vagrant@node1 ~]$ scp rpmbuild/RPMS/noarch/*.rpm vagrant@192.168.200.11:~/
[vagrant@node1 ~]$ scp python-linstor-1.4.0/dist/python-linstor-*.noarch.rpm vagrant@192.168.200.11:~/
[vagrant@node1 ~]$ scp linstor-client-1.4.0/dist/linstor-client-*.noarch.rpm vagrant@192.168.200.11:~/
[vagrant@node2 ~]$ sudo dnf install -y java-1.8.0-openjdk-devel
[vagrant@node2 ~]$ sudo rpm -ivh *.rpm
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:linstor-common-1.11.1-1.el8      ################################# [ 20%]
   2:python-linstor-1.6.0-1           ################################# [ 40%]
   3:linstor-client-1.6.1-1           ################################# [ 60%]
   4:linstor-controller-1.11.1-1.el8  ################################# [ 80%]
   5:linstor-satellite-1.11.1-1.el8   ################################# [100%]

LVMの構成

node1, node2でLVMの設定を行います。

sudo dnf install -y lvm2
sudo parted /dev/vdb mklabel msdos
sudo parted /dev/vdb mkpart primary 0% 100%
sudo parted /dev/vdb set 1 lvm on
sudo pvcreate /dev/vdb1
sudo vgcreate pool1 /dev/vd2b1

LINSTORの起動

node1,node2でDRBDを起動します。

sudo systemctl enable --now drbd

node1でlinstor-contoller,linstor-sateliteを起動します。

[vagrant@node1 ~]$ sudo dnf install -y cryptsetup
[vagrant@node1 ~]$ sudo systemctl enable --now linstor-controller
[vagrant@node1 ~]$ sudo systemctl enable --now linstor-satellite

node2でlinstor-sateliteを起動します。

[vagrant@node2 ~]$ sudo dnf install -y cryptsetup
[vagrant@node2 ~]$ sudo systemctl enable --now linstor-satellite

クラスタへのノードの登録

node1で全ノードを登録します。

[vagrant@node1 ~]$ sudo linstor node create node1 192.168.200.10
Description:
    New node 'node1' registered.
Details:
    Node 'node1' UUID is: 5482d2bd-2f55-40fa-8dbe-d0ea64b039ea
SUCCESS:
Description:
    Node 'node1' authenticated

[vagrant@node1 ~]$ sudo linstor node create node2 192.168.200.11
SUCCESS:
Description:
    New node 'node2' registered.
Details:
    Node 'node2' UUID is: 7d199b9d-3fb2-44cf-8f9c-ea4e969ed8ba
SUCCESS:
Description:
    Node 'node2' authenticated

[vagrant@node1 ~] sudo linstor node list
╭──────────────────────────────────────────────────────────╮
┊ Node  ┊ NodeType  ┊ Addresses                   ┊ State  ┊
╞══════════════════════════════════════════════════════════╡
┊ node1 ┊ SATELLITE ┊ 192.168.200.10:3366 (PLAIN) ┊ Online ┊
┊ node2 ┊ SATELLITE ┊ 192.168.200.11:3366 (PLAIN) ┊ Online ┊
╰──────────────────────────────────────────────────────────╯

※追加直後はStateがOFFLINEになっています。10秒ほど待つとOnlineになります。

ボリュームの追加

ストレージプールの作成

作成したボリュームグループをストレージプールとして追加します。

[vagrant@node1 ~]$ sudo linstor storage-pool create lvm node1 pool1 pool1
SUCCESS:
    Successfully set property key(s): StorDriver/LvmVg
SUCCESS:
Description:
    New storage pool 'pool1' on node 'node1' registered.
Details:
    Storage pool 'pool1' on node 'node1' UUID is: bceda45e-0989-4829-a652-879f3e7f96fa
SUCCESS:
    (node1) Changes applied to storage pool 'pool1'
[vagrant@node1 ~]$ sudo linstor storage-pool create lvm node2 pool1 pool1
SUCCESS:
    Successfully set property key(s): StorDriver/LvmVg
SUCCESS:
Description:
    New storage pool 'pool1' on node 'node2' registered.
Details:
    Storage pool 'pool1' on node 'node2' UUID is: fe14cbde-36d3-43fd-90e5-8bf65eed7a7a
SUCCESS:
    (node2) Changes applied to storage pool 'pool1'

追加したストレージプールを確認します。

[vagrant@node1 ~]$ sudo linstor storage-pool list
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ StoragePool          ┊ Node  ┊ Driver   ┊ PoolName ┊ FreeCapacity ┊ TotalCapacity ┊ CanSnapshots ┊ State ┊
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ DfltDisklessStorPool ┊ node1 ┊ DISKLESS ┊          ┊              ┊               ┊ False        ┊ Ok    ┊
┊ DfltDisklessStorPool ┊ node2 ┊ DISKLESS ┊          ┊              ┊               ┊ False        ┊ Ok    ┊
┊ pool1                ┊ node1 ┊ LVM      ┊ pool1    ┊    20.00 GiB ┊     20.00 GiB ┊ False        ┊ Ok    ┊
┊ pool1                ┊ node2 ┊ LVM      ┊ pool1    ┊    20.00 GiB ┊     20.00 GiB ┊ False        ┊ Ok    ┊
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯

ボリュームの作成

リソース及びボリュームの定義を作成します。この時点ではボリュームの確保は行われてはいません。

[vagrant@node1 ~]$ sudo linstor resource-definition create data1
SUCCESS:
Description:
    New resource definition 'data1' created.
Details:
    Resource definition 'data1' UUID is: a0b70a09-9f53-4f67-ae88-ddf7336370fe

[vagrant@node1 ~]$ sudo linstor volume-definition create data1 1G
SUCCESS:
    New volume definition with number '0' of resource definition 'data1' created.

作成したボリューム定義を各ボリュームに配備します。

[vagrant@node1 ~]$ sudo linstor resource create data1 --auto-place 2
Description:
    Resource 'data1' successfully autoplaced on 2 nodes
Details:
    Used nodes (storage pool name): 'node1 (pool1)', 'node2 (pool1)'
WARNING:
    Could not find suitable node to automatically create a tie breaking resource for 'data1'.
SUCCESS:
    Created resource 'data1' on 'node2'
SUCCESS:
    Created resource 'data1' on 'node1'
SUCCESS:
Description:
    Resource 'data1' on 'node1' ready
Details:
    Auto-placing resource: data1
SUCCESS:
Description:
    Resource 'data1' on 'node2' ready
Details:
    Auto-placing resource: data1

配置したボリュームをリソース一覧、ボリューム定義一覧で配備されているのを確認します。

[vagrant@node1 ~]$ sudo linstor resource list
╭─────────────────────────────────────────────────────────────────────╮
┊ ResourceName ┊ Node  ┊ Port ┊ Usage  ┊ Conns ┊    State ┊ CreatedOn ┊
╞═════════════════════════════════════════════════════════════════════╡
┊ data1        ┊ node1 ┊ 7000 ┊ Unused ┊ Ok    ┊ UpToDate ┊           ┊
┊ data1        ┊ node2 ┊ 7000 ┊ Unused ┊ Ok    ┊ UpToDate ┊           ┊
╰─────────────────────────────────────────────────────────────────────╯
[vagrant@node1 ~]$ sudo linstor volume-definition list
╭───────────────────────────────────────────────────────────────╮
┊ ResourceName ┊ VolumeNr ┊ VolumeMinor ┊ Size  ┊ Gross ┊ State ┊
╞═══════════════════════════════════════════════════════════════╡
┊ data1        ┊ 0        ┊ 1000        ┊ 1 GiB ┊       ┊ ok    ┊
╰───────────────────────────────────────────────────────────────╯

作成したボリュームを使ってみる

作成したボリュームは、DRBDデバイスとして同様に使用ができます。

[vagrant@node1 ~]$ ll /dev/drbd*
brw-rw---- 1 root disk 147, 1000 Oct 31 11:16 /dev/drbd1000

[vagrant@node1 ~]$ sudo drbdadm status
  disk:UpToDate
  node2 role:Secondary
    peer-disk:UpToDate

[vagrant@node1 ~]$ sudo mkfs.xfs /dev/drbd1000
[vagrant@node1 ~]$ sudo mkdir /mnt/drbd
[vagrant@node1 ~]$ sudo mount /dev/drbd1000 /mnt/drbd
[vagrant@node1 ~]$ df -hT /mnt/drbd
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/drbd1000  xfs  1018M   40M  979M   4% /mnt/drbd

ノードを追加してみる

新しく3台目のサーバを追加してみます。追加するサーバは以下の通りです。

ホスト名 IPアドレス ディスク
node3 192.168.200.12 /dev/vdb

DRBDもインストールしておきます。

パッケージの配布

node1で作成したrpmを配布します。

[vagrant@node1 ~]$ scp rpmbuild/RPMS/noarch/*.rpm vagrant@192.168.200.12:~/
[vagrant@node1 ~]$ scp python-linstor-1.4.0/dist/python-linstor-1.4.0-1.noarch.rpm vagrant@192.168.200.12:~/
[vagrant@node1 ~]$ scp linstor-client-1.4.0/dist/linstor-client-1.4.0-1.noarch.rpm vagrant@192.168.200.12:~/
[vagrant@node3 ~]$ sudo dnf install -y java-1.8.0-openjdk-devel lvm2
[vagrant@node3 ~]$ sudo rpm -ivh *.rpm
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:linstor-common-1.7.2-1.el8       ################################# [ 20%]
   2:python-linstor-1.4.0-1           ################################# [ 40%]
   3:linstor-client-1.4.0-1           ################################# [ 60%]
   4:linstor-controller-1.7.2-1.el8   ################################# [ 80%]
   5:linstor-satellite-1.7.2-1.el8    ################################# [100%]
[vagrant@node3 ~]$ sudo systemctl enable --now drbd
[vagrant@node3 ~]$ sudo systemctl enable --now linstor-satellite

LVMの作成

node3もLVMを作成します。

[vagrant@node3 ~]$ sudo parted /dev/vdb mklabel msdos
[vagrant@node3 ~]$ sudo parted /dev/vdb mkpart primary 0% 100%
[vagrant@node3 ~]$ sudo parted /dev/vdb set 1 lvm on
[vagrant@node3 ~]$ sudo pvcreate /dev/vdb1
[vagrant@node3 ~]$ sudo vgcreate pool1 /dev/vdb1

ノードの追加

node3もクラスタのノードに追加します。

[vagrant@node1 ~]$ sudo linstor node create node3 192.168.200.12
SUCCESS:
Description:
    New node 'node3' registered.
Details:
    Node 'node3' UUID is: b3973735-1fc5-45af-9b9b-68bc10071e72
WARNING:
Description:
    No active connection to satellite 'node3'
Details:
    The controller is trying to (re-) establish a connection to the satellite. The controller stored the changes and as soon the satellite is connected, it will receive this update.
WARNING:
    Could not find suitable node to automatically create a tie breaking resource for 'data1'.

[vagrant@node1 ~]$ sudo linstor node list
╭──────────────────────────────────────────────────────────╮
┊ Node  ┊ NodeType  ┊ Addresses                   ┊ State  ┊
╞══════════════════════════════════════════════════════════╡
┊ node1 ┊ SATELLITE ┊ 192.168.200.10:3366 (PLAIN) ┊ Online ┊
┊ node2 ┊ SATELLITE ┊ 192.168.200.11:3366 (PLAIN) ┊ Online ┊
┊ node3 ┊ SATELLITE ┊ 192.168.200.12:3366 (PLAIN) ┊ Online ┊
╰──────────────────────────────────────────────────────────╯

ストレージプールの追加

node3のLVMをストレージプールに追加します。

[vagrant@node1 ~]$ sudo linstor storage-pool create lvm node3 pool1 pool1
UCCESS:
    Successfully set property key(s): StorDriver/LvmVg
SUCCESS:
Description:
    New storage pool 'pool1' on node 'node3' registered.
Details:
    Storage pool 'pool1' on node 'node3' UUID is: 68d6660f-b9ee-4ef8-bec9-19b4c42abea1
SUCCESS:
    (node3) Changes applied to storage pool 'pool1'

[vagrant@node1 ~]$ sudo linstor storage-pool list
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ StoragePool          ┊ Node  ┊ Driver   ┊ PoolName ┊ FreeCapacity ┊ TotalCapacity ┊ CanSnapshots ┊ State ┊
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ DfltDisklessStorPool ┊ node1 ┊ DISKLESS ┊          ┊              ┊               ┊ False        ┊ Ok    ┊
┊ DfltDisklessStorPool ┊ node2 ┊ DISKLESS ┊          ┊              ┊               ┊ False        ┊ Ok    ┊
┊ DfltDisklessStorPool ┊ node3 ┊ DISKLESS ┊          ┊              ┊               ┊ False        ┊ Ok    ┊
┊ pool1                ┊ node1 ┊ LVM      ┊ pool1    ┊    18.99 GiB ┊     20.00 GiB ┊ False        ┊ Ok    ┊
┊ pool1                ┊ node2 ┊ LVM      ┊ pool1    ┊    18.99 GiB ┊     20.00 GiB ┊ False        ┊ Ok    ┊
┊ pool1                ┊ node3 ┊ LVM      ┊ pool1    ┊    20.00 GiB ┊     20.00 GiB ┊ False        ┊ Ok    ┊
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯

リソース、ボリュームを定義してnode2,node3に配備します。

[vagrant@node1 ~]$ sudo linstor resource-definition create data2
[vagrant@node1 ~]$ sudo linstor volume-definition create data2 1G
[vagrant@node1 ~]$ sudo linstor resource create node2 data2 --storage-pool pool1
[vagrant@node1 ~]$ sudo linstor resource create node3 data2 --storage-pool pool1
[vagrant@node1 ~]$ sudo linstor resource list
╭─────────────────────────────────────────────────────────────────────╮
┊ ResourceName ┊ Node  ┊ Port ┊ Usage  ┊ Conns ┊    State ┊ CreatedOn ┊
╞═════════════════════════════════════════════════════════════════════╡
┊ data1        ┊ node1 ┊ 7000 ┊ Unused ┊ Ok    ┊ UpToDate ┊           ┊
┊ data1        ┊ node2 ┊ 7000 ┊ Unused ┊ Ok    ┊ UpToDate ┊           ┊
┊ data2        ┊ node2 ┊ 7001 ┊ Unused ┊ Ok    ┊ UpToDate ┊           ┊
┊ data2        ┊ node3 ┊ 7001 ┊ Unused ┊ Ok    ┊ UpToDate ┊           ┊
╰─────────────────────────────────────────────────────────────────────╯

最後に

LINSTORを使うことによってDRBDデバイスがlinstor-controllerをインストールしたサーバのコマンドで完結できるのが良いですね。また、ノードの追加もDRBD生で使うよりも遥かに簡単にできます。DRBD9+LINSTORでSDSをやるには十分です。SDSとして使うにはOpenStack、Kubernetesと組み合わせるのが一番です。機会があったら組み合わせて使ってみたいです。