#author("2018-01-28T15:09:24+09:00","default:nowsky","nowsky")
*iSCSI [#x9799fe3]
SCSIコマンドをTCP/IPでカプセリングする事で、既存のIP網でSCSIを扱えるようにする技術。
SAN(StorageAreaNetwork)の形成に利用する技術で、従来はFC(FiberChannel)が使われていた。
既存設備を流用出来るがiSCSIのメリットだがSCSIコマンドをIP網に流す為、
TCP/IPの性質上、パケット送受信・L2/L3スイッチの負荷は注視する必要がある。
#author("2018-01-28T16:53:05+09:00","default:nowsky","nowsky")
*GlusterFS [#k20eee14]
RedHatにより開発されている分散ファイルシステムの一種。
ファイルシステムではあるがコアシステムはアプリケーション層(ユーザ空間)で動作する。
ファイルシステムのマウントもFUSE・NFSなど様々な物が用意されている為、
用途・環境に合わせて組み替えて使用する事が出来る。
 
iSCSIは&font(b){1対1のサーバ(iSCSIターゲット)・クライアント(iSCSIイニシエータ)方式};が基本体系となる為、
一つのターゲットに&color(#ff0000){複数のイニシエータを接続するのは非推奨};動作となる。
それでも接続する場合は、ターゲットをクラスタリング構成にするか、
複数イニシエータからの同時操作を抑制(排他)制御する必要がある。
 
よく、iSCSI・NFS・CIFSで比較される事があるが、
用途がそれぞれ違うので、必要に応じて最適な物を選択する。

また、RAID0/1/5相当の処理が簡単に実装できる点や、
大容量ファイルの処理が早い為、10G-NICを積んでHCI環境で利用する場合がある。
~
*参考サイト [#n3f72f97]

-[[Stray Penguin - iSCSI :+http://www.asahi-net.or.jp/~aa4t-nngk/iscsi.html]]
-[[nkjmkzk.net - iSCSI Initiatorのタイムアウト設定:+http://www.nkjmkzk.net/?p=1298]]
-[[iscsi-targetログイン認証付き。Linuxiscsiイニシエータ接続:+http://linux-story.seesaa.net/article/123790372.html]]
-[[udevを使ってデバイス名を固定する:+http://ameblo.jp/itboy/entry-12061407921.html]]
-[[Linuxで4096バイトセクタHDDをfdisk:+http://d.hatena.ne.jp/dayflower/20100330/1269931922]]

*参考サイト [#w627f265]
-[[GlusterFS:+https://www.gluster.org/]]
-[[CentOS7でGlusterFSの環境構築:+https://qiita.com/Yuki-Inamoto/items/2ea1efe862aeba34019c]]
~
*iSCSIイニシエータ [#b3a00173]
-&size(16){&font(b){プログラムのインストール};};
ターゲットに接続する為のアプリがインストールされていない場合インストールしておく。
&font(b){iscsi};と&font(b){iscsid};で間違えそうだが、イニシエータツールは&font(b){&color(#ff0000){iscsi};};、接続を行うデーモンは&font(b){&color(#ff0000){iscsid};};となる。
 # yum install iscsi-initiator-utils
 # chkconfig iscsid on
* 構築環境 [#h28022db]
今回は下記条件でGlusterFSを構築した
-OS:openSUSE Leap 42.3
-Node1:10.0.0.1
-Node2:10.0.0.2
-Node3:10.0.0.3
-Brick:1Brick
-BrickPoint:/brick
-GlusterFSVolume:/gluster
-Type:Replicate
~
* インストール [#b3191049]
-&size(16){&font(b){1. リポジトリ追加};};
openSUSEでGlusterFSを利用する場合、ファイルシステムリポジトリを追加する必要がある。
その為、最初にリポジトリ追加を行った後、GlusterFSのコアシステムをインストールする。
また、GlusterFSネイティブマウントを行う為に、FUSEもインストールしておく。
 # zypper addrepo https://download.opensuse.org/repositories/filesystems/openSUSE_Leap_42.3/filesystems.repo
 # zypper refresh
 # zypper install glusterfs fuse
 
----
-&size(16){&font(b){2. サービス起動};};
ファイルシステムではあるが、
コアシステムはサービスの一種なのでデーモンを起動する。
 # systemctl unmask glusterd
 # systemctl enable glusterd
 # systemctl start glusterd
 # ps -ef | grep glusterd
 
-&size(16){&font(b){基本設定};};
iSCSI利用環境では自動ログイン・マウントが基本になると思われるので、基本設定を変更する。
設定内容は基本的にそのまま(デフォルト)となるが、「node.startup」「node.session.auth.*」は下記の様に変更する。
 # vi /etc/iscsi/iscsid.conf
-&size(16){&font(b){3. ログローテート};};
デフォルトでログローテート設定が作成されないので手動作成する。
ローテートオプションについては環境に合わせて設定する。
 # vi /etc/logrotate.d/glusterfs
 ---
 # iscsidの起動方法
 iscsid.startup = /etc/rc.d/init.d/iscsid force-start
 
 # 自動起動・自動接続を行う
 node.startup = automatic
 
 # ログイン時の読込みを禁止
 node.leading_login = No
 
 # デフォルトの認証方式をCHAPに変更
 node.session.auth.authmethod = CHAP
 
 # コネクションエラー発生から、I/Oエラー応答までの待ち時間(単位:秒)
 node.session.timeo.replacement_timeout = 120
 
 # ログイン時の待ち時間(単位:秒)
 node.conn[0].timeo.login_timeout = 15
 
 # ログアウト時の待ち時間(単位:秒)
 node.conn[0].timeo.logout_timeout = 15
 
 # ping死活監視間隔(単位:秒)
 node.conn[0].timeo.noop_out_interval = 5
 
 # ping死活監視がエラーと判断するまでの待ち時間(単位:秒)
 node.conn[0].timeo.noop_out_timeout = 5
 
 # デフォルトユーザ・パスワードをコメントアウト。CHAP認証情報は後で入力する
 #node.session.auth.username = iscsi_user
 #node.session.auth.password = iscsi_pass
 #node.session.auth.username_in = username_in
 #node.session.auth.password_in = password_in
 /var/log/glusterfs/*.log
 /var/log/glusterfs/bricks/*.log
 {
     weekly
     compress
     rotate 4
     missingok
     ifempty
     create 600 root root
     sharedscripts
     postrotate
         systemctl restart glusterd.service > /dev/null
     endscript
 }
 
----
-&size(16){&font(b){4. Brickの準備};};
GlusterFSの一時ファイルを格納するBrick領域を準備する。
Brick領域のファイルシステムは、&color(#ff0000){[xfs]または[ext4]};しか利用出来ないが、
オフィシャルでは&font(b){xfsを推奨};しているので、今回はxfsで準備する。
パーティションはrootパーティション[/]以外、
物理HDDもrootパーティションを格納しているHDD以外にしておく方が良い
 # fdisk /dev/sdb
 # mkfs.xfs -i size=512 /dev/sdb1
 # mkdir /brick
 # mount -p /dev/sdb1 /brick
 # blkid /dev/sdb1
 # echo "UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX  /brick  xfs  defaults  1  2" >> /etc/fstab
~
* ピア設定 [#j1463b89]
-&size(16){&font(b){1. iptables};};
GlusterFSはTCP/IPで通信を行う為、iptablesもポートを開放する必要がある。
ただし、利用するポート番号は多岐にわたる為、
セキュリティ上問題無ければ&color(#ff0000){ホスト単位};で通信許可する方が良い。
|Protocol|PortNumber|Description|
|TCP|111         |portmap/rpcbind|
|UDP|111         |portmap/rpcbind|
|TCP|2049        |NFS|
|UDP|2049        |NFS|
|TCP|24007       |GlusterFS Daemon|
|TCP|24008       |GlusterFS Management|
|TCP|24009~brick|GlusterFS versions earlier than 3.4|
|TCP|38465~38467|Required for GlusterFS NFS service|
|TCP|49152~brick|GlusterFS versions 3.4 and later|
 
-&size(16){&font(b){ターゲットへの接続};};
念の為、ターゲット一覧を確認した上で接続(ログイン)を行う。
ターゲット指定で利用するIQN/EUIはターゲット側で生成した値を指定する。
その中でも、BrickPort(上記の~brick)は&color(#ff0000){ホストが格納するBrick数に比例};して範囲許可する必要がある。
構築環境によって変化する為、基本は8ポート分くらい多めに見積もってポート開放する。
どうしても決め打ちする時は、下記に従って設定を行う
|PC/Count|GlusterFS v3.3|GlusterFS v3.4|
|1PC/1Brick|TCP:24009|TCP:49152|
|1PC/2Brick|TCP:24009~24010|TCP:49152~49153|
|1PC/3Brick|TCP:24009~24011|TCP:49152~49154|
|2PC/1Brick|TCP:24009|TCP:49152|
|2PC/2Brick|TCP:24009~24010|TCP:49152~49153|
|2PC/3Brick|TCP:24009~24011|TCP:49152~49154|
 
今回は下記条件で作成したiSCSIターゲットへのログイン方法をメモしておく
| 認証方法             | CHAP                                                    |
| iSCSIターゲット      | 192.168.0.1                                             |
| ポート番号           | 3260                                                    |
| ポータルグループタグ | 1                                                       |
| IQN                  | iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 |
| ログインユーザ名     | USER                                                    |
| ログインパスワード   | PASSWORD                                                |
設定する時は下記の様にiptablesで設定を行う。
範囲指定する箇所については、確保したBrickPortに従って変更する。
今回は設定例として、8Brick(8ポート)分を確保してみた。
 # iptables -I INPUT -s ${srcIP} -p tcp --dport 111         -j ACCEPT
 # iptables -I INPUT -s ${srcIP} -p udp --dport 111         -j ACCEPT
 # iptables -I INPUT -s ${srcIP} -p tcp --dport 2049        -j ACCEPT
 # iptables -I INPUT -s ${srcIP} -p udp --dport 2049        -j ACCEPT
 # iptables -I INPUT -s ${srcIP} -p tcp --dport 24007:24008 -j ACCEPT
 # iptables -I INPUT -s ${srcIP} -p tcp --dport 24009:24017 -j ACCEPT
 # iptables -I INPUT -s ${srcIP} -p tcp --dport 38465:38467 -j ACCEPT
 # iptables -I INPUT -s ${srcIP} -p tcp --dport 49152:49160 -j ACCEPT
 
++ ターゲットが発見出来ているか確認
 # iscsiadm -m node
-&size(16){&font(b){2. GlusterPeer設定};};
GlusterFSのストレージプールを作成する為、クラスタに参加するノードを設定する。
ピア設定は、クラスタ内のノード1台で設定すれば全台に自動反映される。
下記は『Node1:10.0.0.1』で実行する場合のピア接続コマンドとなる。
 # gluster peer status
 # gluster peer probe 10.0.0.2
 # gluster peer probe 10.0.0.1
 # gluster pool list
~
* ファイルシステム [#t20d3b2a]
-&size(16){&font(b){1. ボリューム作成};};
今回は3台でミラーリング(Replica3)を構築する。
本来、Brickはマウントポイントにサブディレクトリを作成する必要があるが、
今回は1Volume/1Brickのみ構築するので[force]オプションを付けて強制作成する。
 ・ボリューム作成
 # gluster vol create gluster replica 3 10.0.0.1:/brick 10.0.0.2:/brick 10.0.0.3:/brick force
 ---
 192.168.0.1:3260,1 iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345
 
++ ターゲットが発見出来ない場合は、手動登録を行う
 # iscsiadm -m discovery -t sendtargets -p 192.168.0.1:3260
 volume create: gluster: success: please start the volume to access data
 
 ・ボリューム開始
 # gluster vol start gluster
 ---
 192.168.0.1:3260,1 iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345
 
++ 認証方式・ユーザ・パスワードをイニシャルセットする
 # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --op update -n node.session.auth.authmethod -v CHAP
 # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --op update -n node.session.auth.username -v USER
 # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --op update -n node.session.auth.password -v PASSWORD
 
++ ターゲットへのログイン
 # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --login
 
++ ログイン情報の確認
 # cat /var/lib/iscsi/send_targets/{ターゲットIPアドレス,ポート番号}/{IQN,ポータルグループ,ポート番号}/default
 
++ ターゲットからログアウト
 # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --logout
 
++ ターゲットの削除
 # iscsiadm -m node -o delete -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260
 
----
 
-&size(16){&font(b){デバイス名の固定化};};
Linuxのデバイス名(/dev/sd*)は、デバイスIDの順序によって順番に割り当てられている。
一度割り当てられたデバイス名が変更される事は基本的に無いのだが、
デバイス起動順序によっては&font(b){デバイス名が変わってしまう};事がある。
デバイス名の変更が発生すると、/etc/fstabのマウント指定に影響が出る為、
&font(b){udevを利用する事で&color(#ff0000){マウントポイントを固定化};させる。};
 
色々な固定方法が存在するのだが、設定が一番楽だった下記手法を記載しておく。
ポイントはデバイス固定ルールで指定する&font(b){&color(#ff0000){「ENV{ID_SERIAL}」「NAME="sd*%n"」};};の二つとなる。
メモは下記条件を元に作成。コマンド実行結果は長いので必要な部分のみ抜粋する。
| 変更前デバイス名          | /dev/sdb  |
| 変更前のマウントポイント1 | /dev/sdb1 |
| 変更前のマウントポイント2 | /dev/sdb2 |
| 固定後デバイス名          | /dev/sdc  |
| 固定後のマウントポイント1 | /dev/sdc1 |
| 固定後のマウントポイント2 | /dev/sdc2 |

 
++ iSCSIターゲットのデバイスシリアル番号の確認
 # udevadm info --query=all --name=/dev/sdb | grep ID_SERIAL= | sed 's/.*=//g'
 volume start: gluster: success
 
 ・ステータス確認
 # gluster vol status
 ---
 abcdef111222333444555666777888999
 Status of volume: gluster
 
++ デバイス固定ルールの作成
 # vi /etc/udev/rules.d/80-scsi.rules
 ---
 SUBSYSTEM=="block", ENV{ID_BUS}=="scsi", ENV{ID_SERIAL}=="abcdef111222333444555666777888999", NAME="sdc%n", OWNER:="root", GROUP:="disk", MODE:="0660"
 
++ デバイスの再認識
 # start_udev
 
++ デバイス認識状況の再確認
 # ls -l /dev/disk/by-path
 
++ デバイスのパーミッション確認
 # ls -l /dev/sdc*
 ---
 brw-rw---- 1 root disk 8, 30 12月  1 12:00 2016 /dev/sdc
 brw-rw---- 1 root disk 8, 31 12月  1 12:00 2016 /dev/sdc1
 
----
 
-&size(16){&font(b){HDDのフォーマット};};
ターゲットへの接続とデバイス番号の固定が完了したら、ローカルHDDと同様にパーティション設定・フォーマットを行う。
この時、イニシエータでログインしたターゲットHDDが&font(b){&color(#ff0000){4Kバイトセクタ(AFT)モード};};で作成されていた場合、
パーティションの開始セクタ位置を&font(b){&color(#ff0000){63から64(8の2倍)};にずらした上で、フォーマットを行う};必要がある。
 
今回は一例として、&font(b){500GBのiSCSIターゲットディスクを4Kバイトセクタモード};で作成し、
1パーティションのext4ファイルシステムでフォーマットする方法をメモしておく。
 
ext4へのフォーマットは&font(b){「-m 0」};でroot予約ブロックを廃止、&font(b){「-b 4096」};でブロックサイズを4096に変更する。
予約ブロックは&font(b){ディスクフルになった際、rootのみ書き込み出来る予備領域を確保する};オプションだが、
ディスクフル監視している時や、フルまで使わない運用ならば領域確保を廃止する事で、パフォーマンスが向上する。
 
++ fdiskの呼び出し
 # fdisk /dev/sdc
 
++ iSCSIターゲットのセクタサイズ確認 &font(b){[p]};
 コマンド (m でヘルプ): p
 ---
 ディスク /dev/sdc: 536.9 GB, 536870912000 バイト
 ヘッド 255, セクタ 63, シリンダ 8158
 Units = シリンダ数 of 16065 * 4096 = 65802240 バイト
 セクタサイズ (論理 / 物理): 4096 バイト / 4096 バイト
 I/O size (minimum/optimal): 1048576 bytes / 1048576 bytes
 
++ 基本パーティションの作成 &font(b){[n]→[p]};
 コマンド (m でヘルプ): n
 ---
 コマンドアクション
    e   拡張
    p   基本パーティション (1-4)
 ---
 p
 
++ パーティション情報の作成 &font(b){[1]→[改行]→[改行]};
 パーティション番号 (1-4): 1
 ---
 最初 シリンダ (1-8158, default 1): [改行]
 Using default value 1
 ---
 Last シリンダ, +シリンダ数 or +size{K,M,G} (1-8158, default 8158): [改行]
 Using default value 8158
 
++ パーティションの確認 &font(b){[p]};
 コマンド (m でヘルプ): p
 ---
 デバイス ブート      始点        終点     ブロック   Id  システム
 /dev/sdc1               1        8158   524232828   83  Linux
 
++ 上級者モードへの切替 &font(b){[x]};
 コマンド (m でヘルプ): x
 
++ パーティションの確認 &font(b){[p]};
 上級者コマンド (m でヘルプ): p
 ---
 ディスク /dev/sdc: ヘッド 255, セクタ 63, シリンダ 8158
-&size(16){&font(b){2. GlusterPeer設定};};
GlusterFSは様々なマウント方法が存在するが、マウント先ノードが停止していた際、
自動的に他ノードを再マウントするフォールバック機能がある。
NFSマウント/FUSEマウント両方で利用する事が出来るが、
NFSでマウントするとローカルマウントを経由してからフォールバックする為、アクセス速度が遅くなる。
今回はマウント先を直接変更出来る、FUSEマウントを利用してネイティブフォールバックを行う。
 ・ノードA
 # mkdir /gluster
 # mount -t glusterfs 10.0.0.1:/gluster /gluster
 # mount -t glusterfs 10.0.0.1:/gluster /gluster -o backup-volfile-servers=10.0.0.2:10.0.0.3
 # echo "10.0.0.1:/gluster /gluster glusterfs defaults,_netdev,backup-volfile-servers=10.0.0.2:10.0.0.3  0  0" >> /etc/fstab
 
 Nr AF  Hd Sec  Cyl  Hd Sec  Cyl       開始      サイズ ID
  1 00   1   1    0 254  63 1023         63  131058207 83
 Partition 1 does not start on physical sector boundary.
  2 00   0   0    0   0   0    0          0          0 00
  3 00   0   0    0   0   0    0          0          0 00
  4 00   0   0    0   0   0    0          0          0 00
 
++ 開始セクタの移動 &font(b){[b]→[1]→&color(#ff0000){[64]};};
 上級者コマンド (m でヘルプ): b
 パーティション番号 (1-4): 1
 新規データ開始位置 (1-131058269, default 63): 64
 
++ パーティションの確認 &font(b){[p]};
 上級者コマンド (m でヘルプ): p
 ---
 ディスク /dev/sdc: ヘッド 255, セクタ 63, シリンダ 8158
 ・ノードB
 # mkdir /gluster
 # mount -t glusterfs 10.0.0.2:/gluster /gluster
 # mount -t glusterfs 10.0.0.2:/gluster /gluster -o backup-volfile-servers=10.0.0.3:10.0.0.1
 # echo "10.0.0.2:/gluster /gluster glusterfs defaults,_netdev,backup-volfile-servers=10.0.0.3:10.0.0.1  0  0" >> /etc/fstab
 
 Nr AF  Hd Sec  Cyl  Hd Sec  Cyl       開始      サイズ ID
  1 00   1   1    0 254  63 1023         64  131058206 83
 Partition 1 does not start on physical sector boundary.
  2 00   0   0    0   0   0    0          0          0 00
  3 00   0   0    0   0   0    0          0          0 00
  4 00   0   0    0   0   0    0          0          0 00
 ・ノードC
 # mkdir /gluster
 # mount -t glusterfs 10.0.0.3:/gluster /gluster
 # mount -t glusterfs 10.0.0.3:/gluster /gluster -o backup-volfile-servers=10.0.0.1:10.0.0.2
 # echo "10.0.0.3:/gluster /gluster glusterfs defaults,_netdev,backup-volfile-servers=10.0.0.1:10.0.0.2  0  0" >> /etc/fstab
~
* チューニング [#g0eb423b]
-&size(16){&font(b){1. パフォーマンス設定};};
GlusterFSの動作を高速化させる為、パフォーマンスチューニングを行う。
さらに突き詰めたチューニングを行う場合、kernelチューニングも必要になるが、
下手にkernelチューニングをすると他への影響が出る場合があるので、今回はGlusterFSのみ設定する。
-[[Managing GlusterFS Volumes:+http://docs.gluster.org/en/latest/Administrator%20Guide/Managing%20Volumes/]]
-[[SCSK GlusterFS紹介:+https://www.scsk.jp/lib/product/oss/pdf/oss_12.pdf]]
 # gluster vol set all cluster.server-quorum-ratio 60%
 # gluster vol set gluster cluster.quorum-type auto
 # gluster vol set gluster cluster.server-quorum-type server
 # gluster vol set gluster network.ping-timeout 3
 # gluster vol set gluster nfs.disable on
 # gluster vol set gluster nfs.disable true
 # gluster vol set gluster performance.cache-size 256MB
 # gluster vol set gluster performance.cache-max-file-size 128MB
 # gluster vol set gluster performance.cache-min-file-size 1KB  
 
++ パーティション情報の書き込み &font(b){[w]};
 上級者コマンド (m でヘルプ): w
 
++ iSCSIターゲットのフォーマット
 # mkfs.ext4 -m 0 -b 4096 /dev/sdc1
 
----
 
-&size(16){&font(b){HDDのマウント};};
フォーマットが終わった後はfstabにマウントポイントなどを設定するのだが、
iSCSIを使っている事からネットワークマウントを行う為の設定である&font(b){&color(#ff0000){「_netdev」};};を追加する。
例としてext4でフォーマットしたパーティションのコンフィグ作成内容をメモしておく
 
++ パーティションUUIDの取得
 # blkid /dev/sdc1
 ---
 /dev/sdc1: UUID="f424f1fa-cd1f-4780-94d1-e686897f809e" TYPE="ext4"
 
++ fstabルールの作成
 # vi /etc/fstab
 ---
 UUID=f424f1fa-cd1f-4780-94d1-e686897f809e    /mnt/sdc1    ext4    defaults,_netdev    1  2
 
++ マウント
 # mkdir /mnt/sdc1
 # mount -a
-&size(16){&font(b){2. パフォーマンス設定};};
GlusterFSでNFSを停止した時、バージョンによっては下記の様なエラーが大量に出力される場合がある。
-[[gfs-brick has disconnected from glusterd:+http://www.petasan.org/forums/?view=thread&id=126]]
 0-management: readv on /var/run/gluster/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.socket failed (Invalid argument)
この場合、下記コマンドを実行する事でログ出力を抑制する事が出来る。
今回の設定例ではGlusterFSのNFSを停止している為、下記のエラーログ抑制を行う事を推奨。
 # gluster volume set all nfs.disable true
 # systemctl stop glusterd
 # rm /var/log/glusterfs/etc-glusterfs-glusterd.vol.log
 # systemctl start glusterd