ISCSIを介した仮想ディスクイメージ(VDI)のストレージにNexentaOS/ZFSベースのSANを使用するXenServerマシンをセットアップすることを計画しています。 SANに大きなストレージリポジトリ(SR)をセットアップして、XenServerにディスクイメージのスナップショットとクローン作成を任せることができることはわかっています。ただし、いくつかの理由から、ZFSの機能をさらに活用して、スナップショット/クローン作成に使用したいと思います。
XenServerを介してスナップショット/クローンを作成する代わりに、ZFSにスナップショット/クローンを処理させることをお勧めします。その場合、それを実行するための最良の方法は何ですか?すべてのVDIを単一の大きなSR内に配置し、SR全体のZFSスナップショットを取得すると、一度に個々のVMをロールバックできなくなります。 VDIごとに1つのSRを作成できます。また、VDIをロールバックする必要がある場合は、SRを慎重に切り離し、SANでロールバックして、再度接続します。ただし、XenServerが重複するSR UUIDを検出した場合、複製されたSRをアタッチするときに問題が発生すると推測しています。 SANから以前のスナップショットへのクローン作成またはロールバックを処理するためのより良い方法はありますか?
他の回答がほのめかしているように、理想的なアプローチは、VDIごとのLUNです。最初はこれが可能であるようには見えませんでしたが、VDIごとにLUNを作成する文書化されていない「iscsi」SRドライバーがあります(/ opt/xensource/smディレクトリを調べたときにこれが見つかりました) --ISCSISR.pyファイルを参照してください)。基本的に、iSCSIターゲットごとに1つのSRをセットアップし、XenServerはそのターゲット上の各LUNのVDIを作成します。これは、VBDの作成やVMへの接続など、コマンドラインからのみ設定できます。 VBDとVDIはXenCenterにも表示されません。
これを設定するためのサンプルコマンドは次のとおりです。
xe sr-create name-label=san type=iscsi device-config:target=<IP address of target> device-config:targetIQN=<IQN of target> shared=true
これにより、iSCSILUNごとにVDIが自動的に作成されます。 SANに新しいiSCSILUNを追加することになった場合、XenServerは次のコマンドを実行した後、そのための新しいVDIを追加します。
xe sr-scan uuid=<UUID of SR>
これは、複製されたLUNにVDIを追加する場合にも機能します。新しいVDIには新しいUUIDが割り当てられます。
また、最終的にLUNのサイズを変更した場合、XenServerはそれを自動的に取得しないため、以下を実行する必要があります。
xe vdi-forget uuid=<UUID of VDI that you resized>
iscsiadm -m node -R
xe sr-scan uuid=<UUID of SR>
また、VBDを作成してVMに接続するには:
xe vbd-create vm-uuid=<UUID of VM> device=<VBD device #, e.g. 0> vdi-uuid=<VDI of UUID>
このセットアップと同様に、xenserverでいくつかの構成を行いました
そして私は2つの方法のうちの1つを使用しました
多くのVMがない場合は、VM)ごとにVDIを使用してシステムディスクを作成し、データディスクを直接接続ISCSIとして作成します。
Vm(20+)がたくさんある場合は、大きなSRを作成し、ロールバックする必要がある場合は、
A. xenserverに接続する前にVGの名前を変更します(別のマシンのvgrename-仮想でも)
B.大きなSRスナップショットを仮想マシンにアタッチし、iscsiを使用して再度エクスポートすることもできます。
複雑すぎないことを願っています:)
興味深い構成..特にZFS用。
XenServerでの私の経験によると、できる最善のことは、ストレージシステムにディスク(およびスナップショットやその他の管理タスク)を管理させることです。
ZFSにスナップショットとクローン作成を処理させるべきだと思いますが、XenServerに1つの大きなSRを与えることが最善かどうかはわかりません(ロールバックについてあなたが言ったことに同意します)。これは非常に複雑な設定です。VM多くのVDIがある場合、管理が混乱する可能性がありますが、ロールバックする機能を獲得できるためです。 dVMごとに1つのVDIを使用します。
質問に答えて、ロールバック時にSRを切り離すことを再確認すれば、複製されたSRをアタッチするときに問題は発生しません。 XenServerではなくXCPで以前にそれを実行しました( http://goo.gl/4wfE )
これは適切なようです。以下のbashスクリプトには、SRのアタッチとデタッチ、および既存の(たとえば、SAN cloned)SRのすべてのUUIDの名前を変更するための関数があります。古いUUIDの名前を変更するために使用できます。アタッチされているボリュームの最新バージョンと競合することなく、クローンを作成してアタッチします。
# returns scsi_id, scsi_lun_id and as a bonus Host_uuid
probe_sr(){
xen_Host_ip=$1
iscsi_device_ip=$2
iscsi_device_target_iqn=$3
iscsi_vol_name=$4
cmd="ssh root@$xen_Host_ip xe sr-probe type=lvmoiscsi device-config:target=$iscsi_device_ip device-config:targetIQN=$iscsi_device_target_iqn:$iscsi_vol_name"
echo $cmd
probe_out=`$cmd 2>&1`
#echo probe_out=$probe_out
scsi_id=`echo $probe_out | awk '{for(i=1;i<=NF;i++){if($i=="<SCSIid>"){i+=1;o=o","$i}}}END{print substr(o,2)}'`
echo scsi_id=$scsi_id
if [ -z $scsi_id ];then
exit
fi
# Only allow one LUN per target. To allow for more, enhance input to specify volume serial number and search probe output for it.
if [ `echo $scsi_id | awk -F, '{print NF}'` != 1 ];then
echo Only one LUN per iscsi target is supported
exit
fi
scsi_lun_id=`echo $probe_out | awk '{for(i=1;i<=NF;i++){if($i=="<LUNid>"){i+=1;o=o" "$i}}}END{print substr(o,2)}'`
echo scsi_lun_id=$scsi_lun_id
if [ -z $scsi_lun_id ];then
exit
fi
# This only works if it is a standalone XenServer, not in a Xen pool - so this becomes a requirement
Host_uuid=`ssh root@$xen_Host_ip xe Host-list --minimal`
if [ -z $Host_uuid ];then
echo Host_uuid=$Host_uuid
exit
fi
}
# Create SR wipes out contents of previous SR
create_sr(){
xen_Host_ip=$1
iscsi_device_ip=$2
iscsi_device_target_iqn=$3
iscsi_vol_name=$4
sr_name=$5
probe_sr $xen_Host_ip $iscsi_device_ip $iscsi_device_target_iqn $iscsi_vol_name
cmd="ssh root@$xen_Host_ip xe sr-create Host-uuid=$Host_uuid content-type=user name-label=$sr_name shared=true device-config:target=$iscsi_device_ip device-config:targetIQN=$iscsi_device_target_iqn:$iscsi_vol_name device-config:SCSIid=$scsi_id type=lvmoiscsi"
echo $cmd
$cmd
}
# mainly returns sr_uuid, but also pv_device used in uuid_regen_sr
get_sr_uuid_from_file_system(){
xen_Host_ip=$1
iscsi_device_ip=$2
iscsi_device_target_iqn=$3
iscsi_vol_name=$4
scsi_lun_id=$5
# Ensure the the VG for the new volume gets created
##iscsiadm -m discovery -t sendtargets -p $iscsi_device_ip
echo ssh root@$xen_Host_ip iscsiadm -m node -T $iscsi_device_target_iqn:$iscsi_vol_name -p $iscsi_device_ip:3260 --login
ssh root@$xen_Host_ip iscsiadm -m node -T $iscsi_device_target_iqn:$iscsi_vol_name -p $iscsi_device_ip:3260 --login
# get the pv_device name
# Some iSCSI SAN might need customization here
#scsi_id_short=`echo $scsi_id | awk '{print substr($1,1,length("36589cfc000000"))}'`
scsi_id_short=$scsi_id
echo scsi_id_short=$scsi_id_short
unset pv_device_short
tries=1
while [ $tries -le 3 ]&&[ -z $pv_device_short ];do
echo "ssh root@$xen_Host_ip ls -l /dev/disk/by-scsibus/ | egrep \"$scsi_id_short.*-[0-9]+:[0-9]+:[0-9]+:$scsi_lun_id -> \" | awk '{print \$NF}' | awk -F/ '{print \$NF}'"
pv_device_short=`ssh root@$xen_Host_ip ls -l /dev/disk/by-scsibus/ | egrep "$scsi_id_short.*-[0-9]+:[0-9]+:[0-9]+:$scsi_lun_id -> " | awk '{print $NF}' | awk -F/ '{print $NF}'`
pv_device=/dev/$pv_device_short
echo pv_device=$pv_device
if [ -z "$pv_device_short" ];then
sleep 1
fi
tries=$(( tries + 1 ))
done
if [ -z "$pv_device_short" ];then
exit
fi
if [ `echo $pv_device | wc -l` -gt 1 ];then
exit
fi
# pvscan ensure PVs, VGs and LVMs are visible
echo ssh root@$xen_Host_ip pvscan
ssh root@$xen_Host_ip pvscan 2>/dev/null
# get the VG UUID which is also what Xen uses for the SR UUID
sr_uuid=`ssh root@$xen_Host_ip "pvs 2>/dev/null" | egrep "$pv_device.*VG_XenStorage-" | awk '{print substr($2,length("VG_XenStorage-")+1)}'`
echo sr_uuid=$sr_uuid
if [ -z "$sr_uuid" ];then
exit
fi
# Thought this might be good, but think it caused problems. Better and seemingly required place is in detach_sr
#echo ssh root@$xen_Host_ip iscsiadm -m node -T $iscsi_device_target_iqn:$iscsi_vol_name -p $iscsi_device_ip:3260 --logout
#ssh root@$xen_Host_ip iscsiadm -m node -T $iscsi_device_target_iqn:$iscsi_vol_name -p $iscsi_device_ip:3260 --logout
}
attach_sr_xen(){
xen_Host_ip=$1
iscsi_device_ip=$2
iscsi_device_target_iqn=$3
iscsi_vol_name=$4
sr_name=$5
# Attach volume as a Xen SR
echo ssh root@$xen_Host_ip "xe sr-introduce uuid=$sr_uuid name-label=\"$sr_name\" type=lvmoiscsi shared=true"
ssh root@$xen_Host_ip "xe sr-introduce uuid=$sr_uuid name-label=\"$sr_name\" type=lvmoiscsi shared=true"
echo ssh root@$xen_Host_ip "xe pbd-create sr-uuid=$sr_uuid Host-uuid=$Host_uuid type=lvmoiscsi device-config-target=$iscsi_device_ip device-config-targetIQN=$iscsi_device_target_iqn:$iscsi_vol_name device-config-SCSIid=$scsi_id"
pbd_uuid=`ssh root@$xen_Host_ip "xe pbd-create sr-uuid=$sr_uuid Host-uuid=$Host_uuid type=lvmoiscsi device-config-target=$iscsi_device_ip device-config-targetIQN=$iscsi_device_target_iqn:$iscsi_vol_name device-config-SCSIid=$scsi_id"`
echo pbd_uuid=$pbd_uuid
if [ -z $pbd_uuid ];then
exit
fi
echo ssh root@$xen_Host_ip "xe pbd-plug uuid=$pbd_uuid"
ssh root@$xen_Host_ip "xe pbd-plug uuid=$pbd_uuid"
}
# Attach SR retains prior contents as opposed to create_sr
attach_sr(){
xen_Host_ip=$1
iscsi_device_ip=$2
iscsi_device_target_iqn=$3
iscsi_vol_name=$4
sr_name=$5
probe_sr $xen_Host_ip $iscsi_device_ip $iscsi_device_target_iqn $iscsi_vol_name
get_sr_uuid_from_file_system $xen_Host_ip $iscsi_device_ip $iscsi_device_target_iqn $iscsi_vol_name $scsi_lun_id
attach_sr_xen $xen_Host_ip $iscsi_device_ip $iscsi_device_target_iqn $iscsi_vol_name $sr_name
}
# Detach/forget SR
detach_sr(){
xen_Host_ip=$1
iscsi_device_ip=$2
iscsi_device_target_iqn=$3
iscsi_vol_name=$4
sr_name=$5
echo ssh root@$xen_Host_ip "xe sr-list name-label=\"$sr_name\" --minimal"
sr_uuid=`ssh root@$xen_Host_ip "xe sr-list name-label=\"$sr_name\" --minimal"`
echo sr_uuid=$sr_uuid
if [ -z $sr_uuid ];then
exit
fi
echo ssh root@$xen_Host_ip "xe pbd-list sr-uuid=$sr_uuid --minimal"
pbd_uuid=`ssh root@$xen_Host_ip "xe pbd-list sr-uuid=$sr_uuid --minimal"`
echo pbd_uuid=$pbd_uuid
if [ -z $pbd_uuid ];then
echo No PBD found, proceeding anyway
fi
echo ssh root@$xen_Host_ip iscsiadm -m node -T $iscsi_device_target_iqn:$iscsi_vol_name -p $iscsi_device_ip:3260 --logout
ssh root@$xen_Host_ip iscsiadm -m node -T $iscsi_device_target_iqn:$iscsi_vol_name -p $iscsi_device_ip:3260 --logout
if [ ! -z $pbd_uuid ];then
echo ssh root@$xen_Host_ip "xe pbd-unplug uuid=$pbd_uuid"
ssh root@$xen_Host_ip "xe pbd-unplug uuid=$pbd_uuid"
fi
echo ssh root@$xen_Host_ip "xe sr-forget uuid=$sr_uuid"
ssh root@$xen_Host_ip "xe sr-forget uuid=$sr_uuid"
echo "It is now ok to remove the volume from the storage array"
}
# generates new PV, SR (VG) and VDI (LVM) uuids for a cloned and unattached iSCSI SR, leaving it unattached
uuid_regen_sr(){
xen_Host_ip=$1
iscsi_device_ip=$2
iscsi_device_target_iqn=$3
iscsi_vol_name=$4
sr_name=$5
probe_sr $xen_Host_ip $iscsi_device_ip $iscsi_device_target_iqn $iscsi_vol_name
get_sr_uuid_from_file_system $xen_Host_ip $iscsi_device_ip $iscsi_device_target_iqn $iscsi_vol_name $scsi_lun_id
# Import the clone giving it a new PV ID and VG UUID
new_sr_uuid=`uuidgen`
echo ssh root@$xen_Host_ip vgimportclone --basevgname VG_XenStorage-$new_sr_uuid --import $pv_device
ssh root@$xen_Host_ip vgimportclone --basevgname VG_XenStorage-$new_sr_uuid --import $pv_device
# get the new VG UUID which is also what Xen uses for the SR UUID
sr_uuid=`ssh root@$xen_Host_ip "pvs 2>/dev/null" | egrep "$pv_device.*VG_XenStorage-" | awk '{print substr($2,length("VG_XenStorage-")+1)}'`
echo sr_uuid=$sr_uuid
if [ -z $sr_uuid ]||[ $sr_uuid != $new_sr_uuid ];then
echo bad sr_uuid
exit
fi
attach_sr_xen $xen_Host_ip $iscsi_device_ip $iscsi_device_target_iqn $iscsi_vol_name $sr_name
# pvscan to get rid of some Linux duplicate dev errors
echo ssh root@$xen_Host_ip pvscan
ssh root@$xen_Host_ip pvscan 2>/dev/null
echo -n waiting for VDI count to settle :
prev_num_vdis=`ssh root@$xen_Host_ip "xe vdi-list sr-uuid=$sr_uuid" | grep name-label | wc -l`
echo -n $prev_num_vdis" "
sleep 5
num_vdis=`ssh root@$xen_Host_ip "xe vdi-list sr-uuid=$sr_uuid" | grep name-label | wc -l`
echo -n $num_vdis" "
while [ $num_vdis != $prev_num_vdis ];do
sleep 5
num_vdis=`ssh root@$xen_Host_ip "xe vdi-list sr-uuid=$sr_uuid" | grep name-label | wc -l`
echo -n $num_vdis" "
prev_num_vdis=$num_vdis
done
echo ""
metadata_sr_uuid=`echo $sr_uuid | awk '{for(i=1;i<=length($1);i++){c=substr($1,i,1);if(c=="-"){o=o"--"}else{o=o""c}};print o}'`
echo ssh root@$xen_Host_ip "cp VG_XenStorage--$metadata_sr_uuid""-MGT ."
ssh root@$xen_Host_ip "cp /dev/mapper/VG_XenStorage--$metadata_sr_uuid""-MGT ."
for vdi_uuid in `ssh root@$xen_Host_ip lvs VG_XenStorage-$sr_uuid | grep VHD\- | awk '{print substr($1,length("VHD-")+1)}'`;do
new_uuid=`uuidgen`
echo ssh root@$xen_Host_ip "sed -i \"s/$vdi_uuid/$new_uuid/g\" VG_XenStorage--$metadata_sr_uuid""-MGT"
ssh root@$xen_Host_ip "sed -i \"s/$vdi_uuid/$new_uuid/g\" VG_XenStorage--$metadata_sr_uuid""-MGT"
echo ssh root@$xen_Host_ip "lvrename /dev/VG_XenStorage-$sr_uuid/VHD-$vdi_uuid /dev/VG_XenStorage-$sr_uuid/VHD-$new_uuid"
ssh root@$xen_Host_ip "lvrename /dev/VG_XenStorage-$sr_uuid/VHD-$vdi_uuid /dev/VG_XenStorage-$sr_uuid/VHD-$new_uuid"
done
echo ssh root@$xen_Host_ip "cp VG_XenStorage--$metadata_sr_uuid""-MGT /dev/mapper/VG_XenStorage--$metadata_sr_uuid""-MGT"
ssh root@$xen_Host_ip "cp VG_XenStorage--$metadata_sr_uuid""-MGT /dev/mapper/VG_XenStorage--$metadata_sr_uuid""-MGT"
echo ssh root@$xen_Host_ip "rm -f VG_XenStorage--$metadata_sr_uuid""-MGT"
ssh root@$xen_Host_ip "rm -f VG_XenStorage--$metadata_sr_uuid""-MGT"
echo ssh root@$xen_Host_ip "xe sr-scan uuid=$sr_uuid"
ssh root@$xen_Host_ip "xe sr-scan uuid=$sr_uuid"
detach_sr $xen_Host_ip $iscsi_device_ip $iscsi_device_target_iqn $iscsi_vol_name $sr_name
}
VMの数が少なく、ほとんどが1000未満のお客様(Nexentaのお客様)は、VM)ごとにLUNを実行することを選択します。これにより、個々のVMのNexentaStorから簡単にスナップショットを作成できます。クールなのは、1つのゴールデンイメージ(別名clome-master)を作成できることです。次に、そのクローンマスターを使用して、クローンを作成するだけで新しいVMを起動できます。さらに、追加のディスク領域を使用しないという利点もあります。