Manipulando snapshots e clonagem do XenServer com SAN do ZFS

3

Estou planejando configurar uma máquina XenServer que use uma SAN baseada em NexentaOS / ZFS para armazenamento das Imagens de Disco Virtual (VDIs) por meio do iSCSI. Eu sei que eu poderia apenas configurar um grande Repositório de Armazenamento (SR) na SAN e deixar o XenServer cuidar do snapshot e da clonagem de imagens de disco. No entanto, eu adoraria explorar mais o poder do ZFS e usá-lo para snapshot / clonagem, por alguns motivos:

  1. Não tenho certeza de como o snapshot / clonagem do XenServer funciona, mas se for baseado no LVM, estou preocupado em encontrar problemas ao lidar com vários instantâneos. Eu fiz algumas experiências há um tempo atrás com vários instantâneos do LVM dos mesmos dados e o desempenho parecia ruim e os instantâneos desperdiçavam muito espaço. Parece que os instantâneos do ZFS são muito superiores aos instantâneos do LVM.
  2. A SAN levaria instantâneos do ZFS periódicos automáticos (e eficientes) que poderiam voltar no tempo, e eu adoraria poder reverter uma VM para esse instantâneo do ZFS.

Permitir que o ZFS manipule snapshot / clonagem em vez de fazê-lo através do XenServer seja aconselhável e, em caso afirmativo, qual é a melhor maneira de executá-lo? Se eu colocar todos os VDIs em um único SR grande e tirar instantâneos do ZFS de todo o SR, não seria possível reverter uma VM individual de cada vez. Eu poderia criar um SR por VDI, e se eu tivesse que reverter um VDI, eu cuidadosamente separaria o SR, o colocaria de volta na SAN e o anexaria novamente. No entanto, estou supondo que eu teria problemas ao anexar um SR clonado se o XenServer detectasse UUIDs SR duplicados. Existem maneiras melhores de lidar com clonagem ou reverter para instantâneos anteriores da SAN?

    
por Alex 21.05.2011 / 06:11

5 respostas

3

Como outras respostas aludidas, a abordagem ideal é LUN-por-VDI. No começo, não parecia que era possível fazer isso, mas há um driver SR "iscsi" não documentado que criará um LUN-per-VDI SR (descobri isso ao examinar o diretório / opt / xensource / sm - veja o arquivo ISCSISR.py). Você essencialmente configura um SR para cada destino iSCSI e o XenServer cria os VDIs para cada LUN nesse destino. Você só pode configurá-lo por meio da linha de comando, incluindo a criação dos VBDs e sua anexação às VMs. Os VBDs e VDIs nem sequer aparecem no XenCenter.

Aqui está um exemplo de comando para configurá-lo:

xe sr-create name-label=san type=iscsi device-config:target=<IP address of target> device-config:targetIQN=<IQN of target> shared=true

Isso criará automaticamente um VDI para cada LUN iSCSI. Se você acabar adicionando um novo iSCSI LUN no SAN, o XenServer adicionará um novo VDI para ele depois de executar o seguinte comando:

xe sr-scan uuid=<UUID of SR>

Isso também funciona ao adicionar VDIs para LUNs clonados - o novo VDI recebe um novo UUID.

Além disso, se você acaba redimensionando um LUN, o XenServer não atende automaticamente, então você deve executar o seguinte:

xe vdi-forget uuid=<UUID of VDI that you resized>
iscsiadm -m node -R
xe sr-scan uuid=<UUID of SR>

E para criar um VBD e anexá-lo a uma VM:

xe vbd-create vm-uuid=<UUID of VM> device=<VBD device #, e.g. 0> vdi-uuid=<VDI of UUID>
    
por 25.05.2011 / 01:58
2

Eu fiz várias configurações com o xenserver semelhante a esta configuração

E eu usei um dos dois métodos

  1. Se eu não tiver muitos vms, eu crio o disco do sistema com VDI por VM e o disco de dados como anexo direto lun do Iscsi

  2. Se eu tiver muitos vm (20+) eu crio um grande SR e quando eu precisar reverter posso

    renomeie o VG antes de conectar ao xenserver (vgrename em uma máquina diferente - mesmo virtual)

    Você pode até mesmo anexar o snapshot grande SR a uma máquina virtual e exportá-lo novamente com iscsi,

Espero que não seja muito complicado :)

    
por 21.05.2011 / 09:48
1

Configuração interessante ... especialmente para o ZFS.

De acordo com minha experiência com o XenServer, o melhor que você pode fazer é deixar o sistema de armazenamento gerenciar o disco (e os instantâneos e outras tarefas administrativas).

Eu acho que você deve deixar o ZFS lidar com snapshots e clonagem, mas não tenho certeza se o melhor que você pode fazer é dar ao XenServer um grande SR (eu concordo com o que você disse sobre reverter). Esta é uma configuração muito complexa, porque se você tem um monte de VM, você tem um monte de VDI, a administração pode ser uma bagunça, mas você vai ganhar a capacidade de reverter. Eu usaria um VDI por VM.

Respondendo a sua pergunta, se você verificar que desanexou o SR ao reverter, você não terá problemas ao anexar um SR clonado. Eu fiz isso antes, não no XenServer, mas no XCP ( link )

    
por 21.05.2011 / 06:47
1

Nossos clientes (clientes da Nexenta) que não têm muitas VMs, menos de 1000, optam por fazer um LUN por VM às vezes. Isso permite que você capture instantaneamente o NexentaStor de cada VM individual. O legal é que você pode criar uma imagem dourada, também conhecida como clome-master. Em seguida, use esse clone-master para ativar novas VMs, simplesmente clonando-o. E o benefício adicional é que você não está usando nenhum espaço adicional em disco.

    
por 22.05.2011 / 05:46
1

Isso parece relevante. O script bash abaixo tem funções para anexar e desanexar um SR, bem como renomear todos os UUIDs em um SR existente (por exemplo, SAN clonado). Ele pode ser usado para renomear os UUIDs de um clone antigo e anexá-lo sem entrar em conflito com a versão mais recente do volume que está sendo anexado.

    # 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
}
    
por 04.06.2015 / 17:29