Linuxでの信頼できるiSCSIストレージの構築、パート2

パート1



続ける



最初の部分で始まったクラスターの作成を続けます。

今回は、クラスターのセットアップについて説明します。



前回、DRBDの同期を開始しました。

両方のリソースのプライマリサーバーとして同じサーバーを選択した場合、同期が完了すると、 / proc / drbdに次のようなものが表示されます。

# cat /proc/drbd version: 8.4.3 (api:1/proto:86-101) GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@debian-service, 2013-04-30 07:43:49 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate B r----- ns:0 nr:190397036 dw:190397036 dr:1400144904 al:0 bm:4942 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0 1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate B r----- ns:0 nr:720487828 dw:720485956 dr:34275816 al:0 bm:3749 lo:468 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
      
      





ここで最も興味深いフィールドはds:UpToDate / UpToDateです 。これは、ローカルコピーとリモートコピーの両方が関連していることを意味します。



その後、リソースをセカンダリモードに移行します。その後、クラスターがリソースを管理します。

 # drbdadm secondary VM_STORAGE_1 # drbdadm secondary VM_STORAGE_2
      
      





ペースメーカー



それで、クラスターマネージャー。



つまり、リソースと呼ばれる抽象化を管理するのは、システム全体の頭脳です。

クラスターリソースは、原則として、IPアドレス、ファイルシステム、DRBDデバイス、サービスプログラムなど、何でもかまいません。 独自のリソースを作成するのは非常に簡単です。iSCSIターゲットとLUNを管理するためにこれを行う必要がありました。詳細については後で説明します。



インストール:

 # apt-get install pacemaker
      
      





コロシンク


PacemakerはCorosyncインフラストラクチャを使用してクラスターノード間で通信するため、最初に構成する必要があります。



Corosyncには、ノード間の通信(ユニキャスト、マルチキャスト、ブロードキャスト)をサポートするかなり幅広い機能といくつかのモードがあり、RRP(冗長リングプロトコル)をサポートしています。ノード間の接続が完全に消える状況があり、両者は隣接ノードが死んでいると信じています。 その結果、両方のノードが動作モードになり、カオスが始まります:)



したがって、レプリケーションと外部インターフェイスの両方を使用して、クラスター接続を確保します。



設定しましょう


まず、認証キーを生成する必要があります。

 # corosync-keygen
      
      





両方のサーバーで/ etc / corosync / authkeyという名前で配置する必要があります。



次に、構成を作成します。両方のノードで同一である必要があります。



/etc/corosync/corosync.conf

 compatibility: none totem { version: 2 secauth: on threads: 3 rrp_mode: active transport: udpu interface { member { memberaddr: 10.1.0.100 } member { memberaddr: 10.1.0.200 } ringnumber: 0 bindnetaddr: 10.1.0.0 mcastport: 5405 ttl: 1 } interface { member { memberaddr: 192.168.123.100 } member { memberaddr: 192.168.123.200 } ringnumber: 1 bindnetaddr: 192.168.123.0 mcastport: 5407 ttl: 1 } } amf { mode: disabled } service { ver: 1 name: pacemaker } aisexec { user: root group: root } logging { syslog_priority: warning fileline: off to_stderr: yes to_logfile: no to_syslog: yes syslog_facility: daemon debug: off timestamp: on logger_subsys { subsys: AMF debug: off tags: enter|leave|trace1|trace2|trace3|trace4|trace6 } }
      
      





ここでは、通信用の2つのリング-内部(複製ポート経由)と外部(スイッチ経由)について説明し、 udpuプロトコル(UDPユニキャスト)を選択し、各リングのノードのIPアドレスを指定します。 ノードをヌルモデムケーブルで接続し、PPP接続を上げて3番目のリングを接続するというアイデアはまだありましたが、常識的にはそれを行うよう促されました。



これでPacemakerを実行できます(最初にCorosyncが起動します)。

 # /etc/init.d/pacemaker start
      
      





