挑戦する
ディスクが小さく、インターネットが大きい場合、プライベート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
事前に作成された配列を使用します。
短所
- 特に私たちの場合、エラーはハードドライブ自体の選択にありました。 何らかの理由で、選択はMaxtorで行われ、30枚のディスクのほぼすべてのバッチが1年で不良になりました。
- ホットスワップは使用されませんでした まだIDEでした。 ホットプラグSATAの場合、ノード自体のmdadmレベルでディスクの障害に関する通知を構成する必要があります。
- proftpdは、ataoeデバイスからのlvmがスーパーバイザーのファイルシステムにマウントされた後にのみ起動する必要があります。 proftpdが以前に起動した場合、彼は何が起こったのかまったく理解していませんでした。
- 私たちは長い間、ノード上のニュークリアスとユーザー空間のvbladeで実験しましたが、それはataoeの開発の夜明けであり、すべてが運がうまくいくように働きました。 しかし、それはうまくいきました。
- reiserfsまたはxfsのいずれかをファイルシステムとして使用できます-それらのディスクが増加した場合、その時点でのみオンラインリサイズをサポートしていました。
- その後、raid-5アレイをオンラインで展開できるパッチのみが表示され始めました
- 棚あたり64スロットのataoeには制限がありました。 棚は10個で作ることができます。つまり、原則として、640 NODなどの制限がありました:)
- パフォーマンスには多くのニュアンスがありますが、それらはすべてある程度解決されています。 一言で言えば-最初は速度があまり高くない場合、恐れることはありません。完璧に制限はありません。
結論
解決策は確かに興味深いものであり、テラバイトのネジ、ホットプラグsata、およびソフトウェアの新しい新しいバージョンで既に作成したいと考えています。 しかし、そのような偉業を誰が行うかは不明です。 たぶん、%username%?
関連リンク
http://tldp.org/HOWTO/LVM-HOWTO/http://sourceforge.net/search/?words=ataoe&type_of_search=soft&pmode=0&words=vblade&Search=Searchhttp://www.gentoo.org/doc/en/diskless-howto.xmlオリジナル記事PSスクリプトを書くための
029ahへの特別なthx。