2016年11月30日水曜日

LIO, DRBD, Pacemaker による冗長化 iSCSI Target(その14)Munin インストール、設定

Munin をインストールし、必要な設定を入れます。
Active 機と Stand-by 機の両方で実行します。
LIO プラグインの設定時には、リソースが稼働している(LIO が LUN をエクスポートしている)側で操作する必要があるので、スイッチオーバさせて順次実行します。

インターネット接続可能な端末で以下のコマンドを実行する等して、必要なパッケージを収集します。


curl -O http://yum.oracle.com/repo/OracleLinux/OL7/optional/latest/x86_64/getPackage/perl-Crypt-DES-2.05-20.el7.x86_64.rpm
curl -O http://yum.oracle.com/repo/OracleLinux/OL7/optional/latest/x86_64/getPackage/perl-File-Copy-Recursive-0.38-14.el7.noarch.rpm
curl -O http://yum.oracle.com/repo/OracleLinux/OL7/optional/latest/x86_64/getPackage/perl-Taint-Runtime-0.03-19.el7.x86_64.rpm
curl -O http://yum.oracle.com/repo/OracleLinux/OL7/optional/latest/x86_64/getPackage/perl-XML-DOM-1.44-19.el7.noarch.rpm
curl -O http://yum.oracle.com/repo/OracleLinux/OL7/optional/latest/x86_64/getPackage/perl-XML-RegExp-0.04-2.el7.noarch.rpm
curl -O http://yum.oracle.com/repo/OracleLinux/OL7/optional/latest/x86_64/getPackage/rrdtool-perl-1.4.8-9.el7.x86_64.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/m/munin-2.0.25-11.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/m/munin-common-2.0.25-11.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/m/munin-node-2.0.25-11.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Cache-Cache-1.06-12.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Email-Date-Format-1.002-15.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-HTML-Template-2.95-1.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-IO-Multiplex-1.13-6.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-IPC-ShareLite-0.17-12.el7.x86_64.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Log-Dispatch-FileRotate-1.19-13.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Log-Log4perl-1.42-2.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-MIME-Lite-3.030-1.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-MIME-Types-1.38-2.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Net-CIDR-0.18-1.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Net-SNMP-6.0.1-7.el7.noarch.rpm
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/p/perl-Net-Server-2.007-2.el7.noarch.rpm


収集したパッケージを管理者用一般ユーザのホームディレクトリにコピーします。

コピーされたファイルを確認します。


ls -l *.rpm
-rw-rw-r-- 1 admin admin 410308 Nov 20 19:02 drbd84-utils-8.9.6-1.el7.elrepo.x86_64.rpm
-rw-rw-r-- 1 admin admin 204328 Nov 20 19:34 munin-2.0.25-11.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  93672 Nov 20 19:34 munin-common-2.0.25-11.el7.noarch.rpm
-rw-rw-r-- 1 admin admin 408204 Nov 20 19:34 munin-node-2.0.25-11.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  93340 Nov 20 19:34 perl-Cache-Cache-1.06-12.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  19920 Nov 20 19:34 perl-Crypt-DES-2.05-20.el7.x86_64.rpm
-rw-rw-r-- 1 admin admin  17524 Nov 20 19:34 perl-Email-Date-Format-1.002-15.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  23164 Nov 20 19:34 perl-File-Copy-Recursive-0.38-14.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  77780 Nov 20 19:34 perl-HTML-Template-2.95-1.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  25616 Nov 20 19:34 perl-IO-Multiplex-1.13-6.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  31004 Nov 20 19:34 perl-IPC-ShareLite-0.17-12.el7.x86_64.rpm
-rw-rw-r-- 1 admin admin  84300 Nov 20 19:34 perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
-rw-rw-r-- 1 admin admin  25232 Nov 20 19:34 perl-Log-Dispatch-FileRotate-1.19-13.el7.noarch.rpm
-rw-rw-r-- 1 admin admin 433560 Nov 20 19:34 perl-Log-Log4perl-1.42-2.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  60212 Nov 20 19:34 perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  29540 Nov 20 19:35 perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  98316 Nov 20 19:34 perl-MIME-Lite-3.030-1.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  39184 Nov 20 19:34 perl-MIME-Types-1.38-2.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  19640 Nov 20 19:35 perl-Net-CIDR-0.18-1.el7.noarch.rpm
-rw-rw-r-- 1 admin admin 213136 Nov 20 19:35 perl-Net-Server-2.007-2.el7.noarch.rpm
-rw-rw-r-- 1 admin admin 105348 Nov 20 19:35 perl-Net-SNMP-6.0.1-7.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  22496 Nov 20 19:34 perl-Taint-Runtime-0.03-19.el7.x86_64.rpm
-rw-rw-r-- 1 admin admin 141504 Nov 20 19:34 perl-XML-DOM-1.44-19.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  10628 Nov 20 19:34 perl-XML-RegExp-0.04-2.el7.noarch.rpm
-rw-rw-r-- 1 admin admin  42864 Nov 20 19:34 rrdtool-perl-1.4.8-9.el7.x86_64.rpm

file *.rpm
drbd84-utils-8.9.6-1.el7.elrepo.x86_64.rpm:          RPM v3.0 bin i386/x86_64 drbd84-utils-8.9.6-1.el7.elrepo
munin-2.0.25-11.el7.noarch.rpm:                      RPM v3.0 bin noarch munin-2.0.25-11.el7
munin-common-2.0.25-11.el7.noarch.rpm:               RPM v3.0 bin noarch munin-common-2.0.25-11.el7
munin-node-2.0.25-11.el7.noarch.rpm:                 RPM v3.0 bin noarch munin-node-2.0.25-11.el7
perl-Cache-Cache-1.06-12.el7.noarch.rpm:             RPM v3.0 bin noarch perl-Cache-Cache-1.06-12.el7
perl-Crypt-DES-2.05-20.el7.x86_64.rpm:               RPM v3.0 bin i386/x86_64 perl-Crypt-DES-2.05-20.el7
perl-Email-Date-Format-1.002-15.el7.noarch.rpm:      RPM v3.0 bin noarch perl-Email-Date-Format-1.002-15.el7
perl-File-Copy-Recursive-0.38-14.el7.noarch.rpm:     RPM v3.0 bin noarch perl-File-Copy-Recursive-0.38-14.el7
perl-HTML-Template-2.95-1.el7.noarch.rpm:            RPM v3.0 bin noarch perl-HTML-Template-2.95-1.el7
perl-IO-Multiplex-1.13-6.el7.noarch.rpm:             RPM v3.0 bin noarch perl-IO-Multiplex-1.13-6.el7
perl-IPC-ShareLite-0.17-12.el7.x86_64.rpm:           RPM v3.0 bin i386/x86_64 perl-IPC-ShareLite-0.17-12.el7
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm:           RPM v3.0 bin noarch perl-Log-Dispatch-2.41-1.el7.1
perl-Log-Dispatch-FileRotate-1.19-13.el7.noarch.rpm: RPM v3.0 bin noarch perl-Log-Dispatch-FileRotate-1.19-13.el7
perl-Log-Log4perl-1.42-2.el7.noarch.rpm:             RPM v3.0 bin noarch perl-Log-Log4perl-1.42-2.el7
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm:            RPM v3.0 bin noarch perl-Mail-Sender-0.8.23-1.el7
perl-Mail-Sendmail-0.79-21.el7.noarch.rpm:           RPM v3.0 bin noarch perl-Mail-Sendmail-0.79-21.el7
perl-MIME-Lite-3.030-1.el7.noarch.rpm:               RPM v3.0 bin noarch perl-MIME-Lite-3.030-1.el7
perl-MIME-Types-1.38-2.el7.noarch.rpm:               RPM v3.0 bin noarch perl-MIME-Types-1.38-2.el7
perl-Net-CIDR-0.18-1.el7.noarch.rpm:                 RPM v3.0 bin noarch perl-Net-CIDR-0.18-1.el7
perl-Net-Server-2.007-2.el7.noarch.rpm:              RPM v3.0 bin noarch perl-Net-Server-2.007-2.el7
perl-Net-SNMP-6.0.1-7.el7.noarch.rpm:                RPM v3.0 bin noarch perl-Net-SNMP-6.0.1-7.el7
perl-Taint-Runtime-0.03-19.el7.x86_64.rpm:           RPM v3.0 bin i386/x86_64 perl-Taint-Runtime-0.03-19.el7
perl-XML-DOM-1.44-19.el7.noarch.rpm:                 RPM v3.0 bin noarch perl-XML-DOM-1.44-19.el7
perl-XML-RegExp-0.04-2.el7.noarch.rpm:               RPM v3.0 bin noarch perl-XML-RegExp-0.04-2.el7
rrdtool-perl-1.4.8-9.el7.x86_64.rpm:                 RPM v3.0 bin i386/x86_64 rrdtool-perl-1.4.8-9.el7


インストーラを DVD ドライブにセットし、マウントします。


sudo mount /dev/cdrom /mnt


Munin をインストールします。


sudo yum -y --disablerepo=\* --enablerepo=media install httpd
sudo yum -y --disablerepo=\* --enablerepo=media localinstall perl-*.rpm rrdtool-perl-*.rpm munin-*.rpm


インストーラをアンマウントし、DVD ドライブから取り出します。


sudo umount /mnt


追加インストールしたパッケージの設定をバックアップします。


sudo cp -a /etc{,~}/cron.d/munin
sudo cp -a /etc{,~}/fonts
sudo cp -a /etc{,~}/httpd
sudo cp -a /etc{,~}/logrotate.d/httpd
sudo cp -a /etc{,~}/logrotate.d/munin
sudo cp -a /etc{,~}/logrotate.d/munin-node
sudo cp -a /etc{,~}/munin
sudo cp -a /etc{,~}/sysconfig/htcacheclean
sudo cp -a /etc{,~}/sysconfig/httpd
sudo cp -a /etc/passwd   /etc~/passwd_$(date +%Y%m%d_%H%M%S)
sudo cp -a /etc/passwd-  /etc~/passwd-_$(date +%Y%m%d_%H%M%S)
sudo cp -a /etc/shadow   /etc~/shadow_$(date +%Y%m%d_%H%M%S)
sudo cp -a /etc/shadow-  /etc~/shadow-_$(date +%Y%m%d_%H%M%S)
sudo cp -a /etc/group    /etc~/group_$(date +%Y%m%d_%H%M%S)
sudo cp -a /etc/group-   /etc~/group-_$(date +%Y%m%d_%H%M%S)
sudo cp -a /etc/gshadow  /etc~/gshadow_$(date +%Y%m%d_%H%M%S)
sudo cp -a /etc/gshadow- /etc~/gshadow-_$(date +%Y%m%d_%H%M%S)


