Month: May 2014

Upgrade your Hyper-V Nutanix block to NOS 3.5.4

img_nutanix-v5

Hi Guys,

I wanted to write a short post on the things I encountered when upgrading my Hyper-V Nutanix blocks to the latest NOS 3.5.4. The following information is provided “as is”, I have found it to work in my environment but I am not an official employee for Nutanix or Microsoft.

The general setup I am working with exists of 2 Nutanix clusters, both running NOS 3.5.3.1, the main reason I was pretty happy with the NOS 3.5.4 release is because it now includes VSS support for Hyper-V.  The following information can be retrieved from the release notes:

  • Volume Shadow Copy Service (VSS) support for Hyper-V hosts [FEAT-632]
  • Since the Microsoft VSS framework requires a full share backup for every virtual disk contained in the share, Nutanix recommends that customers plan their environment to accommodate no more than 20 virtual disks per SMB share for optimal backup performance. Going beyond the limit might result in unpredictable behavior such as backups failing. Multiple SMB shares are therefore recommended for environments with a large number of virtual disks.

I won’t be discussing the real upgrade steps, since these are already covered in the upgrade guide, however I will be explaining the post-installation tasks you have to do in order to join the Nutanix storage to Active Directory, changes to GFLAGS and a quick comparison of the Nutanix diagnostics.py results between NOS 3.5.3.1 and NOS 3.5.4.

Start op an SSH session and issue the “cluster info” command through the ncli and write down the cluster name.

screen27

The following commands pre-creates a computer account in AD. According to nutanix this is only supported with a server 2012 domain controller with a server 2012 domain functional level, I don’t see why since this works perfectly with a 2008 R2 domain controller and i’m even running server 2003 domain functional level. The key here is to have any member server running at least powershell 3 and has the active directory modules loaded (these can be found in the RSAT feature tools).

Replace fqdn, clustername and clusterip to your corresponding environment:

#adds a DNS-entry for your cluster with it’s IP

dnscmd.exe /recordadd ‘fqdn’ ‘clustername’ ‘A’ ‘clusterip’

#prompts for a password for the nutanix storage computer object
$password=(get-credential -username ‘clustername.fqdn’ -message “Please enter a password for the Nutanix storage computer object”).password

#pre-creates the nutanix storage computer object
New-ADComputer -Name clustername -SAMAccountName clustername -UserPrincipalName clustername@fqdn -PasswordNeverExpires:$true -cannotChangePassword:$true -AccountPassword $password -DisplayName ‘Nutanix storage cluster on clustername’ -Description ‘Nutanix storage cluster on clustername’ -DNSHostName clustername.fqdn

Now that the account was pre-created, we still need to attach it using the nutanix ncli:

screen28

Additionally you need to change a GFLAG setting for both clusters, note that this is a cluster-wide setting and is necessary to improve overall VSS performance, contact Nutanix support to have this changed for you.

I also kept track of the diagnostics output between NOS 3.5.3.1 and NOS 3.5.4. This really shows that the power is truly in the software, I’m already looking forward to the NOS 4.0 release, from what i’ve heard there will be another performance boost on the Hyper-V platform.

The following table lists the different diagnostics outputs before and after the upgrade on a NX-1450:

  NUTANIX CLUSTER
  NOS 3.5.3.1 NOS 3.5.4
Sequential write bandwidth (MBps) 447 542
Sequential read bandwidth (MBps) 1757 1764
Random read (IOPS) 49496 54343
Random write (IOPS) 22367 27696

As you can see my random write IOPS are 20% faster and the random read IOPS almost 10% faster, this all thanks to the software upgrade. Do note that you have interpret these values as a total number of IOPS in the cluster, mine consists of 4 nodes so in average you could say I can reach up to 13585 random read IOPS and 6924 random write IOPS per node!

That’s it. If you run into any problems, do contact Nutanix support, I must admit they have the best support I have ever encountered with. Thumbs up and keep up the good work!

I will try to cover the integration, maybe some best-practices with Veeam V7 in a next blog.

 

UPDATE

I had a nice chat with Nutanix support, they provided me with the following information which explaines why we can see a 20% of increase in performance. They have adapted the power plan settings in Server 2012 R2 to high performance.

If the cluster is running 3.5.4 the power profile should be already high performance. You can check it with:
“powercfg -l”

The same can be done in powershell ofcourse:

$targetServers = ‘ntnx-1′,’ntnx-2′,’ntnx-3′,’ntnx-4’
Invoke-Command -ComputerName $targetServers {
Try {
# No need to check if its currently active
powercfg -SETACTIVE SCHEME_MIN
} Catch {
Write-Warning -Message “Unable to set power plan to high performance”
}

# Print power setting
hostname
powercfg -getactivescheme
}
screen29

Davy

 

Exporting your Nutanix Hyper-V machines with Powershell

img_nutanix-v5

Hi Guys,

In this short blog post you will find a powershell script I created to quickly export my hyper-v virtual machines running on Nutanix. As you may or may not know, we can do this LIVE. Yes that’s right, there is no longer need to shut down your virtual machine before you can export it. This makes testing any changes on a production machine pretty easy. There is even a possiblity to export a snapshot of your virtual machine live. Anyway all of that are built in features of Hyper-V ofcourse.

First of all I’m guessing you know what Nutanix is and what it can deliver to you and your company so I’m jumping right in the setup I created. The main idea here was to have a script that I could execute on demand or via a scheduled task. Since I have multiple Nutanix nodes in my cluster I would need to call upon this script for every node. So in general this means I have created two scripts:

  • One to execute the actions to export the running virtual machines to another nutanix container and copy it over to a NAS
  • One that calls the above script once for every node and sends me a nice e-mail afterwards

I’m no powershell guru but this is something that you can easily use – maybe adapt it – in your own environment.

$date = Get-Date -format yyyy-MM-dd
$backupDir = “\\nutanix\CTR1\BACKUP\$date”
$Logfile = “$backupdir\log.log”

#Function to append data to the log file
Function LogWrite
{
Param ([string]$logstring)
Add-content $Logfile -value $logstring
}

import-module hyper-v
$vms = get-vm

foreach ($vm in $vms)
{
Try{
$vmname = $vm.name
$VMState = $vm.State
If ($vm.name -like “NTNX*”)
{
write-host “This is a controller vm, do not export”

}elseif($vmstate -eq “running”){
$timestamp = get-date
logwrite($timestamp)
logwrite($vmname, $vmstate,”Exporting the virtual machine “”$VMname””… “)
Write-Host “Exporting the virtual machine “”$vm””… ” -NoNewline
Export-VM -vm $vm -Path $backupdir
Write-Host “Successfully exported $vmname” -ForegroundColor Green
logwrite(“Succesfully exported $vmname”)
$timestamp = get-date
logwrite($timestamp)
logwrite(“”)
}
}
Catch
{
Write-Host “Failed” -ForegroundColor Red
logwrite(“Failed to export””$vmname”” to “”$backupdir”)
logwrite(“”)

}

}

 

If you were to run this interactively, you can verify this export progress easily. Note that this will only export the running virtual machines but excluding the nutanix controller vm’s:

screen25

Ofcourse the goal would be to have this script run at a certain time and this for every  node in your cluster. So far I have only adapted the scripts to call upon for every node. You could adapt this to first enumerate all nodes in the cluster and work with a for each loop. Try it out! 🙂

The log file looks something like this:

screen26

This brings us to the next script, running it for every node and then reporting afterwards.

#clean up nutanix container  from yesterday’s backup
$limit = (Get-Date).AddDays(-1)
$path = “\\nutanix\CTR1\BACKUP”
# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

#start export
invoke-command -ComputerName NTNX-XYLOS-1 ‘C:\scripts\export-vm.ps1’
invoke-command -ComputerName NTNX-XYLOS-2 ‘C:\scripts\export-vm.ps1’
invoke-command -ComputerName NTNX-XYLOS-3 ‘C:\scripts\export-vm.ps1’

#START WITH REPORT

$Logfile= “$backupdir\$date\log.log”
$smtpServer = “xxxx”
$date = Get-Date -format yyyy-MM-dd
$attlog = new-object Net.Mail.Attachment($Logfile)
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg.From = “xxxxxxxxxxx”
$msg.To.Add(“xxxxxxxxxxx”)
$msg.To.Add(“yyyyyyyyyyy”)
$msg.Subject = “Nutanix backup script – $date”
$msg.Body = “Attached is the Nutanix export log for $date”
$msg.Attachments.Add($attlog)
$smtp.Send($msg)
$att.Dispose()

And there you go!