すべてのPacemaker構成はcrmユーティリティを介して行われ、クラスター内の任意のサーバーで実行できます。変更後、すべてのノードの構成が自動的に更新されます。



現在の状態を見てみましょう:

 # crm status ============ Last updated: Mon Jan 20 15:33:29 2014 Last change: Fri Jan 17 18:30:48 2014 via cibadmin on server1 Stack: openais Current DC: server1 - partition WITHOUT quorum Version: 1.1.7-ee0730e13d124c3d58f00016c3376a1de5323cff 2 Nodes configured, 2 expected votes 0 Resources configured. ============ Online: [ server1 server2 ]
      
      





すべてがこのようになっている場合、接続が確立され、ノードはお互いを認識します。



ここで、SCSTを管理するためのリソースが必要です。

私はかつてそれらをインターネット上のどこかで見つけ、自分のニーズに合うように修正してGithubに投稿しました。



そこから2つのファイルが必要になります。



実際、これらは単純なPacemaker APIを実装する通常のbashスクリプトです。

それらを/usr/lib/ocf/resource.d/heartbeatに配置して、クラスターマネージャーがそれらを表示できるようにします。



次に、 crmを実行て構成モードに入ります。

 # crm crm(live)# configure crm(live)configure# edit
      
      





テキストエディタ(通常はnano)が開き、リソースとその相互作用の説明を開始できます。