前稿、前々稿で紹介した5つのプラグインを /usr/share/munin/plugins/ に配置し、実行権限を付与します。

有効化されている不要なプラグインを削除します。


sudo rm /etc/munin/plugins/postfix_mail*
sudo rm /etc/munin/plugins/fw_packets


Munin の稼働状況をグラフ化するプラグイン用の設定を行います。


cat << 'EOF' | sudo tee -a /etc/munin/plugin-conf.d/munin-node

[munin_*]
user munin
EOF


Munin の稼働状況をグラフ化するプラグインを有効化します。


sudo ln -s '/usr/share/munin/plugins/http_loadtime' '/etc/munin/plugins/http_loadtime'
sudo ln -s '/usr/share/munin/plugins/munin_stats' '/etc/munin/plugins/munin_stats'
sudo ln -s '/usr/share/munin/plugins/munin_update' '/etc/munin/plugins/munin_update'


DRBD の稼働状況をグラフ化するプラグインを有効化します。


sudo ln -s '/usr/share/munin/plugins/drbd' '/etc/munin/plugins/drbd'
sudo ln -s '/usr/share/munin/plugins/drbd_al' '/etc/munin/plugins/drbd_al'
sudo ln -s '/usr/share/munin/plugins/drbd_ext' '/etc/munin/plugins/drbd_ext'


Munin にホスト名を登録します。


sudo sed -i -e "s/^host_name .*\$/host_name $(uname -n)/" /etc/munin/munin-node.conf
sudo sed -i -e "s/^\\[localhost/[$(uname -n)/" /etc/munin/munin.conf


rhel7 の systemd で新設された PrivateTmp 機能を munin-node.service については無効化します。一部のプラグインが対応していないためです。今回利用するプラグインには無関係です。


sudo sed -i -e 's/^PrivateTmp=.*$/PrivateTmp=false/' /usr/lib/systemd/system/munin-node.service
sudo systemctl daemon-reload


ベーシック認証設定を行います。


sudo htpasswd -c -b /etc/munin/munin-htpasswd munin 'password'
sudo htpasswd -b /etc/munin/munin-htpasswd admin 'password'
sudo htpasswd -b /etc/munin/munin-htpasswd monitor 'password'


Active 機で、LIO の稼働状況をグラフ化するプラグインを有効化します。


sudo ln -s '/usr/share/munin/plugins/lio_read' '/etc/munin/plugins/lio_read'
sudo ln -s '/usr/share/munin/plugins/lio_write' '/etc/munin/plugins/lio_write'


Active 機で、Munin 関連サービスを自動起動するように変更し、起動します。


sudo systemctl enable munin-node.service
sudo systemctl enable httpd.service
sudo systemctl start munin-node.service
sudo systemctl start httpd.service


数十分待ってから、ブラウザで http://<ホスト名または IP アドレス>/munin/ へアクセスし、動作確認します。

リソースをスイッチオーバします。


sudo pcs resource move g_tgt; sleep 5; sudo pcs resource clear g_tgt


Stand-by 機で、LIO の稼働状況をグラフ化するプラグインを有効化します。


sudo ln -s '/usr/share/munin/plugins/lio_read' '/etc/munin/plugins/lio_read'
sudo ln -s '/usr/share/munin/plugins/lio_write' '/etc/munin/plugins/lio_write'


Stand-by 機で、Munin 関連サービスを自動起動するように変更し、起動します。


sudo systemctl enable munin-node.service
sudo systemctl enable httpd.service
sudo systemctl start munin-node.service
sudo systemctl start httpd.service


数十分待ってから、ブラウザで http://<ホスト名または IP アドレス>/munin/ へアクセスし、動作確認します。

リソースをスイッチバックします。


sudo pcs resource move g_tgt; sleep 5; sudo pcs resource clear g_tgt


2016年11月29日火曜日

LIO, DRBD, Pacemaker による冗長化 iSCSI Target (その13)Munin用プラグイン(LIO)

今回は、LIO に関するプラグインを紹介します。

元ネタになりそうなものを探したのですが、見つからなかったのでスクラッチで作りました。
perl スクリプトではなく、シェルスクリプトにしました。

Read と Write は別のグラフにしましたが、1つのグラフの中にターゲット、イニシエータ、LUN、の全ての組み合わせを詰め込みましたので、接続数が多くなると見やすくはないと思います。
ターゲット、LUN 別に作るとか、折れ線グラフではなく、塗りつぶしのスタックで表現した方が見やすいとか、いろいろと改造の余地はあると思いますが、とりあえずたたき台としてもらえればと思います。

Read/Write 以外にも、グラフ化した方が有用な情報があるのではないかと思いますが、私のスキルでは選びきれなかったので、とりあえず必要そうなすべての情報をテキストで保存しておけば役に立つのではないか、と考えております。

/sys/kernel/config/target/ 配下にある情報を全て取得すると、私のテスト環境では、仮想サーバで6秒ほど、物理サーバで1秒強かかりました。


sudo mkdir -p /etc/lio
sudo mkdir -p /var/log/lio/

cat << 'EOF' | sudo tee /etc/lio/save
#!/bin/sh
FILE=/dev/shm/lio-$(date +%Y%m%d%H%M)
for i in $(find /sys/kernel/config/target ! -type d | LANG=C sort)
 do echo [$i]; cat $i; echo; done > $FILE 2> /dev/null
gzip $FILE
mv $FILE.gz /var/log/lio/
EOF
sudo chmod 755 /etc/lio/save


これを1分ごとに収集するのは負荷が高すぎると判断しております。多くのデータは値が変化しないので、無駄が多すぎます。1時間に1回取得する方向で考えます。

もう少し絞り込むことにします。

/sys/kernel/config/target/core/*/*/statistics
/sys/kernel/config/target/iscsi/*/fabric_statistics
/sys/kernel/config/target/iscsi/*/tpgt_1/acls/*/fabric_statistics
/sys/kernel/config/target/iscsi/*/tpgt_1/acls/*/*/statistics
/sys/kernel/config/target/iscsi/*/tpgt_1/lun/*/statistics
この配下にある情報を1分ごとに取得する、というあたりが妥協点だと考えました。「statistics (統計)」というディレクトリ配下に有用な統計情報が集約されている、ということにします。
これだけであれば、仮想マシンでも1秒かからずに収集できました。


