LVMおよびATAoEテクノロジーを使用して無制限に拡張できる分散ディスクストレージの編成

挑戦する


ディスクが小さく、インターネットが大きい場合、プライベートFTPサーバーの所有者は次の問題に直面しました。
VideoまたはSoftパパが各ハードドライブ上に作成され、新しいハードドライブを追加するとVideo2、Soft2などがパパになることが判明しました。
ハードドライブをより大きなドライブに変更するタスクは、データをどこかに転送する必要があるという事実につながりました。これはすべて、非自明で大きなダウンタイムで発生しました。
2005年に開発したシステムにより、3テラバイトのスケーラブルで拡張可能なオンラインの信頼できる高速アレイを組み立てることができ、ディスクまたはサーバー全体をディスクに追加できました。
ソリューション全体の価格は、ドライブ自体のコストの110%でした。 基本的に無料で、オーバーヘッドはほとんどありません。

ストレージのデバイス図の例を次に示します。




実装


これは、スーパーバイザーとノードが存在するという考え方です。 スーパーバイザーは、クライアントがアクセスするパブリックサーバーであり、ノードへの外部および内部のいくつかのギガビットボンディングインターフェイスを備えています。 スーパーバイザーは、ATAoE経由でvbladeを使用してエクスポートされたアレイまたは個々のディスクを取得し、それらの上にLVMを作成し、FTP経由でこのセクションにアクセスできるようにします。 スーパーバイザーは、ノード用のディスクレスダウンロードサーバーでもあり、ノードのファイルシステム全体を含み、ロード後にNFSを介して通信します。 ノードは純粋なディスクであり、PXEを介して起動し、etherpopulateが起動し、すべてのディスクがエクスポートされます。

1.リモートノードの読み込みの設定



ノードデバイス
ftp # ls /diskless/
bzImage node pxelinux.0 pxelinux.cfg


カーネル、ノードディレクトリ-rootfs、pxe configs
ftp # ls /diskless/node/
bin boot dev etc lib mnt proc root sbin sys tmp usr var
ftp # chroot /diskless/node/
ftp / # which vblade
/usr/sbin/vblade
ftp / # vblade
usage: vblade [ -m mac[,mac...] ] shelf slot netif filename
ftp / #


これはすべてノードで利用可能です
ftp node # cat /diskless/pxelinux.cfg/default
DEFAULT /bzImage
APPEND ip=dhcp root=/dev/nfs nfsroot=172.18.0.193:/diskless/node idebus=66

指定されたpxe、nfsrootの構成

dhcpd config、実行することを忘れないでください。
ftp etc # more dhcp/dhcpd.conf
option domain-name "domain.com";
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;

option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;

subnet 172.16.0.0 netmask 255.255.0.0 {
}

subnet 172.18.0.192 netmask 255.255.255.192 {
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
option vendor-class-identifier "PXEClient";
vendor-option-space PXE;
option PXE.mtftp-ip 0.0.0.0;
filename "pxelinux.0";
next-server 172.18.0.193;
}

host node-1 {
hardware ethernet 00:13:d4:68:b2:7b;
fixed-address 172.18.0.194;
}
host node-2 {
hardware ethernet 00:11:2f:45:e9:fd;
fixed-address 172.18.0.195;
}
host node-3 {
hardware ethernet 00:07:E9:2A:A9:AC;
fixed-address 172.18.0.196;
}
}


tftpdの構成
ftp etc # more /etc/conf.d/in.tftpd
# /etc/init.d/in.tftpd

# Path to server files from
INTFTPD_PATH="/diskless"

INTFTPD_USER="nobody"
# For more options, see tftpd(8)
INTFTPD_OPTS="-u ${INTFTPD_USER} -l -vvvvvv -p -c -s ${INTFTPD_PATH}"


tftpdは実行されていますか?
ftp etc # ps -ax |grep tft
Warning: bad ps syntax, perhaps a bogus '-'? See procps.sf.net/faq.html
5694 ? Ss 0:00 /usr/sbin/in.tftpd -l -u nobody -l -vvvvvv -p -c -s /diskless
31418 pts/0 R+ 0:00 grep tft


nfsの設定、実行することを忘れないでください。
ftp etc # more exports
/diskless/node 172.18.0.192/255.255.255.192(rw,sync,no_root_squash)


リモートブートのセットアップが完了し、すべてのノードが登録されました。

2.アレイのアセンブリを自動化するためのソフトウェア部分