構成例を示します。

 node server1 node server2 primitive DRBD_VM_STORAGE_1 ocf:linbit:drbd \ params drbd_resource="VM_STORAGE_1" drbdconf="/etc/drbd.conf" \ op monitor interval="29" role="Master" \ op monitor interval="31" role="Slave" primitive DRBD_VM_STORAGE_2 ocf:linbit:drbd \ params drbd_resource="VM_STORAGE_2" drbdconf="/etc/drbd.conf" \ op monitor interval="29" role="Master" \ op monitor interval="31" role="Slave" primitive IP_iSCSI_1_1 ocf:heartbeat:IPaddr2 \ params ip="10.1.24.10" cidr_netmask="24" nic="int1.24" \ op monitor interval="10s" primitive IP_iSCSI_1_2 ocf:heartbeat:IPaddr2 \ params ip="10.1.25.10" cidr_netmask="24" nic="int2.25" \ op monitor interval="10s" primitive IP_iSCSI_1_3 ocf:heartbeat:IPaddr2 \ params ip="10.1.26.10" cidr_netmask="24" nic="int3.26" \ op monitor interval="10s" primitive IP_iSCSI_1_4 ocf:heartbeat:IPaddr2 \ params ip="10.1.27.10" cidr_netmask="24" nic="int4.27" \ op monitor interval="10s" primitive IP_iSCSI_1_5 ocf:heartbeat:IPaddr2 \ params ip="10.1.28.10" cidr_netmask="24" nic="int5.28" \ op monitor interval="10s" primitive IP_iSCSI_1_6 ocf:heartbeat:IPaddr2 \ params ip="10.1.29.10" cidr_netmask="24" nic="int6.29" \ op monitor interval="10s" primitive IP_iSCSI_2_1 ocf:heartbeat:IPaddr2 \ params ip="10.1.24.20" cidr_netmask="24" nic="int1.24" \ op monitor interval="10s" primitive IP_iSCSI_2_2 ocf:heartbeat:IPaddr2 \ params ip="10.1.25.20" cidr_netmask="24" nic="int2.25" \ op monitor interval="10s" primitive IP_iSCSI_2_3 ocf:heartbeat:IPaddr2 \ params ip="10.1.26.20" cidr_netmask="24" nic="int3.26" \ op monitor interval="10s" primitive IP_iSCSI_2_4 ocf:heartbeat:IPaddr2 \ params ip="10.1.27.20" cidr_netmask="24" nic="int4.27" \ op monitor interval="10s" primitive IP_iSCSI_2_5 ocf:heartbeat:IPaddr2 \ params ip="10.1.28.20" cidr_netmask="24" nic="int5.28" \ op monitor interval="10s" primitive IP_iSCSI_2_6 ocf:heartbeat:IPaddr2 \ params ip="10.1.29.20" cidr_netmask="24" nic="int6.29" \ op monitor interval="10s" primitive ISCSI_LUN_VM_STORAGE_1 ocf:heartbeat:SCSTLun \ params iqn="iqn.2011-04.ru.domain:VM_STORAGE_1" device_name="VM_STORAGE_1" \ lun="0" path="/dev/drbd0" handler="vdisk_fileio" primitive ISCSI_LUN_VM_STORAGE_2 ocf:heartbeat:SCSTLun \ params iqn="iqn.2011-04.ru.domain:VM_STORAGE_2" device_name="VM_STORAGE_2" \ lun="0" path="/dev/drbd1" handler="vdisk_fileio" primitive ISCSI_TGT_VM_STORAGE_1 ocf:heartbeat:SCSTTarget \ params iqn="iqn.2011-04.ru.domain:VM_STORAGE_1" \ portals="10.1.24.10 10.1.25.10 10.1.26.10 10.1.27.10 10.1.28.10 10.1.29.10" \ tgtoptions="InitialR2T=No ImmediateData=Yes MaxRecvDataSegmentLength=1048576 MaxXmitDataSegmentLength=1048576 MaxBurstLength=1048576 FirstBurstLength=524284 MaxOutstandingR2T=32 HeaderDigest=CRC32C DataDigest=CRC32C QueuedCommands=32 io_grouping_type=never" \ op monitor interval="10s" timeout="60s" primitive ISCSI_TGT_VM_STORAGE_2 ocf:heartbeat:SCSTTarget \ params iqn="iqn.2011-04.ru.domain:VM_STORAGE_2" \ portals="10.1.24.20 10.1.25.20 10.1.26.20 10.1.27.20 10.1.28.20 10.1.29.20" \ tgtoptions="InitialR2T=No ImmediateData=Yes MaxRecvDataSegmentLength=1048576 MaxXmitDataSegmentLength=1048576 MaxBurstLength=1048576 FirstBurstLength=524284 MaxOutstandingR2T=32 HeaderDigest=CRC32C DataDigest=CRC32C QueuedCommands=32 io_grouping_type=never" \ op monitor interval="10s" timeout="60s" group GROUP_ISCSI_1 IP_iSCSI_1_1 IP_iSCSI_1_2 IP_iSCSI_1_3 IP_iSCSI_1_4 \ IP_iSCSI_1_5 IP_iSCSI_1_6 ISCSI_TGT_VM_STORAGE_1 ISCSI_LUN_VM_STORAGE_1 group GROUP_ISCSI_2 IP_iSCSI_2_1 IP_iSCSI_2_2 IP_iSCSI_2_3 IP_iSCSI_2_4 \ IP_iSCSI_2_5 IP_iSCSI_2_6 ISCSI_TGT_VM_STORAGE_2 ISCSI_LUN_VM_STORAGE_2 ms MS_DRBD_VM_STORAGE_1 DRBD_VM_STORAGE_1 \ meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" \ notify="true" target-role="Master" ms MS_DRBD_VM_STORAGE_2 DRBD_VM_STORAGE_2 \ meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" \ notify="true" target-role="Master" location PREFER-1 MS_DRBD_VM_STORAGE_1 50: server1 location PREFER-2 MS_DRBD_VM_STORAGE_2 50: server2 colocation COLOC_ALL_1 inf: GROUP_ISCSI_1 MS_DRBD_VM_STORAGE_1:Master colocation COLOC_ALL_2 inf: GROUP_ISCSI_2 MS_DRBD_VM_STORAGE_2:Master order ORDER_ALL_1 inf: MS_DRBD_VM_STORAGE_1:promote GROUP_ISCSI_1:start order ORDER_ALL_2 inf: MS_DRBD_VM_STORAGE_2:promote GROUP_ISCSI_2:start property $id="cib-bootstrap-options" \ dc-version="1.1.7-ee0730e13d124c3d58f00016c3376a1de5323cff" \ cluster-infrastructure="openais" \ expected-quorum-votes="2" \ stonith-enabled="false" \ no-quorum-policy="ignore" \ default-action-timeout="240" \ last-lrm-refresh="1367942459" rsc_defaults $id="rsc-options" \ resource-stickiness="100"
      
      