cat << 'EOF' | sudo tee /etc/lio/statistics
#!/bin/sh
FILE=/dev/shm/lio-statistics-$(date +%Y%m%d%H%M)
YYYYMMDD=$(echo $FILE | sed -e 's/^.*\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)[0-9][0-9][0-9][0-9]$/\1/')
for i in $(for k in /sys/kernel/config/target/{core/*/*/,iscsi/*/{fabric_,tpgt_1/{acls/*/{fabric_,*/},lun/*/}}}statistics; do echo $k; done | LANG=C sort)
 do for j in $(find $i ! -type d | LANG=C sort); do echo [$j]; cat $j; echo; done; done > $FILE 2> /dev/null
gzip $FILE
mkdir -p /var/log/lio/$YYYYMMDD/
mv $FILE.gz /var/log/lio/$YYYYMMDD/
EOF
sudo chmod 755 /etc/lio/statistics


これらの情報を貯めこむと1年あたり 1GB 程度になる見込みです。1年経過したものは削除する、ということでいいと思います。1つのディレクトリに大量のファイルを置くのはよくないので、毎日別のディレクトリに入れるということで。
タダの HDD の肥やしになりそうな予感がしていますが、取得しておけばよかった、とならないための用心です。


cat << 'EOF' | sudo tee /etc/cron.d/lio
59 * * * * root nice -n 19 /etc/lio/save
* * * * * root nice -n 19 /etc/lio/statistics
58 23 * * * root nice -n 19 /bin/find /var/log/lio -mtime +365 -print0 | xargs -0 rm -rfv 2> /dev/null
EOF




Munin 用プラグインは以下の通りです。GitHubに置きました。

iqn については、「:」以降の文字列のみを切り出して表示しています。


https://raw.githubusercontent.com/blog-pcoffice/public/master/lio_read

cat << 'EOF' | sudo tee /usr/share/munin/plugins/lio_read
#!/bin/sh
#%# family=auto
#%# capabilities=autoconf

if [ "$1" = "autoconf" ]; then
  if [ -d /sys/kernel/config/target/iscsi/iqn.*/tpgt_1 ]; then
    echo yes
  else
    echo 'no (no iscsi target)'
  fi
  exit 0
fi
if [ "$1" = "config" ]; then
  echo 'graph_title LIO (Read)'
  echo 'graph_category LIO'
  echo 'graph_info Graph LIO (Read)'
  echo 'graph_vlabel Graph LIO (Bytes/sec)'
  echo 'graph_scale yes'
  echo 'graph_args --base 1024 --lower-limit 0'
  echo 'graph_period second'
#  echo 'graph_height 200'
#  echo 'graph_width 400'
  echo 'graph_printf %7.2lf'

  TGT_=
  INI_=
  for i in $(echo /sys/kernel/config/target/iscsi/iqn.*/tpgt_1/acls/iqn.*/*/statistics/scsi_auth_intr/read_mbytes | LANG=C sort)
  do
    TGT=$(echo $i | cut -d/ -f7)
    INI=$(echo $i | cut -d/ -f10)
    LUN=$(echo $i | cut -d/ -f11)
    if [ "$TGT_" = "$TGT" ]; then
      if [ "$INI_" = "$INI" ]; then
        :
      else
        INI_=$INI
        INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
      fi
    else
       TGT_=$TGT
       TGT_F=$(echo $TGT | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
       INI_=$INI
       INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
       for j in $(echo /sys/kernel/config/target/iscsi/$TGT/tpgt_1/lun/*/statistics/scsi_tgt_port/read_mbytes | LANG=C sort)
       do
         LUN_=$(echo $j | cut -d/ -f10)
         echo ${TGT_F}$LUN_.label $(echo $TGT | cut -d: -f2) \($LUN_\) Read
         echo ${TGT_F}$LUN_.cdef ${TGT_F}$LUN_,1048576,\*
         echo ${TGT_F}$LUN_.min 0
         echo ${TGT_F}$LUN_.type DERIVE
       done
    fi
    echo ${TGT_F}${INI_F}$LUN.label $(echo $TGT | cut -d: -f2) - $(echo $INI | cut -d: -f2) \($LUN\) Read
    echo ${TGT_F}${INI_F}$LUN.cdef ${TGT_F}${INI_F}$LUN,1048576,\*
    echo ${TGT_F}${INI_F}$LUN.min 0
    echo ${TGT_F}${INI_F}$LUN.type DERIVE
  done
  exit 0
fi

TGT_=
INI_=
for i in $(echo /sys/kernel/config/target/iscsi/iqn.*/tpgt_1/acls/iqn.*/*/statistics/scsi_auth_intr/read_mbytes | LANG=C sort)
do
  TGT=$(echo $i | cut -d/ -f7)
  INI=$(echo $i | cut -d/ -f10)
  LUN=$(echo $i | cut -d/ -f11)
  if [ "$TGT_" = "$TGT" ]; then
    if [ "$INI_" = "$INI" ]; then
      :
    else
      INI_=$INI
      INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
    fi
  else
     TGT_=$TGT
     TGT_F=$(echo $TGT | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
     INI_=$INI
     INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
     for j in $(echo /sys/kernel/config/target/iscsi/$TGT/tpgt_1/lun/*/statistics/scsi_tgt_port/read_mbytes | LANG=C sort)
     do
       LUN_=$(echo $j | cut -d/ -f10)
       echo -n "${TGT_F}$LUN_.value "
       cat $j
     done
  fi
  echo -n "${TGT_F}${INI_F}$LUN.value "
  cat $i
done

exit 0;
EOF
sudo chmod 755 /usr/share/munin/plugins/lio_read



https://raw.githubusercontent.com/blog-pcoffice/public/master/lio_write

cat << 'EOF' | sudo tee /usr/share/munin/plugins/lio_write
#!/bin/sh
#%# family=auto
#%# capabilities=autoconf

if [ "$1" = "autoconf" ]; then
  if [ -d /sys/kernel/config/target/iscsi/iqn.*/tpgt_1 ]; then
    echo yes
  else
    echo 'no (no iscsi target)'
  fi
  exit 0
fi
if [ "$1" = "config" ]; then
  echo 'graph_title LIO (Write)'
  echo 'graph_category LIO'
  echo 'graph_info Graph LIO (Write)'
  echo 'graph_vlabel Graph LIO (Bytes/sec)'
  echo 'graph_scale yes'
  echo 'graph_args --base 1024 --lower-limit 0'
  echo 'graph_period second'
#  echo 'graph_height 200'
#  echo 'graph_width 400'
  echo 'graph_printf %7.2lf'

  TGT_=
  INI_=
  for i in $(echo /sys/kernel/config/target/iscsi/iqn.*/tpgt_1/acls/iqn.*/*/statistics/scsi_auth_intr/write_mbytes | LANG=C sort)
  do
    TGT=$(echo $i | cut -d/ -f7)
    INI=$(echo $i | cut -d/ -f10)
    LUN=$(echo $i | cut -d/ -f11)
    if [ "$TGT_" = "$TGT" ]; then
      if [ "$INI_" = "$INI" ]; then
        :
      else
        INI_=$INI
        INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
      fi
    else
       TGT_=$TGT
       TGT_F=$(echo $TGT | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
       INI_=$INI
       INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
       for j in $(echo /sys/kernel/config/target/iscsi/$TGT/tpgt_1/lun/*/statistics/scsi_tgt_port/write_mbytes | LANG=C sort)
       do
         LUN_=$(echo $j | cut -d/ -f10)
         echo ${TGT_F}$LUN_.label $(echo $TGT | cut -d: -f2) \($LUN_\) Write
         echo ${TGT_F}$LUN_.cdef ${TGT_F}$LUN_,1048576,\*
         echo ${TGT_F}$LUN_.min 0
         echo ${TGT_F}$LUN_.type DERIVE
       done
    fi
    echo ${TGT_F}${INI_F}$LUN.label $(echo $TGT | cut -d: -f2) - $(echo $INI | cut -d: -f2) \($LUN\) Write
    echo ${TGT_F}${INI_F}$LUN.cdef ${TGT_F}${INI_F}$LUN,1048576,\*
    echo ${TGT_F}${INI_F}$LUN.min 0
    echo ${TGT_F}${INI_F}$LUN.type DERIVE
  done
  exit 0
fi

TGT_=
INI_=
for i in $(echo /sys/kernel/config/target/iscsi/iqn.*/tpgt_1/acls/iqn.*/*/statistics/scsi_auth_intr/write_mbytes | LANG=C sort)
do
  TGT=$(echo $i | cut -d/ -f7)
  INI=$(echo $i | cut -d/ -f10)
  LUN=$(echo $i | cut -d/ -f11)
  if [ "$TGT_" = "$TGT" ]; then
    if [ "$INI_" = "$INI" ]; then
      :
    else
      INI_=$INI
      INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
    fi
  else
     TGT_=$TGT
     TGT_F=$(echo $TGT | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
     INI_=$INI
     INI_F=$(echo $INI | tr "[:upper:]" "[:lower:]" | sed -e 's/-/_/g' -e 's![^a-z0-9_]!!g')
     for j in $(echo /sys/kernel/config/target/iscsi/$TGT/tpgt_1/lun/*/statistics/scsi_tgt_port/write_mbytes | LANG=C sort)
     do
       LUN_=$(echo $j | cut -d/ -f10)
       echo -n "${TGT_F}$LUN_.value "
       cat $j
     done
  fi
  echo -n "${TGT_F}${INI_F}$LUN.value "
  cat $i
done

exit 0;
EOF
sudo chmod 755 /usr/share/munin/plugins/lio_write




LIO, DRBD, Pacemaker による冗長化 iSCSI Target (その12)Munin用プラグイン(DRBD)

Munin 用のプラグインを作りました。

rhel サーバ個別のリソース監視を考えた場合、ほとんどの環境で有益なものはどれかと考えると、Munin しか選択肢がないのではないかと思います。既存環境では、Zabbix やその他の監視ソフトが既に動いていて、それらの邪魔にならないものでなければなりません。グラフ化が簡単にできるもの、負荷が軽いもの、インストールが容易なもの(本格的な RDBMS 不要は最低条件)、と考えると、RRD(Round Robin Database) Tool を利用している Munin に白羽の矢が立ちます。MRTG は rhel7 の標準パッケージとなっているという魅力がありますが、2値しかグラフ化できないことと、設定ファイルを作成するのが面倒で、候補から外れました。オープンソースを気軽に持ち込めない場合には、MRTG という選択肢は有用です。

Munin は、自動設定が進んでいて、プラグインが用意されているものを利用する限りにおいては、導入が簡単です。デフォルト設定のままだとホスト名が localhost になってしまう等の見た目を気にしなければ、インストールして、認証設定を入れ、サービス起動するだけです。
自動設定されたプラグインを個別に無効化したい場合は、シンボリックリンクを削除してサービスを再起動するだけで済みます。Zabbix 等でグラフ化しているのであれば、重複するものだけを除外するということも簡単にできます。


今回は、DRBD に関するプラグインを紹介します。

元ネタは以下にあります。

https://github.com/munin-monitoring/contrib/tree/master/plugins/drbd

2012年にコミットされてから変更されていないようです。
「drbd-stat」については、dr, dw, nr, ns の値が1024倍されていないです。
「drbd」については、dr, dw, nr, ns の値が1024倍ではなく、819倍されています。理由が分かりませんでした。ご存知の方がいらっしゃいましたら教えてください。
とりあえず、819倍の話は忘れて、以下の3つのプラグインを作りました。

dr(Disk Read), dw(Disk Write), nr(Network Receive), ns(Network Send), oos(Out Of Sync) については、KByte 単位の値が取得できるので、1つのグラフ内にまとめました。
その他の統計値に関するものを1つのグラフにまとめました。ただし、al(Activity Log) に関しては、取得される値が大きかったので、他の値に関するグラフが意味のないものになってしまうのを避けるため、別のグラフにしました。oos に関しても別グラフにした方がよいかもしれませんが、そこまではこだわらないことにします。
以上の3つです。
Disk アクセスと Netwok アクセスは、ほぼ同じ値になるため重なり合ってしまうので、分けてしまう方がいいのかもしれません。Primary と Secondary が入れ替わっても、別の種類でほぼ同じ値になってしまいます。グラフの読み方を理解していれば問題ないとも言えます。

気が向いたら、dr&,dw, nr&ns, oos, al, bm, lo, pe, ua, ap, ep の10個のグラフに分割します。

以下の DRBD8.4 に関するマニュアルを参照しながら作りました。
http://www.drbd.org/en/doc/users-guide-84/ch-admin#s-performance-indicators

ソースコードは GitHub にも置きました。


https://raw.githubusercontent.com/blog-pcoffice/public/master/drbd

cat << 'EOF' | sudo tee /usr/share/munin/plugins/drbd
#!/usr/bin/perl
#%# family=auto
#%# capabilities=autoconf
# http://www.drbd.org/en/doc/users-guide-84/ch-admin#s-performance-indicators

use strict;
my $file="/proc/drbd";
my $store = {};
my $rid;

&crunch;
&display;

sub display{
  if ($ARGV[0] and $ARGV[0] eq "config"){
    print "graph_title DRBD\n";
    print "graph_category DRBD\n";
    print "graph_info Graph DRBD\n";
    print "graph_vlabel Graph DRBD (Bytes/sec)\n";
    print "graph_scale yes\n";
    print "graph_args --base 1024 --lower-limit 0\n";
    print "graph_period second\n";
    print "graph_height 200\n";
    print "graph_width 400\n";
    print "graph_printf %7.2lf\n";
    foreach my $key ( keys %$store ){
      my $drbdname = 'drbd'.$key;
      print $drbdname."dr.label $drbdname Disk Read\n";
      print $drbdname."dw.label $drbdname Disk Write\n";
      print $drbdname."ns.label $drbdname Network Send\n";
      print $drbdname."nr.label $drbdname Network Receive\n";
      print $drbdname."os.label $drbdname Out of Sync\n";
      print $drbdname."dr.cdef ".$drbdname."dr,1024,*\n";
      print $drbdname."dw.cdef ".$drbdname."dw,1024,*\n";
      print $drbdname."ns.cdef ".$drbdname."ns,1024,*\n";
      print $drbdname."nr.cdef ".$drbdname."nr,1024,*\n";
      print $drbdname."os.cdef ".$drbdname."os,1024,*\n";
      print $drbdname."dr.min 0\n";
      print $drbdname."dw.min 0\n";
      print $drbdname."ns.min 0\n";
      print $drbdname."nr.min 0\n";
      print $drbdname."os.min 0\n";
      print $drbdname."dr.type DERIVE\n";
      print $drbdname."dw.type DERIVE\n";
      print $drbdname."ns.type DERIVE\n";
      print $drbdname."nr.type DERIVE\n";
      print $drbdname."os.type DERIVE\n";
    }
    exit 0;
  }
  foreach my $key ( keys %$store ){
    my $drbdname = 'drbd'.$key;
    print $drbdname."dw.value ".$store->{$key}->{'dw'}."\n";
    print $drbdname."dr.value ".$store->{$key}->{'dr'}."\n";
    print $drbdname."ns.value ".$store->{$key}->{'ns'}."\n";
    print $drbdname."nr.value ".$store->{$key}->{'nr'}."\n";
    print $drbdname."os.value ".$store->{$key}->{'os'}."\n";
  }
}

sub crunch{
  open (IN, $file) || die "Could not open $file for reading: $!";
  if ($ARGV[0] and $ARGV[0] eq "autoconf"){
    close (IN);
    print "yes\n";
    exit 0;
  }
  while (<IN>){
    next if /version:|GIT-hash:/;
    chomp;
    my ($drbd) = $_ =~ /^\s+(\d):/;
    $rid = $drbd if $drbd =~ /\d/;
    my ($ns) = $_ =~ /ns:(\d*)/;  $store->{ $rid }->{'ns'} = $ns if $ns ne undef;
    my ($nr) = $_ =~ /nr:(\d*)/;  $store->{ $rid }->{'nr'} = $nr if $ns ne undef;
    my ($dw) = $_ =~ /dw:(\d*)/;  $store->{ $rid }->{'dw'} = $dw if $dw ne undef;
    my ($dr) = $_ =~ /dr:(\d*)/;  $store->{ $rid }->{'dr'} = $dr if $dr ne undef;
    my ($os) = $_ =~ /oos:(\d*)/; $store->{ $rid }->{'os'} = $os if $os ne undef;
  }
  close (IN);
}

exit 0;
EOF
sudo chmod 755 /usr/share/munin/plugins/drbd



https://raw.githubusercontent.com/blog-pcoffice/public/master/drbd_al

cat << 'EOF' | sudo tee /usr/share/munin/plugins/drbd_al
#!/usr/bin/perl
#%# family=auto
#%# capabilities=autoconf
# http://www.drbd.org/en/doc/users-guide-84/ch-admin#s-performance-indicators

use strict;
my $file="/proc/drbd";
my $store = {};
my $rid;

&crunch;
&display;

sub display{
  if ($ARGV[0] and $ARGV[0] eq "config"){
    print "graph_title DRBD (Activity Log)\n";
    print "graph_category DRBD\n";
    print "graph_info Graph DRBD (Activity Log)\n";
    print "graph_vlabel Graph DRBD (Activity Log)\n";
    print "graph_scale yes\n";
    print "graph_args --base 1024 --lower-limit 0\n";
    print "graph_period second\n";
    print "graph_height 200\n";
    print "graph_width 400\n";
    print "graph_printf %7.2lf\n";
    foreach my $key ( keys %$store ){
      my $drbdname = 'drbd'.$key;
      print $drbdname."al.label $drbdname Activity log\n";
      print $drbdname."al.min 0\n";
#      print $drbdname."al.type DERIVE\n";
    }
    exit 0;
  }
  foreach my $key ( keys %$store ){
    my $drbdname = 'drbd'.$key;
    print $drbdname."al.value ".$store->{$key}->{'al'}."\n";
  }
}

sub crunch{
  open (IN, $file ) || die "Could not open $file for reading: $!";
  if ($ARGV[0] and $ARGV[0] eq "autoconf"){
    close (IN);
    print "yes\n";
    exit 0;
  }
  while (<IN>){
    next if /version:|GIT-hash:/;
    chomp;
    my ($drbd) = $_ =~ /^\s+(\d):/;
    $rid = $drbd if $drbd =~ /\d/;
    my ($al) = $_ =~ /al:(\d*)/; $store->{ $rid }->{'al'} = $al if $al ne undef;
  }
  close (IN);
}

exit 0;
EOF
sudo chmod 755 /usr/share/munin/plugins/drbd_al



https://raw.githubusercontent.com/blog-pcoffice/public/master/drbd_ext

cat << 'EOF' | sudo tee /usr/share/munin/plugins/drbd_ext
#!/usr/bin/perl
#%# family=auto
#%# capabilities=autoconf
# http://www.drbd.org/en/doc/users-guide-84/ch-admin#s-performance-indicators

use strict;
my $file="/proc/drbd";
my $store = {};
my $rid;

&crunch;
&display;

sub display{
  if ($ARGV[0] and $ARGV[0] eq "config"){
    print "graph_title DRBD (Ext)\n";
    print "graph_category DRBD\n";
    print "graph_info Graph DRBD (Ext)\n";
    print "graph_vlabel Graph DRBD (Ext)\n";
    print "graph_scale yes\n";
    print "graph_args --base 1024 --lower-limit 0\n";
    print "graph_period second\n";
    print "graph_height 200\n";
    print "graph_width 400\n";
    print "graph_printf %7.2lf\n";
    foreach my $key ( keys %$store ){
      my $drbdname = 'drbd'.$key;
      print $drbdname."bm.label $drbdname Bit Map\n";
      print $drbdname."lo.label $drbdname Local count\n";
      print $drbdname."pe.label $drbdname Pending\n";
      print $drbdname."ua.label $drbdname UnAcknowledged\n";
      print $drbdname."ap.label $drbdname Application Pending\n";
      print $drbdname."ep.label $drbdname Epochs\n";
    }
    exit 0;
  }
  foreach my $key ( keys %$store ){
    my $drbdname = 'drbd'.$key;
    print $drbdname."bm.value ".$store->{$key}->{'bm'}."\n";
    print $drbdname."lo.value ".$store->{$key}->{'lo'}."\n";
    print $drbdname."pe.value ".$store->{$key}->{'pe'}."\n";
    print $drbdname."ua.value ".$store->{$key}->{'ua'}."\n";
    print $drbdname."ap.value ".$store->{$key}->{'ap'}."\n";
    print $drbdname."ep.value ".$store->{$key}->{'ep'}."\n";
  }
}

sub crunch{
  open (IN, $file ) || die "Could not open $file for reading: $!";
  if ($ARGV[0] and $ARGV[0] eq "autoconf"){
    close (IN);
    print "yes\n";
    exit 0;
  }
  while (<IN>){
    next if /version:|GIT-hash:/;
    chomp;
    my ($drbd) = $_ =~ /^\s+(\d):/;
    $rid = $drbd if $drbd =~ /\d/;
    my ($bm) = $_ =~ /bm:(\d*)/; $store->{ $rid }->{'bm'} = $bm if $bm ne undef;
    my ($lo) = $_ =~ /lo:(\d*)/; $store->{ $rid }->{'lo'} = $lo if $lo ne undef;
    my ($pe) = $_ =~ /pe:(\d*)/; $store->{ $rid }->{'pe'} = $pe if $pe ne undef;
    my ($ua) = $_ =~ /ua:(\d*)/; $store->{ $rid }->{'ua'} = $ua if $ua ne undef;
    my ($ap) = $_ =~ /ap:(\d*)/; $store->{ $rid }->{'ap'} = $ap if $ap ne undef;
    my ($ep) = $_ =~ /ep:(\d*)/; $store->{ $rid }->{'ep'} = $ep if $ep ne undef;
  }
  close (IN);
}

exit 0;
EOF
sudo chmod 755 /usr/share/munin/plugins/drbd_ext




2016年11月16日水曜日

LIO, DRBD, Pacemaker による冗長化 iSCSI Target (その11)構築編のまとめ


ここまでの構築手順を PDF にまとめました。

iSCSITarget-Build-OracleLinux7.3-1.10.pdf
iSCSITarget-Build-OracleLinux7.3-1.10.xlsx


多少、手順が入れ替わったりしています。
Oracle Linux 7.3 が出たので、7.3用に書き直しています。

行番号の右隣にチェック欄があります。「a」は Active 機(1号機)のみで実行するコマンドです。「s」は Stand-by 機(2号機)のみで実行するコマンドです。「a,s」は、Active 機と Stand-by 機の両方で実行するコマンドです。「o」は、別の適切な端末で実行するコマンドです。実施したら丸を付ける、といった使い方を想定しています。
罫線を入れるなどの装飾は施していません。手順の追加、削除に関する編集がしやすいように考えた結果です。

2016/11/30 追記
1.10  Munin 関連の手順を追加し、こまごまとバグフィックスしてあります。
元ネタのエクセルファイルも併せて公開しました。
1ページ目の絵を直し、右側欄外の情報を調整すれば、
同一構成の場合、c 列のみをコピーし、テキストエディタに貼り付けることで、
構築に必要なコマンド群が得られます。



本連載で紹介した構成で初期構築をご希望の方は、メールにてお問い合わせください。
サーバ1台あたり10万円~(税別)という超特価にてご提供中です。
詳細は、上記PDFの最終頁をご参照ください。

MySQL や PostgreSQL、Oracle の冗長構成構築サービスも鋭意開発中です。商品開発に関するリクエストがあればお知らせください。検討させていただきます。
貴社のアプリケーション、サービス等を冗長化する共同開発も承ります。

2016年11月15日火曜日

LIO, DRBD, Pacemaker による冗長化 iSCSI Target (その10)Pacemaker のリソース設定


Pacemaker にリソースを登録します。

Active 機で、クラスタの状態を確認します。


sudo pcs status
Cluster name: iscsitgt01
WARNING: no stonith devices and stonith-enabled is not false
WARNING: corosync and pacemaker node names do not match (IPs used in setup?)
Last updated: Fri Oct 21 00:28:51 2016          Last change: Fri Oct 21 00:27:20 2016 by hacluster via crmd on iscsitgt01s.example.com
Stack: corosync
Current DC: iscsitgt01s.example.com (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 0 resources configured

Online: [ iscsitgt01a.example.com iscsitgt01s.example.com ]

Full list of resources:

PCSD Status:
  iscsitgt01a.example.com (10.110.88.57): Online
  iscsitgt01s.example.com (10.110.88.58): Online

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled


Active 機で、クラスタにリソースを登録します。


sudo /etc/ha.d/crm.sh


Active 機で、状態を確認します。


sudo pcs status
Cluster name: iscsitgt01
WARNING: corosync and pacemaker node names do not match (IPs used in setup?)
Last updated: Sat Oct 29 19:52:34 2016          Last change: Sat Oct 29 19:51:46 2016 by root via cibadmin on iscsitgt01s.example.com
Stack: corosync
Current DC: iscsitgt01s.example.com (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 5 resources configured

Online: [ iscsitgt01a.example.com iscsitgt01s.example.com ]

Full list of resources:

 Master/Slave Set: ms_drbd_r0 [p_drbd_r0]
     Masters: [ iscsitgt01a.example.com ]
     Slaves: [ iscsitgt01s.example.com ]
 Resource Group: g_tgt
     p_lvm      (ocf::heartbeat:LVM):   Started iscsitgt01a.example.com
     p_lio      (ocf::heartbeat:LIO):   Started iscsitgt01a.example.com
     p_vip      (ocf::heartbeat:VIP):   Started iscsitgt01a.example.com

Failed Actions:
* p_lvm_start_0 on iscsitgt01s.example.com 'unknown error' (1): call=16, status=complete, exitreason='Volume group [vg1] does not exist or contains error!   Volume group "vg1" not found',
    last-rc-change='Fri Oct 21 00:32:13 2016', queued=0ms, exec=1095ms
PCSD Status:
  iscsitgt01a.example.com (10.110.88.57): Online
  iscsitgt01s.example.com (10.110.88.58): Online

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled


※ ここでのエラー発生は想定の範囲内です。リソースをグループ化するコマンドの前に、各種リソースが Active 機側で起動しようとしたり、Stand-by 機側で起動しようとしたりしてしまうためです。

Active 機で、リソースのエラー状態をクリアします。


sudo pcs resource cleanup
Waiting for 1 replies from the CRMd. OK


Active 機で、状態を確認します。


sudo pcs status
Cluster name: iscsitgt01
WARNING: corosync and pacemaker node names do not match (IPs used in setup?)
Last updated: Sat Oct 29 19:58:35 2016          Last change: Sat Oct 29 19:58:34 2016 by hacluster via crmd on iscsitgt01a.example.com
Stack: corosync
Current DC: iscsitgt01s.example.com (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 5 resources configured

Online: [ iscsitgt01a.example.com iscsitgt01s.example.com ]

Full list of resources:

 Master/Slave Set: ms_drbd_r0 [p_drbd_r0]
     Masters: [ iscsitgt01a.example.com ]
     Slaves: [ iscsitgt01s.example.com ]
 Resource Group: g_tgt
     p_lvm      (ocf::heartbeat:LVM):   Started iscsitgt01a.example.com
     p_lio      (ocf::heartbeat:LIO):   Started iscsitgt01a.example.com
     p_vip      (ocf::heartbeat:VIP):   Started iscsitgt01a.example.com

PCSD Status:
  iscsitgt01a.example.com (10.110.88.57): Online
  iscsitgt01s.example.com (10.110.88.58): Online

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled


Active 機と Stand-by 機で、設定情報を保存します。


sudo pcs config | sudo tee /etc/ha.d/crm.conf


Stand-by 機で、クラスタの状態をワッチします。


sudo watch pcs status


Active 機で、スイッチオーバ(手動フェイルオーバ)させてみます。


sudo pcs resource move g_tgt
Warning: Creating location constraint cli-ban-g_tgt-on-iscsitgt01a.example.com with a score of -INFINITY for resource g_tgt on node iscsitgt01a.example.com.
This will prevent g_tgt from running on iscsitgt01a.example.com until the constraint is removed. This will be the case even if iscsitgt01a.example.com is the last node in the cluster.
 

Stand-by 機で、クラスタの状態を確認します。


Cluster name: iscsitgt01
WARNING: corosync and pacemaker node names do not match (IPs used in setup?)
Last updated: Sat Oct 29 19:52:34 2016          Last change: Sat Oct 29 19:51:46 2016 by root via crm_resource on iscsitgt01a.example.com
Stack: corosync
Current DC: iscsitgt01s.example.com (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 5 resources configured

Online: [ iscsitgt01a.example.com iscsitgt01s.example.com ]

Full list of resources:

 Master/Slave Set: ms_drbd_r0 [p_drbd_r0]
     Masters: [ iscsitgt01s.example.com ]
     Slaves: [ iscsitgt01a.example.com ]
 Resource Group: g_tgt
     p_lvm      (ocf::heartbeat:LVM):   Started iscsitgt01s.example.com
     p_lio      (ocf::heartbeat:LIO):   Started iscsitgt01s.example.com
     p_vip      (ocf::heartbeat:VIP):   Started iscsitgt01s.example.com

PCSD Status:
  iscsitgt01a.example.com (10.110.88.57): Online
  iscsitgt01s.example.com (10.110.88.58): Online

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled


※ 赤字の行で、VIP を持っているノードが確認できればスイッチオーバ完了です。

※ ログで確認すると、切り替えに2秒かかっていないです。スイッチオーバ操作はこうであってほしいものです。メンテナンスのために切り替え作業を行うことは多いと思いますが、この作業に数十秒以上かかるようであれば、利用者の影響が大きすぎると思われるので、メンテナンス停止に関する利用者との調整が難しくなってしまいます。

Active 機で、設定変更を確認します。


diff <(grep -v last-lrm-refresh /etc/ha.d/crm.conf) <(sudo pcs config | grep -v last-lrm-refresh)
41a42
>     Disabled on: iscsitgt01a.example.com (score:-INFINITY) (role: Started) (id:cli-ban-g_tgt-on-iscsitgt01a.example.com)


Active 機で、設定変更を元に戻します。


sudo pcs resource clear g_tgt
diff <(grep -v last-lrm-refresh /etc/ha.d/crm.conf) <(sudo pcs config | grep -v last-lrm-refresh)


※ pcs では「unmove」ではなく「clear」です。
※ この操作を忘れると、障害発生時にフェイルオーバできません。

Stand-by 機側でリソースが動いている状態の場合、もう一度スイッチオーバさせます。Active 機側でリソースが動いている場合には、その必要はありません。

Active 機と Stand-by 機で、クラスタの状態を記録します。


sudo pcs status | sudo tee /etc/ha.d/crm.status


Active 機で、クラスタを停止します。


sudo pcs cluster stop --all
10.110.88.57: Stopping Cluster (pacemaker)...
10.110.88.58: Stopping Cluster (pacemaker)...
10.110.88.58: Stopping Cluster (corosync)...
10.110.88.57: Stopping Cluster (corosync)...



OS を停止し、バックアップを取得するのは、ここが最適と思われます。


今回は、仮想マシンでも動くことを前提に構築しました。
物理マシンであれば、Stonith 設定を追加したり、物理 watchdog に入れ替えたりといった改良の余地があります。
ただし、ハードウェアに依存する実装となってしまい、都度、調整や挙動の違いを確認する作業が発生しますし、障害試験項目も増えていきます。IPMI 対応を前提とするのであれば、多くのサーバで同じ挙動を期待できるかもしれません。
その価値があると判断した場合には、これらの設定も追加することになります。

LVM のスナップショットを利用したバックアップ機能を実装するのも良い考えだと思います。
Device Mapper Thin-Provisioning を活用すると、ストレージとしての活用範囲が広がります。

2016年11月13日日曜日

LIO, DRBD, Pacemaker による冗長化 iSCSI Target (その9)Pacemaker にさせたいこと


あとは、Pacemaker にリソースを登録するだけですが、登録する前に、Pacemaker にさせたいことを整理する意味で、コマンドで一つ一つのリソースを操作し、スイッチオーバ(手動フェイルオーバ)させてみます。

Active 機で、VIP を削除します。


sudo ip addr del 10.110.88.59/26 dev bond0

ip addr show bond0
6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 9000 qdisc noqueue state UNKNOWN
    link/ether 00:0c:29:0b:ab:b0 brd ff:ff:ff:ff:ff:ff
    inet 10.110.88.57/26 brd 10.110.88.63 scope global bond0
       valid_lft forever preferred_lft forever


Active 機で、LIO の設定をクリアします。


sudo targetctl clear

sudo targetcli ls /
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 0]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 0]
  o- loopback ..................................................... [Targets: 0]


Active 機で、DRBD 上の LVM ボリュームグループを非活性化します。


sudo vgchange -a n vg1
  0 logical volume(s) in volume group "vg1" now active

sudo lvs
  LV       VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-drbd0 vg0  -wi-ao----   1.76t
  lv-lun0  vg1  -wi------- 359.98g
  lv-lun1  vg1  -wi------- 359.98g
  lv-lun2  vg1  -wi------- 359.98g
  lv-lun3  vg1  -wi------- 359.98g


Active 機で、DRBD リソースを secondary 化(デモート)します。


sudo drbdadm secondary all

cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:2256 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


Active 機と Stand-by 機で、drbd.service を停止します。


sudo systemctl stop drbd.service

cat /proc/drbd
cat: /proc/drbd: No such file or directory


※ Pacemaker によるスイッチオーバ動作時には、drbd サービスは停止させません。

ここまでの作業で、Pacemaker に登録する全てのリソースが停止できました。

今度は、Stand-by 機側でリソースを起動していきます。

Active 機と Stand-by 機で、drbd.service をほぼ同時に起動します。


sudo systemctl start drbd.service

cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


※ drbd.service は Active 機だけではなく、Stand-by 機側でも起動する必要があります。HA 構成のクラスタとしては、制御方法が珍しい部類に入るリソースです。

Stand-by 機で、DRBD リソースを primary 化(プロモート)します。


sudo drbdadm primary all

cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:152 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


Stand-by 機で、DRBD 上の LVM ボリュームグループを活性化します。


sudo vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg0" using metadata type lvm2
  Found volume group "vg1" using metadata type lvm2

sudo vgchange -a y vg1
  4 logical volume(s) in volume group "vg1" now active

sudo lvs
  LV       VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-drbd0 vg0  -wi-ao----   1.76t
  lv-lun0  vg1  -wi-a----- 359.98g
  lv-lun1  vg1  -wi-a----- 359.98g
  lv-lun2  vg1  -wi-a----- 359.98g
  lv-lun3  vg1  -wi-a----- 359.98g


Stand-by 機で、LIO 設定をリストアします。


sudo targetctl restore

sudo targetcli ls /
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 4]
  | | o- lun0 ............... [/dev/vg1/lv-lun0 (360.0GiB) write-thru activated]
  | | o- lun1 ............... [/dev/vg1/lv-lun1 (360.0GiB) write-thru activated]
  | | o- lun2 ............... [/dev/vg1/lv-lun2 (360.0GiB) write-thru activated]
  | | o- lun3 ............... [/dev/vg1/lv-lun3 (360.0GiB) write-thru activated]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 1]
  | o- iqn.2016-09.com.example:iscsitgt01 ............................ [TPGs: 1]
  |   o- tpg1 ........................................... [no-gen-acls, no-auth]
  |     o- acls ...................................................... [ACLs: 4]
  |     | o- iqn.2016-09.com.example:initiator01 .............. [Mapped LUNs: 4]
  |     | | o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     | | o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     | | o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     | | o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     | o- iqn.2016-09.com.example:initiator02 .............. [Mapped LUNs: 4]
  |     | | o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     | | o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     | | o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     | | o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     | o- iqn.2016-09.com.example:initiator03 .............. [Mapped LUNs: 4]
  |     | | o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     | | o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     | | o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     | | o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     | o- iqn.2016-09.com.example:initiator04 .............. [Mapped LUNs: 4]
  |     |   o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     |   o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     |   o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     |   o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     o- luns ...................................................... [LUNs: 4]
  |     | o- lun0 .............................. [block/lun0 (/dev/vg1/lv-lun0)]
  |     | o- lun1 .............................. [block/lun1 (/dev/vg1/lv-lun1)]
  |     | o- lun2 .............................. [block/lun2 (/dev/vg1/lv-lun2)]
  |     | o- lun3 .............................. [block/lun3 (/dev/vg1/lv-lun3)]
  |     o- portals ................................................ [Portals: 1]
  |       o- 10.110.88.59:3260 ............................................ [OK]
  o- loopback ..................................................... [Targets: 0]


Stand-by 機で、VIP を追加します。


sudo ip addr add 10.110.88.59/26 dev bond0

ip addr show bond0
6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 9000 qdisc noqueue state UNKNOWN
    link/ether 00:0c:29:c4:fe:24 brd ff:ff:ff:ff:ff:ff
    inet 10.110.88.58/26 brd 10.110.88.63 scope global bond0
       valid_lft forever preferred_lft forever
    inet 10.110.88.59/26 scope global secondary bond0
       valid_lft forever preferred_lft forever


次回は、Pacemaker にリソースを登録するので、前半の手順を主に Stand-by 機側で実行し、全てのリソースを停止させておきます。

2016年11月11日金曜日

LIO, DRBD, Pacemaker による冗長化 iSCSI Target (その8)LIO


LIO の設定を行います。

Active 機と Stand-by 機で targetcli コマンドの設定を確認します。


sudo targetcli get global
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
GLOBAL CONFIG GROUP
===================
auto_add_default_portal=true
----------------------------
If true, adds a portal listening on all IPs to new targets.

auto_add_mapped_luns=true
-------------------------
If true, automatically create node ACLs mapped LUNs after creating a new target LUN or a new node ACL

auto_cd_after_create=false
--------------------------
If true, changes current path to newly created objects.

auto_enable_tpgt=true
---------------------
If true, automatically enables TPGTs upon creation.

auto_save_on_exit=true
----------------------
If true, saves configuration on exit.

color_command=cyan
------------------
Color to use for command completions.

color_default=none
------------------
Default text display color.

color_keyword=cyan
------------------
Color to use for keyword completions.

color_mode=true
---------------
Console color display mode.

color_parameter=magenta
-----------------------
Color to use for parameter completions.

color_path=magenta
------------------
Color to use for path completions

export_backstore_name_as_model=true
-----------------------------------
If true, the backstore name is used for the scsi inquiry model name.

logfile=/root/.targetcli/log.txt
--------------------------------
Logfile to use.

loglevel_console=info
---------------------
Log level for messages going to the console.

loglevel_file=debug
-------------------
Log level for messages going to the log file.

prompt_length=30
----------------
Max length of the shell prompt path, 0 for infinite.

tree_max_depth=0
----------------
Maximum depth of displayed node tree.

tree_round_nodes=true
---------------------
Tree node display style.

tree_show_root=true
-------------------
Whether or not to display tree root.

tree_status_mode=true
---------------------
Whether or not to display status in tree.


Active 機と Stand-by 機で、targetcli から exit する際に自動的に設定を save する挙動を無効化します。


sudo targetcli set global auto_save_on_exit=false
Parameter auto_save_on_exit is now 'false'.


Active 機と Stand-by 機で、targetcli から target を追加する際に自動的に portal がデフォルト値で作成される挙動を無効化します。


sudo targetcli set global auto_add_default_portal=false
Parameter auto_add_default_portal is now 'false'.


Active 機で、targetcli から 状態を確認します。


sudo targetcli ls /
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 0]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 0]
  o- loopback ..................................................... [Targets: 0]