ノードで実行されるソフトウェアは、md * raidアレイを作成し、それらをスーパーバイザーにエクスポートします。
ftp# chroot /diskless/node
ftp etc # more /usr/sbin/etherpopulate
#!/usr/bin/perl

my $action = shift();

#system('insmod /lib/modules/vb-2.6.16-rc1.ko')
# if ( -f '/lib/modules/vb-2.6.16-rc1.ko');

# Get information on node_id's of ifaces
my @ifconfig = `ifconfig`;
my $int;
my %iface;
foreach my $line (@ifconfig) {
if ($line =~ /^(\S+)/) {
$int = $1;
}
if ($line =~ /inet addr:(\d+\.\d+\.\d+\.)(\d+)/ && $1 ne '127.0.0.' && $int) {
$iface{$int} = $2;
$int = "";
}
}

my $vblade_kernel = ( -d "/sys/vblade" )?1:0;
if ( $vblade_kernel ) {
print " Using kernelspace vblade\n" if ($action eq "start");
} else {
print " Using userspace vblade\n" if ($action eq "start");
}

# Run vblade
foreach my $int (keys %iface) {
my $node_id = $iface{$int};
open(DATA, "/etc/etherpopulate.conf");
while () {
chomp;
s/#.*//;
s/^\s+//;
s/\s+$//;
next unless length;

if ($_ =~ /^node-$node_id\s+(\S+)\s+(\S+)\s+(\S.*)/) {
my $cfg_action = $1;
my $command = $2;
my $parameters = $3;

# Export disk over ATAoE
if ($action eq $cfg_action && $command eq "ataoe" && $parameters =~ /(\S+)\s+(\d+)/) {
my $disk_name = $1;
my $disk_id = $2;
if ($vblade_kernel) {
if ( $disk_name =~ /([a-z0-9]+)$/ ) {
my $disk_safe_name = $1;
system("echo 'add $disk_safe_name $disk_name' > /sys/vblade/drives");
system("echo 'add $int $node_id $disk_id' > /sys/vblade/$disk_safe_name/ports");
}
} else {
system("/sbin/start-stop-daemon --background --start --name 'vblade_$node_id_$disk_id' --exec /usr/sbin/vblade $node_id $disk_id eth0 $disk_name");
}
print " Exporting disk: $disk_name [ $node_id $disk_id ] via $int\n";
}

# Execute specified command
if ($action eq $cfg_action && $command eq "exec") {
system($parameters);
}
}
}
close(DATA);
}



3つのノードの参加によるetherpopulateの構成。 さらに2つ追加します。 各ノードからのディスクは他の目的のためにエクスポートされます(raid1のバックアップ)
ftp sbin # more /diskless/node/etc/etherpopulate.conf
# ----------------------
# Node 194 160gb
node-194 start exec /sbin/mdadm -A /dev/md0 -f /dev/hd[ah] /dev/hdl
node-194 start ataoe /dev/md0 0 # Vblade FTP array
node-194 start ataoe /dev/hdk 1 # Vblade BACKUP disk
node-194 stop exec /usr/bin/killall vblade
node-194 stop exec /sbin/mdadm -S /dev/md0

# ----------------------
# Node 195 200 gb
node-195 start exec /sbin/mdadm -A /dev/md0 /dev/hd[ab] /dev/hd[ef] /dev/hd[gh] /dev/sd[ac]
node-195 start ataoe /dev/md0 0 # Vblade FTP array
node-195 start ataoe /dev/sdd 1 # Vblade BACKUP disk
node-195 stop exec /usr/bin/killall vblade
node-195 stop exec /sbin/mdadm -S /dev/md0

# ----------------------
# Node 196 200 gb
node-196 start exec /sbin/mdadm -A /dev/md0 /dev/hd[af]
node-196 start ataoe /dev/md0 0 # Vblade FTP array
node-196 stop exec /usr/bin/killall vblade
node-196 stop exec /sbin/mdadm -S /dev/md0


3.最終作業



ノードのネジを最高速度で動作させて、信頼性を損なう
hd*_args="-d1 -X69 -udma5 -c1 -W1 -A1 -m16 -a16 -u1"

スーパーバイザーのコアを検証します。 ノード自体では、vbladeを使用して、ユーザーランドでATAoEへのエクスポートが行われます。
ftp good # grep -i OVER_ETH .config
CONFIG_ATA_OVER_ETH=y