一般的なクラスター設定


一番下にあります。 ここで重要なのは、 no-quorum-policy = "ignore"およびexpected-quorum-votes = "2"です。2台のサーバーのクラスターがあるため、ここにはクォーラムを配置できません。したがって、無視してください。



資源


通常、リソースには2つの状態(オンまたはオフ、開始/停止)があります。

たとえば、 ocf:heartbeat:IPaddr2はインターフェイス上のIPアドレスを取得して削除し、さらにarpテーブルを更新するために無償のarpを送信します。 このリソースのIPアドレス、マスク、インターフェイスを指定します。



マスター/スレーブモードを持つ特別なリソース、たとえばDRBD( ocf:linbit:drbd )もあります。

ノードがアクティブモードになると、クラスターマネージャーはリソースをマスターモードにします。 DRBDはセカンダリからプライマリに切り替わります。 彼のために、リソースの名前とDRBD構成へのパスを示します(おそらく省略できますが、正確には覚えていません)。



次は自己記述リソースです。

ocf:heartbeat:SCSTLunの場合、追加するターゲットのIQN 、デバイス名LUN番号(ターゲットにはLUN 0が必要です。そうでない場合、一部のイニシエーターは吹き飛ばされます)、 エクスポートされたデバイスへのパス、およびハンドラーを指定します。



ハンドラーについて詳しく説明する必要があります。これが、SCSTがデバイスで動作する方法です。



興味深いものの:



Vdisk_fileioには、速度に影響する重要なパラメーターnv_cache = 1がありSCSTLunにハード登録されます

このパラメーターは、イニシエーターコマンドを無視してキャッシュをデバイスにフラッシュするようにSCSTに指示します。 これにより、ストレージが停止した場合にデータが失われる可能性があります。 イニシエーターは、データがディスク上にあり、まだメモリ内にあると考えます。 したがって、自己責任で使用してください。



次にocf:heartbeat:SCSTTarget resourceIQNを割り当てます 。portalsはこのターゲットが使用できるIPアドレスのリストです。tgtoptionsはiSCSIオプションです。 詳細についてはこちらを参照してください。



リソースを開始および停止する際のクラスターの動作を担当するディレクティブ:



リソースを設定したら、エディターを終了して変更を適用します。

 crm(live)configure# commit crm(live)configure# exit
      
      





その後、現在の状況を確認できます。

 # crm status ============ Last updated: Mon Jan 20 17:04:04 2014 Last change: Thu Jul 25 13:59:27 2013 via crm_resource on server1 Stack: openais Current DC: server1 - partition with quorum Version: 1.1.7-ee0730e13d124c3d58f00016c3376a1de5323cff 2 Nodes configured, 2 expected votes 20 Resources configured. ============ Online: [ server1 server2 ] Resource Group: GROUP_ISCSI_1 IP_iSCSI_1_1 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_1_2 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_1_3 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_1_4 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_1_5 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_1_6 (ocf::heartbeat:IPaddr2): Stopped ISCSI_TGT_VM_STORAGE_1 (ocf::heartbeat:SCSTTarget): Stopped ISCSI_LUN_VM_STORAGE_1 (ocf::heartbeat:SCSTLun): Stopped Resource Group: GROUP_ISCSI_2 IP_iSCSI_2_1 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_2_2 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_2_3 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_2_4 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_2_5 (ocf::heartbeat:IPaddr2): Stopped IP_iSCSI_2_6 (ocf::heartbeat:IPaddr2): Stopped ISCSI_TGT_VM_STORAGE_2 (ocf::heartbeat:SCSTTarget): Stopped ISCSI_LUN_VM_STORAGE_2 (ocf::heartbeat:SCSTLun): Stopped Master/Slave Set: MS_DRBD_VM_STORAGE_1 [DRBD_VM_STORAGE_1] Slaves: [ server1 server2 ] Master/Slave Set: MS_DRBD_VM_STORAGE_2 [DRBD_VM_STORAGE_2] Slaves: [ server1 server2 ]
      
      