Active 機で、IQN を定義します。


sudo targetcli /iscsi create iqn.2016-09.com.example:iscsitgt01
Created target iqn.2016-09.com.example:iscsitgt01.
Created TPG 1.

sudo targetcli ls /
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 0]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 1]
  | o- iqn.2016-09.com.example:iscsitgt01 ............................ [TPGs: 1]
  |   o- tpg1 ........................................... [no-gen-acls, no-auth]
  |     o- acls ...................................................... [ACLs: 0]
  |     o- luns ...................................................... [LUNs: 0]
  |     o- portals ................................................ [Portals: 0]
  o- loopback ..................................................... [Targets: 0]


Active 機で、ACL(アクセス許可リスト)にイニシエータ名を登録します。必要に応じて CHAP 認証情報も紐付けします。認証なしとしたい場合には、この作業をスキップします。


sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls create iqn.2016-09.com.example:initiator01
Created Node ACL for iqn.2016-09.com.example:initiator01

  sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls/iqn.2016-09.com.example:initiator01 set auth userid=iscsiuser01
Parameter userid is now 'iscsiuser01'.

  sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls/iqn.2016-09.com.example:initiator01 set auth password=password-user01
Parameter password is now 'password-user01'.


sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls create iqn.2016-09.com.example:initiator02
Created Node ACL for iqn.2016-09.com.example:initiator02

  sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls/iqn.2016-09.com.example:initiator02 set auth userid=iscsiuser02
