web-dev-qa-db-ja.com

XenServerのスナップショットとZFSでのクローン作成の処理SAN

ISCSIを介した仮想ディスクイメージ(VDI)のストレージにNexentaOS/ZFSベースのSANを使用するXenServerマシンをセットアップすることを計画しています。 SANに大きなストレージリポジトリ(SR)をセットアップして、XenServerにディスクイメージのスナップショットとクローン作成を任せることができることはわかっています。ただし、いくつかの理由から、ZFSの機能をさらに活用して、スナップショット/クローン作成に使用したいと思います。

  1. XenServerのスナップショット/クローン作成がどのように機能するかはわかりませんが、LVMに基づいている場合、複数のスナップショットを処理するときに問題が発生するのではないかと心配しています。同じデータの複数のLVMスナップショットを使用してしばらく前にいくつかの実験を行ったところ、パフォーマンスが低下し、スナップショットが多くのスペースを浪費したように見えました。 ZFSスナップショットはLVMスナップショットよりもはるかに優れているようです。
  2. SANは、自動(かつ効率的な)定期的なZFSスナップショットを取得しますが、これはしばらく前に戻る可能性があります。VMをそのようなZFSスナップショットに戻すことができるようにしたいと思います。 。

XenServerを介してスナップショット/クローンを作成する代わりに、ZFSにスナップショット/クローンを処理させることをお勧めします。その場合、それを実行するための最良の方法は何ですか?すべてのVDIを単一の大きなSR内に配置し、SR全体のZFSスナップショットを取得すると、一度に個々のVMをロールバックできなくなります。 VDIごとに1つのSRを作成できます。また、VDIをロールバックする必要がある場合は、SRを慎重に切り離し、SANでロールバックして、再度接続します。ただし、XenServerが重複するSR UUIDを検出した場合、複製されたSRをアタッチするときに問題が発生すると推測しています。 SANから以前のスナップショットへのクローン作成またはロールバックを処理するためのより良い方法はありますか?

3
Alex

他の回答がほのめかしているように、理想的なアプローチは、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>
3
Alex

このセットアップと同様に、xenserverでいくつかの構成を行いました

そして私は2つの方法のうちの1つを使用しました

  1. 多くのVMがない場合は、VM)ごとにVDIを使用してシステムディスクを作成し、データディスクを直接接続ISCSIとして作成します。

  2. Vm(20+)がたくさんある場合は、大きなSRを作成し、ロールバックする必要がある場合は、

    A. xenserverに接続する前にVGの名前を変更します(別のマシンのvgrename-仮想でも)

    B.大きなSRスナップショットを仮想マシンにアタッチし、iscsiを使用して再度エクスポートすることもできます。

複雑すぎないことを願っています:)

2
John

興味深い構成..特にZFS用。

XenServerでの私の経験によると、できる最善のことは、ストレージシステムにディスク(およびスナップショットやその他の管理タスク)を管理させることです。

ZFSにスナップショットとクローン作成を処理させるべきだと思いますが、XenServerに1つの大きなSRを与えることが最善かどうかはわかりません(ロールバックについてあなたが言ったことに同意します)。これは非常に複雑な設定です。VM多くのVDIがある場合、管理が混乱する可能性がありますが、ロールバックする機能を獲得できるためです。 dVMごとに1つのVDIを使用します。

質問に答えて、ロールバック時にSRを切り離すことを再確認すれば、複製されたSRをアタッチするときに問題は発生しません。 XenServerではなくXCPで以前にそれを実行しました( http://goo.gl/4wfE

1
boris quiroz

これは適切なようです。以下の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
}
1
pekowski

VMの数が少なく、ほとんどが1000未満のお客様(Nexentaのお客様)は、VM)ごとにLUNを実行することを選択します。これにより、個々のVMのNexentaStorから簡単にスナップショットを作成できます。クールなのは、1つのゴールデンイメージ(別名clome-master)を作成できることです。次に、そのクローンマスターを使用して、クローンを作成するだけで新しいVMを起動できます。さらに、追加のディスク領域を使用しないという利点もあります。

1
slashdot