search
Categories
Sponsors
VirtualMetric Hyper-V Monitoring, Hyper-V Reporting
Archive
Blogroll

Badges
MCSE
Community

Cozumpark Bilisim Portali
Posted in Windows Powershell, Windows Server | No Comment | 2,750 views | 04/07/2014 18:00

Lets assume that you have a 3 years old storage and you are using it to place your virtual machines on Hyper-V Cluster. Then you bought a new storage box, you created LUNs on it and assign them as a CSV volumes on your existing Hyper-V Cluster. So next achievement would be migrating your virtual machines from old storage to new one.

Update: This script is now a function called Start-CSVMigration, you can reach it from:
http://www.yusufozturk.info/virtual-machine-manager/hyper-v-csv-migration-start-csvmigration.html

That migration could be a headache if you have many VMs and many storage LUNs. So in that case, you can use following script to migrate Virtual Machines per CSV Volume. Just you need to specify which CSV volume you would like to drain. So let’s assume that volume is Volume1. I will specify that volume by following line:

1
2
# Target Volume
$TargetVolume = "Volume1"

Now you need to specify other CSV Luns as well to filter them. Otherwise, you can migrate a VM to old storage again. So we are filtering them by following lines:

1
2
3
4
5
6
7
8
# Filtered Volumes
$FilteredVolumes = @()
$FilteredVolumes += $TargetVolume
$FilteredVolumes += "Volume2"
$FilteredVolumes += "Volume3"
$FilteredVolumes += "Volume4"
$FilteredVolumes += "Volume5"
$FilteredVolumes += "Volume6"

We are creating an array called FilteredVolumes then adding our old storage luns to this array. You will see that I’m also adding $TargetVolume to same array. Because there is a chance to try to migrate a VM to same volume. So that will prevent that kind of issues.

So how can I get destination volume?

1
2
# Full Query
$FullQuery = '((Get-ClusterSharedVolume |' + $Query + ' Select -ExpandProperty SharedVolumeInfo | Select @{label="Name";expression={(($_.FriendlyVolumeName).Split("\"))[-1]}},@{label="FreeSpace";expression={($_ | Select -Expand Partition).FreeSpace}} | Sort FreeSpace -Descending)[0]).Name'

As you can notice from the code below, i’m getting all CSV volumes, filtering old storage volumes, sorting new storage CSVs by their free space and selecting the storage which has biggest available disk space.

So I’ll place VM into that volume:

Move-VMStorage -ComputerName "$ClusterNode" -VMName "$VMName" -DestinationStoragePath "C:\ClusterStorage\$Volume\$VMName"

If you get the idea, now I can share full script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# Target Volume
$TargetVolume = "Volume1"
 
# Filtered Volumes
$FilteredVolumes = @()
$FilteredVolumes += $TargetVolume
$FilteredVolumes += "Volume2"
$FilteredVolumes += "Volume3"
$FilteredVolumes += "Volume4"
$FilteredVolumes += "Volume5"
$FilteredVolumes += "Volume6"
 
# Clear Query
$Query = $Null;
 
# Create Query
foreach ($FilteredVolume in $FilteredVolumes)
{
	$Query = $Query + ' Where {$_.SharedVolumeInfo.FriendlyVolumeName -notlike "*' + $FilteredVolume + '"} |'
}
 
# Full Query
$FullQuery = '((Get-ClusterSharedVolume |' + $Query + ' Select -ExpandProperty SharedVolumeInfo | Select @{label="Name";expression={(($_.FriendlyVolumeName).Split("\"))[-1]}},@{label="FreeSpace";expression={($_ | Select -Expand Partition).FreeSpace}} | Sort FreeSpace -Descending)[0]).Name'
 
# Get Cluster Nodes
$ClusterNodes = Get-Cluster | Get-ClusterNode
 