Parameter userid is now 'iscsiuser02'.

  sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls/iqn.2016-09.com.example:initiator02 set auth password=password-user02
Parameter password is now 'password-user02'.


sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls create iqn.2016-09.com.example:initiator03
Created Node ACL for iqn.2016-09.com.example:initiator03

  sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls/iqn.2016-09.com.example:initiator03 set auth userid=iscsiuser03
Parameter userid is now 'iscsiuser03'.

  sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls/iqn.2016-09.com.example:initiator03 set auth password=password-user03
Parameter password is now 'password-user03'.


sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls create iqn.2016-09.com.example:initiator04
Created Node ACL for iqn.2016-09.com.example:initiator04

  sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls/iqn.2016-09.com.example:initiator04 set auth userid=iscsiuser04
Parameter userid is now 'iscsiuser04'.

  sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/acls/iqn.2016-09.com.example:initiator04 set auth password=password-user04
Parameter password is now 'password-user04'.

sudo targetcli ls /
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 0]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 1]
  | o- iqn.2016-09.com.example:iscsitgt01 ............................ [TPGs: 1]
  |   o- tpg1 ........................................... [no-gen-acls, no-auth]
  |     o- acls ...................................................... [ACLs: 4]
  |     | o- iqn.2016-09.com.example:initiator01 .............. [Mapped LUNs: 0]
  |     | o- iqn.2016-09.com.example:initiator02 .............. [Mapped LUNs: 0]
  |     | o- iqn.2016-09.com.example:initiator03 .............. [Mapped LUNs: 0]
  |     | o- iqn.2016-09.com.example:initiator04 .............. [Mapped LUNs: 0]
  |     o- luns ...................................................... [LUNs: 0]
  |     o- portals ................................................ [Portals: 0]
  o- loopback ..................................................... [Targets: 0]