構成に従ってetherpopulateをロードおよび開始した直後にノード自体で。
node-195 ~ # cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] [raid4] [raid6] [multipath] [faulty]
md0 : active raid5 hda[0] sdc[8] sdb[7] sda[6] hdh[5] hdg[4] hdf[3] hde[2] hdb[1]
1562887168 blocks level 5, 64k chunk, algorithm 2 [9/9] [UUUUUUUUU]

unused devices: node-195 ~ # ps -ax | grep vblade | grep md
Warning: bad ps syntax, perhaps a bogus '-'? See procps.sf.net/faq.html
2182 ? Ss 2090:41 /usr/sbin/vblade 195 0 eth0 /dev/md0

node-195 ~ # mount
rootfs on / type rootfs (rw)
/dev/root on / type nfs (ro,v2,rsize=4096,wsize=4096,hard,nolock,proto=udp,addr=172.18.0.193)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
udev on /dev type tmpfs (rw,nosuid)
devpts on /dev/pts type devpts (rw)
none on /var/lib/init.d type tmpfs (rw)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec)



スーパーバイザ上のディスクからlvmを収集します。将来はこれを行う必要はありません。vgscanによってマウントする準備ができたセクションがあります

ftp / # ls -la /dev/etherd/*
cw--w---- 1 root disk 152, 3 Jun 7 2008 /dev/etherd/discover
brw-rw---- 1 root disk 152, 49920 Jun 7 2008 /dev/etherd/e194.0
brw-rw---- 1 root disk 152, 49936 Jun 7 2008 /dev/etherd/e194.1
brw-rw---- 1 root disk 152, 49920 Jun 7 2008 /dev/etherd/e195.0
brw-rw---- 1 root disk 152, 49936 Jun 7 2008 /dev/etherd/e195.1
brw-rw---- 1 root disk 152, 49920 Jun 7 2008 /dev/etherd/e196.0
cr--r----- 1 root disk 152, 2 Jun 7 2008 /dev/etherd/err
cw--w---- 1 root disk 152, 4 Jun 7 2008 /dev/etherd/interfaces


最初の2つのノードから、1つのアレイと1つのディスクがエクスポートされ、3番目のノードからは、アレイのみがエクスポートされました。
これらのデバイスをLVMスーパーバイザで使用する前に、「特別な」マークアップを作成して、LVMがディスクに内部識別子を追加する必要があります。

# pvcreate /dev/etherd/e194.0
...
...


ディスクはすぐに使用できます。 ボリュームグループを作成します。
# vgcreate cluster /dev/etherd/e194.0 /dev/etherd/e195.0 /dev/etherd/e196.0

グループはすぐにアクティブになりますが、原則として含めることができます
# vgchange -ay cluster

オンとオフ
# vgchange -an cluster

ボリュームグループに何かを追加するには
# vgextend cluster /dev/*...

利用可能なすべての場所に論理ボリュームハイパースペースを作成します。 各PEのデフォルトは4mbです。 だから
# vgdisplay cluster | grep "Total PE"
Total PE 1023445
# lvcreate -l 1023445 cluster -n hyperspace


vgdisplay、lvdisplay、pvdisplayの結果を確認できます。
vgextend、lvextend、resize_reiserfsを使用してすべてを拡張できます。
詳細はこちらhttp://tldp.org/HOWTO/LVM-HOWTO/

最終的には/ dev / cluster / hyperspaceになり、mkreiserfsにしてマウントします。 すべて準備完了です。 ftpサーバーの設定を下げます。 そうそう!



再利用


スーパーバイザ自体で、再起動の場合、実行するだけで十分です
more runme.sh
#!/bin/sh
vgscan
vgchange -ay
mount /dev/cluster/hyperspace /mnt/ftp

事前に作成された配列を使用します。

短所




結論


解決策は確かに興味深いものであり、テラバイトのネジ、ホットプラグsata、およびソフトウェアの新しい新しいバージョンで既に作成したいと考えています。 しかし、そのような偉業を誰が行うかは不明です。 たぶん、%username%?

関連リンク


http://tldp.org/HOWTO/LVM-HOWTO/
http://sourceforge.net/search/?words=ataoe&type_of_search=soft&pmode=0&words=vblade&Search=Search
http://www.gentoo.org/doc/en/diskless-howto.xml

オリジナル記事

PSスクリプトを書くための029ahへの特別なthx。

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


All Articles