リソースが非アクティブであり、スレーブ(セカンダリ)モードのDRBDであることがわかります。



今、あなたはそれらをアクティブにしようとすることができます:

 # crm resource start MS_DRBD_VM_STORAGE_1 # crm resource start MS_DRBD_VM_STORAGE_2
      
      





このリソースを開始して、他のリソースの起動を呼び出します。 それらは私たちに依存するものとしてリストされており( コロケーション )、厳密に定義された順序( 順序 )で起動されます:最初に、DRBDデバイスがプライマリモードになり、次にIPアドレスが上げられ、LUNが作成され、iSCSIターゲットが最後に作成されます。



結果を見てみましょう:

 # crm status ============ Last updated: Tue Jan 21 11:54:46 2014 Last change: Thu Jul 25 13:59:27 2013 via crm_resource on server1 Stack: openais Current DC: server1 - partition with quorum Version: 1.1.7-ee0730e13d124c3d58f00016c3376a1de5323cff 2 Nodes configured, 2 expected votes 20 Resources configured. ============ Online: [ server1 server2 ] Resource Group: GROUP_ISCSI_1 IP_iSCSI_1_1 (ocf::heartbeat:IPaddr2): Started server1 IP_iSCSI_1_2 (ocf::heartbeat:IPaddr2): Started server1 IP_iSCSI_1_3 (ocf::heartbeat:IPaddr2): Started server1 IP_iSCSI_1_4 (ocf::heartbeat:IPaddr2): Started server1 IP_iSCSI_1_5 (ocf::heartbeat:IPaddr2): Started server1 IP_iSCSI_1_6 (ocf::heartbeat:IPaddr2): Started server1 ISCSI_TGT_VM_STORAGE_1 (ocf::heartbeat:SCSTTarget): Started server1 ISCSI_LUN_VM_STORAGE_1 (ocf::heartbeat:SCSTLun): Started server1 Resource Group: GROUP_ISCSI_2 IP_iSCSI_2_1 (ocf::heartbeat:IPaddr2): Started server2 IP_iSCSI_2_2 (ocf::heartbeat:IPaddr2): Started server2 IP_iSCSI_2_3 (ocf::heartbeat:IPaddr2): Started server2 IP_iSCSI_2_4 (ocf::heartbeat:IPaddr2): Started server2 IP_iSCSI_2_5 (ocf::heartbeat:IPaddr2): Started server2 IP_iSCSI_2_6 (ocf::heartbeat:IPaddr2): Started server2 ISCSI_TGT_VM_STORAGE_2 (ocf::heartbeat:SCSTTarget): Started server2 ISCSI_LUN_VM_STORAGE_2 (ocf::heartbeat:SCSTLun): Started server2 Master/Slave Set: MS_DRBD_VM_STORAGE_1 [DRBD_VM_STORAGE_1] Masters: [ server1 ] Slaves: [ server2 ] Master/Slave Set: MS_DRBD_VM_STORAGE_2 [DRBD_VM_STORAGE_2] Masters: [ server2 ] Slaves: [ server1 ]
      
      





もしそうなら、あなたは自分自身を祝福することができます-クラスターが実行されています!

configのlocationディレクティブで示されるように、各リソースグループはサーバーで起動されます。



確認のために、DRBDとSCSTが診断を表示するカーネルログdmesgを確認できます。



第二部の終わり



3番目の最後の部分では、このクラスターで最適な動作を行うようにESXiサーバーを構成する方法を示します。



All Articles