Active 機で、バックエンド・デバイスを指定し、IQN に紐付けます。


sudo targetcli /backstores/block create name=lun0 dev=/dev/vg1/lv-lun0
Created block storage object lun0 using /dev/vg1/lv-lun0.

sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/luns create /backstores/block/lun0
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2016-09.com.example:initiator04
Created LUN 0->0 mapping in node ACL iqn.2016-09.com.example:initiator03
Created LUN 0->0 mapping in node ACL iqn.2016-09.com.example:initiator02
Created LUN 0->0 mapping in node ACL iqn.2016-09.com.example:initiator01


sudo targetcli /backstores/block create name=lun1 dev=/dev/vg1/lv-lun1
Created block storage object lun1 using /dev/vg1/lv-lun1.

sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/luns create /backstores/block/lun1
Created LUN 1.
Created LUN 1->1 mapping in node ACL iqn.2016-09.com.example:initiator04
Created LUN 1->1 mapping in node ACL iqn.2016-09.com.example:initiator03
Created LUN 1->1 mapping in node ACL iqn.2016-09.com.example:initiator02
Created LUN 1->1 mapping in node ACL iqn.2016-09.com.example:initiator01


sudo targetcli /backstores/block create name=lun2 dev=/dev/vg1/lv-lun2
Created block storage object lun2 using /dev/vg1/lv-lun2.

sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/luns create /backstores/block/lun2
Created LUN 2.
Created LUN 2->2 mapping in node ACL iqn.2016-09.com.example:initiator04
Created LUN 2->2 mapping in node ACL iqn.2016-09.com.example:initiator03
Created LUN 2->2 mapping in node ACL iqn.2016-09.com.example:initiator02
Created LUN 2->2 mapping in node ACL iqn.2016-09.com.example:initiator01


sudo targetcli /backstores/block create name=lun3 dev=/dev/vg1/lv-lun3
Created block storage object lun3 using /dev/vg1/lv-lun3.

sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/luns create /backstores/block/lun3
Created LUN 3.
Created LUN 3->3 mapping in node ACL iqn.2016-09.com.example:initiator04
Created LUN 3->3 mapping in node ACL iqn.2016-09.com.example:initiator03
Created LUN 3->3 mapping in node ACL iqn.2016-09.com.example:initiator02
Created LUN 3->3 mapping in node ACL iqn.2016-09.com.example:initiator01

sudo targetcli ls /
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 4]
  | | o- lun0 ............... [/dev/vg1/lv-lun0 (360.0GiB) write-thru activated]
  | | o- lun1 ............... [/dev/vg1/lv-lun1 (360.0GiB) write-thru activated]
  | | o- lun2 ............... [/dev/vg1/lv-lun2 (360.0GiB) write-thru activated]
  | | o- lun3 ............... [/dev/vg1/lv-lun3 (360.0GiB) write-thru activated]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 1]
  | o- iqn.2016-09.com.example:iscsitgt01 ............................ [TPGs: 1]
  |   o- tpg1 ........................................... [no-gen-acls, no-auth]
  |     o- acls ...................................................... [ACLs: 4]
  |     | o- iqn.2016-09.com.example:initiator01 .............. [Mapped LUNs: 4]
  |     | | o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     | | o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     | | o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     | | o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     | o- iqn.2016-09.com.example:initiator02 .............. [Mapped LUNs: 4]
  |     | | o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     | | o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     | | o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     | | o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     | o- iqn.2016-09.com.example:initiator03 .............. [Mapped LUNs: 4]
  |     | | o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     | | o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     | | o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     | | o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     | o- iqn.2016-09.com.example:initiator04 .............. [Mapped LUNs: 4]
  |     |   o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     |   o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     |   o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     |   o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     o- luns ...................................................... [LUNs: 4]
  |     | o- lun0 .............................. [block/lun0 (/dev/vg1/lv-lun0)]
  |     | o- lun1 .............................. [block/lun1 (/dev/vg1/lv-lun1)]
  |     | o- lun2 .............................. [block/lun2 (/dev/vg1/lv-lun2)]
  |     | o- lun3 .............................. [block/lun3 (/dev/vg1/lv-lun3)]
  |     o- portals ................................................ [Portals: 0]
  o- loopback ..................................................... [Targets: 0]


※ 今回試してみた範囲では、ここで「block」ではなく「fileio」を選ぶと、デバイス名が「/dev/dm-1」等という名前で保存されてしまい、再起動後やフェイルオーバー先で同じデバイス名となることが保証されないため、udev の設定変更も加える等の処置が追加で必要となるはずです。LVM 論理ボリュームを指定する場合は「block」を利用することをお奨めします。

※ ここでは、1つの Target IQN に複数の LUN を紐付けました。複数の IQN を用意し、1 IQN に 1 LUN という方が、きめ細かく設定できます。

2016/11/20追記
※ 1つの Target IQN に tpg が1つ紐付くわけですが、この1つの tpg が CPU の 1Core しか活用してくれないので、マルチコア、マルチプロセッサ環境で複数の LUN をエクスポートしたい場合には、1 IQN に 1 LUN という設定が推奨となります。10Gbit Ethernet 環境では、1 IQN には、多くても 4 LUN までにとどめておくべきです。

Active 機で、IQN に portal を作成します。


sudo targetcli /iscsi/iqn.2016-09.com.example:iscsitgt01/tpg1/portals create 10.110.88.58 3260
Using default IP port 3260
Created network portal 10.110.88.59:3260.

sudo targetcli ls /
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 4]
  | | o- lun0 ............... [/dev/vg1/lv-lun0 (360.0GiB) write-thru activated]
  | | o- lun1 ............... [/dev/vg1/lv-lun1 (360.0GiB) write-thru activated]
  | | o- lun2 ............... [/dev/vg1/lv-lun2 (360.0GiB) write-thru activated]
  | | o- lun3 ............... [/dev/vg1/lv-lun3 (360.0GiB) write-thru activated]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 1]
  | o- iqn.2016-09.com.example:iscsitgt01 ............................ [TPGs: 1]
  |   o- tpg1 ........................................... [no-gen-acls, no-auth]
  |     o- acls ...................................................... [ACLs: 4]
  |     | o- iqn.2016-09.com.example:initiator01 .............. [Mapped LUNs: 4]
  |     | | o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     | | o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     | | o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     | | o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     | o- iqn.2016-09.com.example:initiator02 .............. [Mapped LUNs: 4]
  |     | | o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     | | o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     | | o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     | | o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     | o- iqn.2016-09.com.example:initiator03 .............. [Mapped LUNs: 4]
  |     | | o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     | | o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     | | o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     | | o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     | o- iqn.2016-09.com.example:initiator04 .............. [Mapped LUNs: 4]
  |     |   o- mapped_lun0 .............................. [lun0 block/lun0 (rw)]
  |     |   o- mapped_lun1 .............................. [lun1 block/lun1 (rw)]
  |     |   o- mapped_lun2 .............................. [lun2 block/lun2 (rw)]
  |     |   o- mapped_lun3 .............................. [lun3 block/lun3 (rw)]
  |     o- luns ...................................................... [LUNs: 4]
  |     | o- lun0 .............................. [block/lun0 (/dev/vg1/lv-lun0)]
  |     | o- lun1 .............................. [block/lun1 (/dev/vg1/lv-lun1)]
  |     | o- lun2 .............................. [block/lun2 (/dev/vg1/lv-lun2)]
  |     | o- lun3 .............................. [block/lun3 (/dev/vg1/lv-lun3)]
  |     o- portals ................................................ [Portals: 1]
  |       o- 10.110.88.59:3260 ............................................ [OK]
  o- loopback ..................................................... [Targets: 0]

sudo ss -ant | grep LISTEN.\*:3260
LISTEN     0      256    10.110.88.59:3260                     *:*


Active 機で、設定ファイルに設定を保存し、Stand-by 機にコピーします。


sudo targetcli saveconfig
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

sudo scp -p /etc/target/saveconfig.json iscsitgt01s:/etc/target/saveconfig.json
saveconfig.json                               100% 8709     8.5KB/s   00:00


Active 機と Stand-by 機で、LIO のリソース・エージェントを作成します。


cat << 'EOF_iSCSITargetLIO' | sudo tee /usr/lib/ocf/resource.d/heartbeat/iSCSITargetLIO
#!/bin/bash
#
#     iSCSITargetLIO OCF RA. manages iSCSI target LIO.
#
#   (c) 2009-2010 Florian Haas, Dejan Muhamedagic,
#                 and Linux-HA contributors
#
#      modified by Katsuaki Hamada (hamada@pc-office.net), 23 Oct 2016
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like.  Any license provided herein, whether implied or
# otherwise, applies only to this software file.  Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#

#######################################################################
# Initialization:
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs

# Lockfile, used for selecting a target ID
LOCKFILE=${HA_RSCTMP}/target.lock
#######################################################################

meta_data() {
        cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="iSCSITargetLIO" version="1.0">
<version>0.9</version>

<longdesc lang="en">
Manages iSCSI targets. An iSCSI target is a collection of SCSI Logical
Units (LUs) exported via a daemon that speaks the iSCSI protocol.
</longdesc>
<shortdesc lang="en">iSCSI target export agent</shortdesc>

<parameters>
<parameter name="iqn" required="1" unique="1">
<longdesc lang="en">
The target iSCSI Qualified Name (IQN). Should follow the conventional
iqn.yyyy-mm.&lt;reversed domain name&gt;[:identifier] syntax.
</longdesc>
<shortdesc lang="en">iSCSI target IQN</shortdesc>
<content type="string" />
</parameter>
</parameters>

<actions>
<action name="start" timeout="10" />
<action name="stop" timeout="10" />
<action name="status" timeout="10" interval="10" depth="0" />
<action name="monitor" timeout="10" interval="10" depth="0" />
<action name="meta-data" timeout="5" />
<action name="validate-all" timeout="10" />
</actions>
</resource-agent>
END
}

#######################################################################

iSCSITargetLIO_usage() {
        cat <<END
usage: $0 {start|stop|status|monitor|validate-all|meta-data}

Expects to have a fully populated OCF RA-compliant environment set.
END
}

iSCSITargetLIO_start() {
  iSCSITargetLIO_monitor
  if [ $? =  $OCF_SUCCESS ]; then
    return $OCF_SUCCESS
  fi

  /usr/bin/targetctl restore

  iSCSITargetLIO_monitor
}

iSCSITargetLIO_stop() {
  iSCSITargetLIO_monitor
  if [ $? -eq $OCF_NOT_RUNNING ]; then
    return $OCF_SUCCESS
  fi

  /usr/bin/targetctl clear
  return $OCF_SUCCESS
}

iSCSITargetLIO_monitor() {
  # if we have no configfs entry for the target, it's definitely stopped
  [ -d /sys/kernel/config/target/iscsi/${OCF_RESKEY_iqn} ] || return $OCF_NOT_RUNNING

  # if the target is there, but its TPG is not enabled, then we also consider it stopped
  [ `cat /sys/kernel/config/target/iscsi/${OCF_RESKEY_iqn}/tpgt_1/enable` -eq 1 ] || return $OCF_NOT_RUNNING

  return $OCF_SUCCESS
}

iSCSITargetLIO_validate() {
  if ! ocf_is_probe; then
    # Do we have all required binaries?
    check_binary targetcli
    check_binary targetctl
  fi
  return $OCF_SUCCESS
}

case $1 in
  meta-data)
        meta_data
        exit $OCF_SUCCESS
        ;;
  usage|help)
        iSCSITargetLIO_usage
        exit $OCF_SUCCESS
        ;;
