DRBDに基づく無料のVMware vSphere Storage Applianceの交換

最近、VMwareはvSphere 5ラインの新製品を発表しましたが、VMware vSphere Storage Applianceとは何ですか?

要するに、本質は、外部ストレージなしでフォールトトレラントな仮想インフラストラクチャを構築する可能性にあります。 実装のために、2つまたは3つの仮想マシンがインストールされ(ホストごとに1つ)、ESXiサーバーのディスクサブシステムの空き領域を複製し、すべての同じESXiホストに共有ストレージとして提供します。 ここで説明されているロシアのストレージアプライアンスの詳細。

興味深いアイデアですが、価格は噛みつきます-約$ 6K。 また、パフォーマンスについて考えると、ディスクアレイの速度が低下する可能性がありますか? 一方、問題にアプローチする場合、外部ストレージを整理する他の多くの方法を考えることができます。 たとえば、必要な数のディスクとインストールされたソフトウェアOpenfiler、FreeNAS、Nexenta、Open-Eを備えたほぼすべてのハードウェアから外部ストレージを作成できます。これらのソフトウェア製品では、システム間で複製が可能です。

このアプローチは、十分なパフォーマンスと信頼性を提供する有名なメーカーの高価なストレージシステムを購入する機会がない多くの企業によって実践されています。 通常、このようなシステムには、2つのコントローラー、冗長電源システム、高速ディスクなどが装備されています...

ただし、最初に戻って、VMwareが提供するスキームを見てください。



何が見えますか? 仮想マシンがデプロイされた3つのESXiホスト(各ホストに1つ)。 マシンはクラスター化され、外部ドライブとして内部ドライブを提供します。

利用可能なツールから同様のソリューションをまとめるというアイデアは長い間空中にありましたが、正当な理由を見つけることができませんでした。 そして、VMware自体が、テスト環境ですべてを試すために弾みをつけました。

フォールトトレラントストレージを構築するためのソリューション-たとえば、Openfiler + DRBD + Heartbeatに基づいた束。 しかし、これらすべての決定の中心には、外部ストレージを構築するというアイデアがあります。 同様のことを試してみませんか?

基盤として、OS Ubuntuを備えた2台の仮想マシン、フェールオーバーiSCSIターゲットの構築に関するUbuntuドキュメントを用意し、独自のアプライアンスを作成してみてください。

クラスターの両方のノードでのディスクパーティション:

/dev/sda1 - 10 GB / (primary' ext3, Bootable flag: on)
/dev/sda5 - 1 GB swap (logical)

/dev/sdb1 - 1 GB (primary) DRBD meta-. .
/dev/sdc1 - 1 GB (primary) DRBD , iSCSI. .
/dev/sdd1 - 50 GB (primary) DRBD iSCSI-target.


例として、sdd1ディスクサイズが選択されています。 実際、ESXiホストのローカルストレージ上の残りの空き領域がすべて使用されます。

iSCSIネットワーク:
iSCSI server1: node1.demo.local IP address: 10.11.55.55
iSCSI server2: node2.demo.local IP address: 10.11.55.56
iSCSI Virtual IP address 10.11.55.50


プライベートネットワーク:
iSCSI server1: node1-private IP address: 192.168.22.11
iSCSI server2: node2-private IP address: 192.168.22.12


/ etc / network / interfaces:

node1の場合:
auto eth0
iface eth0 inet static
address 10.11.55.55
netmask 255.0.0.0
gateway 10.0.0.1

auto eth1
iface eth1 inet static
address 192.168.22.11
netmask 255.255.255.0


node2の場合:
auto eth0
iface eth0 inet static
address 10.11.55.56
netmask 255.0.0.0
gateway 10.0.0.1

auto eth1
iface eth1 inet static
address 192.168.22.12
netmask 255.255.255.0


両方のノードの/ etc / hostsファイル:

127.0.0.1 localhost
10.11.55.55 node1.demo.local node1
10.11.55.56 node2.demo.local node2
192.168.22.11 node1-private
192.168.22.12 node2-private


パッケージのインストール:
apt-get -y install ntp ssh drbd8-utils heartbeat jfsutils

サーバーを再起動します。

ファイルの所有者と許可を変更します。
chgrp haclient /sbin/drbdsetup
chmod ox /sbin/drbdsetup
chmod u+s /sbin/drbdsetup
chgrp haclient /sbin/drbdmeta
chmod ox /sbin/drbdmeta
chmod u+s /sbin/drbdmeta


/etc/drbd.confを使用して構成を記述します。 2つのリソースを定義します。
1. iSCSI構成ファイルを含むDRBDデバイス。
2. DRBDデバイス。iSCSIターゲットになります。

node1の場合:

/etc/drbd.conf:

resource iscsi.config {
protocol C;

handlers {
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
outdate-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";
}

startup {
degr-wfc-timeout 120;
}

disk {
on-io-error detach;
}

net {
cram-hmac-alg sha1;
shared-secret "password";
after-sb-0pri disconnect;
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
}

syncer {
rate 100M;
verify-alg sha1;
al-extents 257;
}

on node1 {
device /dev/drbd0;
disk /dev/sdc1;
address 192.168.22.11:7788;
meta-disk /dev/sdb1[0];
}

on node2 {
device /dev/drbd0;
disk /dev/sdc1;
address 192.168.22.12:7788;
meta-disk /dev/sdb1[0];
}
}

resource iscsi.target.0 {
protocol C;

handlers {
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
outdate-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";
}

startup {
degr-wfc-timeout 120;
}

disk {
on-io-error detach;
}

net {
cram-hmac-alg sha1;
shared-secret "password";
after-sb-0pri disconnect;
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
}

syncer {
rate 100M;
verify-alg sha1;
al-extents 257;
}

on node1 {
device /dev/drbd1;
disk /dev/sdd1;
address 192.168.22.11:7789;
meta-disk /dev/sdb1[1];
}

on node2 {
device /dev/drbd1;
disk /dev/sdd1;
address 192.168.22.12:7789;
meta-disk /dev/sdb1[1];
}
}


構成を2番目のノードにコピーします。
scp /etc/drbd.conf root@10.11.55.56:/etc/

両方のサーバーでメタデータディスクを初期化します。
[node1]dd if=/dev/zero of=/dev/sd1
[node1]dd if=/dev/zero of=/dev/sdd1
[node1]drbdadm create-md iscsi.config
[node1]drbdadm create-md iscsi.target.0

[node2]dd if=/dev/zero of=/dev/sd1
[node2]dd if=/dev/zero of=/dev/sdd1
[node2]drbdadm create-md iscsi.config
[node2]drbdadm create-md iscsi.target.0


drbdを開始します。
[node1]/etc/init.d/drbd start
[node2]/etc/init.d/drbd start


次に、ディスク間で同期するために、プライマリとして機能するサーバーとセカンダリとして機能するサーバーを決定する必要があります。 プライマリがnode1であると仮定します。
最初のノードでコマンドを実行します。
[node1]drbdadm -- --overwrite-data-of-peer primary iscsi.config

チーム出力
cat /proc/drbd:

version: 8.3.9 (api:88/proto:86-95)
srcversion: CF228D42875CF3A43F2945A
0: cs:Connected ro: Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:1048542 nr:0 dw:0 dr:1048747 al:0 bm:64 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: 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:52428768


/ dev / drbd0パーティションをフォーマットしてマウントします。
[node1]mkfs.ext3 /dev/drbd0
[node1]mkdir -p /srv/data
[node1]mount /dev/drbd0 /srv/data


最初のノードでファイルを作成し、2番目のノードをプライマリモードに切り替えます。
[node1]dd if=/dev/zero of=/srv/data/test.zeros bs=1M count=100

node1の場合:
[node1]umount /srv/data
[node1]drbdadm secondary iscsi.config


node2の場合:
[node2]mkdir -p /srv/data
[node2]drbdadm primary iscsi.config
[node2]mount /dev/drbd0 /srv/data


2番目のノードでは、サイズが100 MBのファイルが表示されます。
ls –l /srv/data

それを削除して、最初のノードに再び切り替えます。

node2で:
[node2]rm /srv/data/test.zeros
[node2]umount /srv/data
[node2]drbdadm secondary iscsi.config


node1で:
[node1]drbdadm primary iscsi.config
[node1]mount /dev/drbd0 /srv/data


コマンドls / srv / dataを実行します。 パーティションにデータがなければ、レプリケーションは成功しました。

iSCSIターゲットのインストールに進みます。 最初のノードをプライマリとして選択し、パーティションを同期します。
[node1]drbdadm -- --overwrite-data-of-peer primary iscsi.target.0

cat /proc/drbd

version: 8.3.9 (api:88/proto:86-95)
srcversion: CF228D42875CF3A43F2945A
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:135933 nr:96 dw:136029 dr:834 al:39 bm:8 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: cs:SyncSource ro: Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:1012864 nr:0 dw:0 dr:1021261 al:0 bm:61 lo:1 pe:4 ua:64 ap:0 ep:1 wo:f oos:51416288
[>....................] sync'ed: 2.0% (50208/51196)M
finish: 0:08:27 speed: 101,248 (101,248) K/sec


同期を待ちましょう...

cat /proc/drbd

version: 8.3.9 (api:88/proto:86-95)
srcversion: CF228D42875CF3A43F2945A
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:135933 nr:96 dw:136029 dr:834 al:39 bm:8 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: cs:Connected ro: Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:52428766 nr:0 dw:0 dr:52428971 al:0 bm:3200 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


両方のノードにiscsitargetパッケージをインストールします。
[node1]apt-get -y install iscsitarget
[node2]apt-get -y install iscsitarget


iscsiをサービスとして開始するオプションを有効にします。
[node1]sed -is/false/true/ /etc/default/iscsitarget
[node2]sed -is/false/true/ /etc/default/iscsitarget


すべてのスクリプトからエントリを削除します。
[node1]update-rc.d -f iscsitarget remove
[node2]update-rc.d -f iscsitarget remove


構成ファイルをdrbdセクションに移動します。
[node1]mkdir /srv/data/iscsi
[node1] mv /etc/iet/ietd.conf /srv/data/iscsi
[node1]ln -s /srv/data/iscsi/ietd.conf /etc/iet/ietd.conf
[node2]rm /etc/iet/ietd.conf
[node2]ln -s /srv/data/iscsi/ietd.conf /etc/iet/ietd.conf


ファイル/srv/data/iscsi/ietd.confでiSCSIターゲットを説明します。

Target iqn.2011-08.local.demo:storage.disk.0
# IncomingUser geekshlby secret - ,
# OutgoingUser geekshlby password
Lun 0 Path=/dev/drbd1,Type=blockio
Alias disk0
MaxConnections 1
InitialR2T Yes
ImmediateData No
MaxRecvDataSegmentLength 8192
MaxXmitDataSegmentLength 8192
MaxBurstLength 262144
FirstBurstLength 65536
DefaultTime2Wait 2
DefaultTime2Retain 20
MaxOutstandingR2T 8
DataPDUInOrder Yes
DataSequenceInOrder Yes
ErrorRecoveryLevel 0
HeaderDigest CRC32C,None
DataDigest CRC32C,None
Wthreads 8


ここで、ノードに障害が発生したときにiSCSIターゲットの仮想IPアドレスを制御するようにハートビートを構成する必要があります。

/etc/heartbeat/ha.cfファイルでクラスターを説明します。

logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
bcast eth0
bcast eth1
node node1
node node2


認証メカニズム
/etc/heartbeat/authkeys:

auth 2
2 sha1 NoOneKnowsIt


ファイル/ etc / heartbeat / authkeysのアクセス許可を変更します。
chmod 600 /etc/heartbeat/authkeys

ファイル/ etc / heartbeat / haresources-起動されるメインノード、仮想IP、ファイルシステム、およびサービスでクラスターリソースを説明します。

/etc/heartbeat/haresources

node1 drbddisk::iscsi.config Filesystem::/dev/drbd0::/srv/data::ext3
node1 IPaddr::10.11.55.50/8/eth0 drbddisk::iscsi.target.0 iscsitarget


構成を2番目のノードにコピーします。
[node1]scp /etc/heartbeat/ha.cf root@10.11.55.56:/etc/heartbeat/
[node1]scp /etc/heartbeat/authkeys root@10.11.55.56:/etc/heartbeat/
[node1]scp /etc/heartbeat/haresources root@10.11.55.56:/etc/heartbeat/


アンマウント/ srv / data、最初のノードをセカンダリとして作成します。
ハートビートを開始する
[node1]/etc/init.d/heartbeat start

両方のサーバーを再起動します。

[node1]/etc/init.d/drbd start
[node2]/etc/init.d/drbd start

[node1]drbdadm secondary iscsi.config -
[node1]drbdadm secondary iscsi.target.0 -

[node2]drbdadm primary iscsi.config
[node2]drbdadm primary iscsi.target.0

[node1]cat /proc/drbd

[node1]/etc/init.d/heartbeat start


ハートビートを開始した後、最初のノードをプライマリモードに変換し、2番目のノードをセカンダリモードに変換します(それ以外の場合は起動しません)。

[node2]drbdadm secondary iscsi.config
[node2]drbdadm secondary iscsi.target.0

[node1]drbdadm primary iscsi.config
[node1]drbdadm primary iscsi.target.0


tail –f / var / log / syslogを参照してください
私たちは待っています...
しばらくして...

Aug 26 08:32:14 node1 harc[11878]: info: Running /etc/ha.d//rc.d/ip-request-resp ip-request-resp
Aug 26 08:32:14 node1 ip-request-resp[11878]: received ip-request-resp IPaddr::10.11.55.50/8/eth0 OK yes
Aug 26 08:32:14 node1 ResourceManager[11899]: info: Acquiring resource group: node1 IPaddr::10.11.55.50/8/eth0 drbddisk::iscsi.target.0 iscsitarget
Aug 26 08:32:14 node1 IPaddr[11926]: INFO: Resource is stopped
Aug 26 08:32:14 node1 ResourceManager[11899]: info: Running /etc/ha.d/resource.d/IPaddr 10.11.55.50/8/eth0 start
Aug 26 08:32:14 node1 IPaddr[12006]: INFO: Using calculated netmask for 10.11.55.50: 255.0.0.0
Aug 26 08:32:14 node1 IPaddr[12006]: INFO: eval ifconfig eth0:0 10.11.55.50 netmask 255.0.0.0 broadcast 10.255.255.255
Aug 26 08:32:14 node1 avahi-daemon[477]: Registering new address record for 10.11.55.50 on eth0.IPv4.
Aug 26 08:32:14 node1 IPaddr[11982]: INFO: Success
Aug 26 08:32:15 node1 ResourceManager[11899]: info: Running /etc/init.d/iscsitarget start
Aug 26 08:32:15 node1 kernel: [ 5402.722552] iSCSI Enterprise Target Software - version 1.4.20.2
Aug 26 08:32:15 node1 kernel: [ 5402.723978] iscsi_trgt: Registered io type fileio
Aug 26 08:32:15 node1 kernel: [ 5402.724057] iscsi_trgt: Registered io type blockio
Aug 26 08:32:15 node1 kernel: [ 5402.724061] iscsi_trgt: Registered io type nullio
Aug 26 08:32:15 node1 heartbeat: [12129]: debug: notify_world: setting SIGCHLD Handler to SIG_DFL
Aug 26 08:32:15 node1 harc[12129]: info: Running /etc/ha.d//rc.d/ip-request-resp ip-request-resp
Aug 26 08:32:15 node1 ip-request-resp[12129]: received ip-request-resp IPaddr::10.11.55.50/8/eth0 OK yes
Aug 26 08:32:15 node1 ResourceManager[12155]: info: Acquiring resource group: node1 IPaddr::10.11.55.50/8/eth0 drbddisk::iscsi.target.0 iscsitarget
Aug 26 08:32:15 node1 IPaddr[12186]: INFO: Running OK
Aug 26 08:33:08 node1 ntpd[1634]: Listen normally on 11 eth0:0 10.11.55.50 UDP 123
Aug 26 08:33:08 node1 ntpd[1634]: new interface(s) found: waking up resolver


ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:56:20:f9:6c
inet addr:10.11.55.55 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::20c:29ff:fe20:f96c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3622 errors:0 dropped:0 overruns:0 frame:0
TX packets:8081 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:302472 (302.4 KB) TX bytes:6943622 (6.9 MB)
Interrupt:19 Base address:0x2000

eth0:0 Link encap:Ethernet HWaddr 00:50:56:20:f9:6c
inet addr:10.11.55.50 Bcast:10.255.255.255 Mask:255.0.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:19 Base address:0x2000


eth1 Link encap:Ethernet HWaddr 00:50:56:20:f9:76
inet addr:192.168.22.11 Bcast:192.168.22.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe20:f976/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1765 errors:0 dropped:0 overruns:0 frame:0
TX packets:3064 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:171179 (171.1 KB) TX bytes:492567 (492.5 KB)
Interrupt:19 Base address:0x2080


結果のiSCSIターゲットを両方のESX(i)ホストに接続します。 両方のホストがストレージを見た後、HAクラスターを組み立てます。 ホスト自体に仮想マシンを作成するためのスペースは残っていませんが、このスペースは仮想ストレージのように見えます。 いずれかのノードで障害が発生した場合、2番目のノードの仮想マシンはプライマリモードになり、iSCSIターゲットとして動作し続けます。

hdparmを使用して、target'eにインストールされた仮想マシンのディスクの速度を測定しました。



当然のことながら、このようなストレージシステムは、本格的な生産システムには適していません。 ただし、負荷の高い仮想マシンがない場合、またはHAクラスターを構築する可能性をテストする必要がある場合、共有ストレージを提供するこの方法には生命権があります。

この資料を読んだ後、多くの人は「間違っている」、「パフォーマンスに欠点がある」、「両方のノードで障害が発生する可能性がある」などと言うでしょう。 はい! そうかもしれませんが、何らかの理由でVMwareがストレージアプライアンスをリリースしましたか?

PS:ところで、すべてを手動でシャベルするのが面倒な人には、DRBDクラスターをセットアップするための管理コンソールhttp://www.drbd.org/mc/screenshot-gallery/があります

マッドバグ
シニアシステムエンジニアDEPO Computers

Source: https://habr.com/ru/post/J130573/


All Articles