foreach ($ClusterNode in $ClusterNodes)
{
	# Clear Variables
	$VMs = $Null;
 
	# Get All Virtual Machines on Target Volume
	$VMs = Get-VM -ComputerName "$ClusterNode" | Where ConfigurationLocation -like "C:\ClusterStorage\$TargetVolume\*"
 
	foreach ($VM in $VMs)
	{
		# Get VM Information
		$VMName = $VM.Name
 
		Write-Host " "
		Write-Host "Working on $VMName .."
		Write-Host "Hyper-V Host: $ClusterNode"
 
		# Get Volume Information
		$Volume = Invoke-Expression $FullQuery
 
		# Move Virtual Machine
		Move-VMStorage -ComputerName "$ClusterNode" -VMName "$VMName" -DestinationStoragePath "C:\ClusterStorage\$Volume\$VMName"
 
		Write-Host "Done."
	}
}

It’s enough to run this script on one of the Cluster Node, so that will start migrating virtual machines. That will also give an output, so you will be able to see which VM you are migrating. I hope you will find it useful. See you!


Posted in Hosting & IIS7, Virtual Machine Manager, Windows Server | 2 Comments | 7,692 views | 21/10/2009 16:40

Bugün uzun zamandır yapmak istediğim fakat donanım yetersizlikleri ve vakit darlığı nedeniyle bir türlü yapmayı başaramadığım sistemi yarattım. Şuan 6 adet Windows Server 2008 R2 üzerinde tamamen yedekli bir yapıda çalışan bir IIS 7.5 Web Farm’a sahibiz. Teknik detaylara çok fazla girmeyeceğim fakat yaratmış olduğumuz yapıyı biraz gözünüzde canlandırın diye notlarımı yazacağım.

Çalışma için 2 fiziksel sunucu, 4 sanal sunucu kullanıldı.

Fiziksel sunucular:
VXEON01
VXEON02

Sanal sunucular:
INODE01
INODE02
VSPACE01
VSPACE02

INODE01 ile VSPACE01 -> VXEON01 üzerinde
INODE02 ile VSPACE02 -> VXEON02 üzerinde

VXEON01 ile VXEON02 üzerinde Cluster Shared Volumes ile Failover Cluster aktif durumda. Yani fiziksel sunucuda oluşacak donanımsal bir sorunda ya da update sonrası restart’ta diğer sunucuda çalışmaya devam ediyorlar.

VSPACE01 ile VSPACE02, kendi aralarında Clustered File Server. FTP hesapları ve IIS ayarları bu sunucu üzerinde tutuluyor.

INODE01 ile INODE02 ise Shared Configuration’a sahip Web Farm. Ayrıca kendi aralarında NLB’ler. İki sunucu da çalışır durumdayken hem siteye gelen ziyaretçilerin yükü bu iki sunucuya bölüştürülüyor hem de update nedenli bir restart’ta diğer sunucudan hizmet vermeye devam ediyor. Ayrıca external bir Clustered File Server kullanarak, sync problemlerini sıfıra indirmiş oldum. Ayrıca sunucular üzerinde Offline Files Caching aktif. Storage Server’ların ikisi de anlık olarak hizmet veremezse, IIS sunucusu kendi cache’inden hizmet veriyor.

Storage olarak kullandığımız Dell EqualLogic ile Clustered File Server arasında MPIO aktif. Ethernet kartlarından bir tanesi bile uçsa, diğeri üzerinden iletişim devam ediyor. Yine Offline Files özelliği sayesinde EqualLogic bağlantısı tümden gitmiş olsa bir cache’ten çalışmaya devam edebilir yapı. Offline Files Caching’i read only olarak ayarlayarak, kısa süreli erişim problemlerinden sonra yaşanılabilecek sync sorunlarını da engellemiş olduk.

Kurulan yapı kısaca bu şekilde. Kurulum ve yapılandırma yaklaşık 12 saatimi yedi fakat ortaya mükemmel bir sistem çıktı. NLB ile Cluster’ı aynı yapı içinde görebilmek harika bir duygu. Bu tür sistemler ile %100 online kalan shared hosting hesapları, artık hayal değil.