esac

# Everything except usage and meta-data must pass the validate test
iSCSITargetLIO_validate

case $__OCF_ACTION in
start)          iSCSITargetLIO_start;;
stop)           iSCSITargetLIO_stop;;
monitor|status) iSCSITargetLIO_monitor;;
reload)         ocf_log err "Reloading..."
                  iSCSITargetLIO_start
                ;;
validate-all)   ;;
*)              iSCSITargetLIO_usage
                exit $OCF_ERR_UNIMPLEMENTED
                ;;
esac
rc=$?
ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"
exit $rc
EOF_iSCSITargetLIO
sudo chmod 755 /usr/lib/ocf/resource.d/heartbeat/iSCSITargetLIO


※ 当初は、systemd の target.service をリソース・エージェントとして利用しようと考えていました。スイッチオーバはうまく動くのですが、クラスタを停止しようとした場合にエラーが発生します。oneshot タイプだとうまくいかないのかと考え、sleep するだけのデーモンプロセスを作ってみました。どうも Pacemaker のプロセス処理で、リソース・エージェントの子プロセスに対する処理はしていない(考慮事項が足りない)ようで、かつ、終了時には stop メソッドも呼び出さないらしく、エラーを解消することができませんでした。以下のようなロジックで TERM シグナルを送ってくれればいいと思うのですが、そうではないようで、残念です。

killpstree(){
  kill -STOP $1
  for i in $(ps -o pid --no-heading --ppid $1)
  do
    killpstree $i
  done
  kill $2 $1
  kill -CONT $1
}
killpstree $(cat /run/target.pid) -TERM

※ このリソース・エージェントは、標準のリソース・エージェントとは設計思想が異なります。標準のリソース・エージェントは、サービスの内部のリソースまで管理し、種々の iSCSI Target で同じようによう扱えるように標準化しようという目標の元、処理が複雑化しています。私が作ったリソース・エージェントは、単純に、target.service の置き換えとなるようにしました。
単純なおかげで、iSCSITarget リソース・エージェントからの改造にかかった時間も1時間ほどですみました。他の iSCSI Target のことは考えなくてよいので、LIO の全ての機能を利用可能です。改造元のリソース・エージェントは、LIO の CHAP 認証機能を扱う機構が組み込まれていませんでした。

Active 機と Stand-by 機で、VIP 用のリソースエージェントを作ります。作るというよりも、IPaddr2  リソースエージェントの名前を VIP にリネームします。


sed -e 's/IPaddr2/VIP/g' /usr/lib/ocf/resource.d/heartbeat/IPaddr2 | sudo tee /usr/lib/ocf/resource.d/heartbeat/VIP > /dev/null
sudo chmod 755 /usr/lib/ocf/resource.d/heartbeat/VIP


Active 機で、VIP を追加します。


sudo ip addr add 10.110.88.59/26 dev bond0

ip addr show bond0
6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 9000 qdisc noqueue state UNKNOWN
    link/ether 00:0c:29:0b:ab:b0 brd ff:ff:ff:ff:ff:ff
    inet 10.110.88.57/26 brd 10.110.88.63 scope global bond0
       valid_lft forever preferred_lft forever
    inet 10.110.88.59/26 brd 10.110.88.63 scope global secondary bond0
       valid_lft forever preferred_lft forever


ここまでの操作で、イニシエータから接続が可能な状態になっています。

2016年11月10日木曜日

LIO, DRBD, Pacemaker による冗長化 iSCSI Target (その7)DRBD, LVM の残設定


DRBD と LVM について、サーバ単独での設定のみ行い、保留していた設定の続きを実施します。Active 機と Stand-by 機が連動して動作していく前提の操作となります。

 Active 機と Stand-by 機でほぼ同時に DRBD サービスを起動します。


sudo systemctl start drbd.service


Stand-by 機で DRBD の状態をワッチします。


watch cat /proc/drbd
Every 2.0s: cat /proc/drbd                              Sat Oct 29 19:51:46 2016

version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1887375068


Active 機で DRBD の初期同期を開始します。


sudo drbdadm primary --force all


Stand-by 機で DRBD の状態を確認します。


Every 2.0s: cat /proc/drbd                              Sat Oct 29 19:51:46 2016

version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:345612 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1887029456
        [>....................] sync'ed:  0.1% (1842800/1843136)M
        finish: 4:32:41 speed: 115,204 (115,204) want: 102,400 K/sec

※ この状態でも、Active 機側で作業を続行できます。今回は、初期同期の完了を待つことにします。

Every 2.0s: cat /proc/drbd                              Sat Oct 29 19:51:46 2016

version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:1887375068 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


※ 「自機/対向機」がともに「UpToDate/UpToDate」となっているのが正常な状態です。

Active 機で DRBD を Secondary にします(デモートします)。


sudo drbdadm secondary all


Stand-by 機で DRBD の状態を確認し、「Ctrl + C」で状態確認を止めます。


Every 2.0s: cat /proc/drbd                              Sat Oct 29 19:51:46 2016

version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:1887375068 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


Active 機で DRBD の状態をワッチします。


watch cat /proc/drbd
Every 2.0s: cat /proc/drbd                              Sat Oct 29 19:51:46 2016

version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:1887375980 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


Stand-by 機で DRBD を Primary にします(プロモートします)。


sudo drbdadm primary all


Active 機で DRBD の状態を確認し、「Ctrl + C」で状態確認を止めます。


Every 2.0s: cat /proc/drbd                              Sat Oct 29 19:51:46 2016

version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:0 nr:0 dw:0 dr:1887375980 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


Stand-by 機で DRBD デバイス上に LVM を構成します。


sudo pvcreate /dev/drbd0
  Physical volume "/dev/drbd0" successfully created

sudo vgcreate -s 4M vg1 /dev/drbd0
  Volume group "vg1" successfully created

sudo lvcreate --name lv-lun0 --extents 20%VG vg1
  Logical volume "lv-lun0" created.

sudo lvcreate --name lv-lun1 --extents 20%VG vg1
  Logical volume "lv-lun1" created.

sudo lvcreate --name lv-lun2 --extents 20%VG vg1
  Logical volume "lv-lun2" created.

sudo lvcreate --name lv-lun3 --extents 20%VG vg1
  Logical volume "lv-lun3" created.

sudo pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/drbd0 vg1  lvm2 a--  1.76t 360.00g
  /dev/sdc1  vg0  lvm2 a--  1.95t 200.00g

sudo vgs
  VG   #PV #LV #SN Attr   VSize VFree
  vg0    1   1   0 wz--n- 1.95t 200.00g
  vg1    1   4   0 wz--n- 1.76t 360.00g

sudo lvs
  LV       VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-drbd0 vg0  -wi-ao----   1.76t
  lv-lun0  vg1  -wi-a----- 359.98g
  lv-lun1  vg1  -wi-a----- 359.98g
  lv-lun2  vg1  -wi-a----- 359.98g
  lv-lun3  vg1  -wi-a----- 359.98g


Stand-by 機で DRBD デバイス上の LVM ボリュームグループを非活性化します。


sudo vgchange -a n vg1
  0 logical volume(s) in volume group "vg1" now active

sudo lvs
  LV       VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-drbd0 vg0  -wi-ao----   1.76t
  lv-lun0  vg1  -wi------- 359.98g
  lv-lun1  vg1  -wi------- 359.98g
  lv-lun2  vg1  -wi------- 359.98g
  lv-lun3  vg1  -wi------- 359.98g


Stand-by 機で DRBD を Secondary にします。


cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:100 nr:0 dw:100 dr:1887381560 al:4 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

sudo drbdadm secondary all

cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:100 nr:0 dw:100 dr:1887381560 al:4 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

sudo lvs
  LV       VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-drbd0 vg0  -wi-ao---- 1.76t

sudo vgs
  VG   #PV #LV #SN Attr   VSize VFree
  vg0    1   1   0 wz--n- 1.95t 200.00g

sudo pvs
  /dev/drbd0: open failed: Wrong medium type
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdc1  vg0  lvm2 a--  1.95t 200.00g


※ LVM ボリュームグループは非活性化しましたが、LVM 物理ボリュームは非活性化せずに DRBD デバイスを削除したため、エラーが発生しています。このエラーは無視しても問題ありません。

 Active 機で DRBD を Primary にします。


cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:100 dw:100 dr:1887375980 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

sudo drbdadm primary all

cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: 1AEFF755B8BD61B81A0AF27
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:100 dw:100 dr:1887376132 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


Active 機で DRBD デバイス上の LVM ボリュームグループを活性化します。


sudo pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdc1  vg0  lvm2 a--  1.95t 200.00g

sudo vgs
  VG   #PV #LV #SN Attr   VSize VFree
  vg0    1   1   0 wz--n- 1.95t 200.00g
  vg1    1   4   0 wz--n- 1.76t 360.00g

sudo lvs
  LV       VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-drbd0 vg0  -wi-ao----   1.76t
  lv-lun0  vg1  -wi------- 359.98g
  lv-lun1  vg1  -wi------- 359.98g
  lv-lun2  vg1  -wi------- 359.98g
  lv-lun3  vg1  -wi------- 359.98g

 ※ この時点で、LVM 物理ボリュームが見えていないのに、LVM ボリュームグループ、 LVM 論理ボリュームが見えているのはなぜ?
   /dev/vg0/lv-drbd0 がフィルタリングされているにもかかわらず見えてしまっているのか、pvs コマンドがバグっているのか?

sudo vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg0" using metadata type lvm2
  Found volume group "vg1" using metadata type lvm2

 ※ ここで vgscan コマンド実行前の状態が正常化されるので、とりあえず実害はありません。

sudo pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/drbd0 vg1  lvm2 a--  1.76t 360.00g
  /dev/sdc1  vg0  lvm2 a--  1.95t 200.00g

sudo vgchange -a y vg1
  4 logical volume(s) in volume group "vg1" now active

sudo lvs
  LV       VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-drbd0 vg0  -wi-ao----   1.76t
  lv-lun0  vg1  -wi-a----- 359.98g
  lv-lun1  vg1  -wi-a----- 359.98g
  lv-lun2  vg1  -wi-a----- 359.98g
  lv-lun3  vg1  -wi-a----- 359.98g