Quantcast
Channel: Practical 365
Viewing all articles
Browse latest Browse all 515

PowerShell Scripts for Balancing Database Availability Groups

$
0
0

One of the recommendations in Microsoft’s Preferred Architecture for Exchange Server 2013 is to distribute active database copies evenly across all members of a database availability group.

As with the namespace model, each DAG within the site resilient datacenter pair operates in an unbound model with active copies distributed equally across all servers in the DAG. This model provides two benefits:

  1. Ensures that each DAG member’s full stack of services is being validated (client connectivity, replication pipeline, transport, etc.).
  2. Distributes the load across as many servers as possible during a failure scenario, thereby only incrementally increasing resource utilization across the remaining members within the DAG.

You can achieve an even distribution of active database copies in your DAG by applying a combination of PowerShell scripts and activation preference configuration.

Reviewing Your Activation Preference Distribution

To review the current configuration of your database availability group you can use two PowerShell scripts. The first script is RedistributeActiveDatabases.ps1 which is available in the $exscripts folder of any server or management workstation that has the Exchange management tools installed.

To look at the current database distribution use RedistributeActiveDatabases.ps1 with the -ShowDatabaseDistributionByServer switch.

[PS] C:\>Set-Location $exscripts
[PS] C:\...\scripts>.\RedistributeActiveDatabases.ps1 -DagName DAG1 -ShowDatabaseDistributionByServer
ServerName          : SYDEX2
TotalDbs            : 4
ActiveDbs           : 2
PassiveDbs          : 2
PreferenceCountList : {0, 4, 0, 0}
MountedDbs          : 2
DismountedDbs       : 0
DagName             : DAG1
ServerName          : MELEX1
TotalDbs            : 4
ActiveDbs           : 0
PassiveDbs          : 4
PreferenceCountList : {0, 0, 4, 0}
MountedDbs          : 0
DismountedDbs       : 0
DagName             : DAG1
ServerName          : SYDEX1
TotalDbs            : 4
ActiveDbs           : 2
PassiveDbs          : 2
PreferenceCountList : {4, 0, 0, 0}
MountedDbs          : 2
DismountedDbs       : 0
DagName             : DAG1
ServerName          : MELEX2
TotalDbs            : 4
ActiveDbs           : 0
PassiveDbs          : 4
PreferenceCountList : {0, 0, 0, 4}
MountedDbs          : 0
DismountedDbs       : 0
DagName             : DAG1

The detail we’re most interested in at this stage is the PreferenceCountList. For the DAG member SYDEX1 the value is “{4, 0, 0, 0}” which means:

  • 4 database copies on SYDEX1 with Activation Preference 1
  • 0 database copies on SYDEX1 with AP of 2, 3, or 4

A better visual representation of the database AP layout can be gathered by running Get-DAGApMap.ps1 (available on Github), which generates a CSV of the configuration that is easier to read.

[PS] C:\Scripts>.\Get-DagApMap.ps1

get-dagagmap-csv-01

The DAG shown above is clearly not balanced, so what can we do about that?

Balancing Activation Preferences for a Database Availability Group

Although we can manually change the activation preference values for each of the database copies it would be quite tedious to do so for a large DAG. Instead, we can use RedistributeActiveDatabases.ps1 again, this time with the -BalanceActivationPreferences switch. If you don’t want to be prompted for each change that is made add the -Confirm:$false switch as well.

[PS] C:\...\scripts>.\RedistributeActiveDatabases.ps1 -DagName DAG1 -BalanceActivationPreferences
***************************************
Balance DAG DBs
Tuesday, April 28, 2015 12:20:05 PM
***************************************
Dag                                :   DAG1
ServerCount                        :   4
DatabaseCount                      :   4
CopiesCount                        :   16
--------------------------
Starting Site Distribution
--------------------------
SiteName             TotalDbs ActiveDbs PassiveDbs PreferenceCountList MountedDbs DismountedDbs DagName
--------             -------- --------- ---------- ------------------- ---------- ------------- -------
Melbourne-Datacenter        8         0          8 {0, 0, 4, 4}                 0             0 DAG1
Sydney-Datacenter           8         4          4 {4, 4, 0, 0}                 4             0 DAG1
----------------------------
Starting Server Distribution
----------------------------
ServerName TotalDbs ActiveDbs PassiveDbs PreferenceCountList MountedDbs DismountedDbs DagName
---------- -------- --------- ---------- ------------------- ---------- ------------- -------
MELEX1            4         0          4 {0, 0, 4, 0}                 0             0 DAG1
MELEX2            4         0          4 {0, 0, 0, 4}                 0             0 DAG1
SYDEX1            4         2          2 {4, 0, 0, 0}                 2             0 DAG1
SYDEX2            4         2          2 {0, 4, 0, 0}                 2             0 DAG1
----------------------------------------
Starting Activation Preference Balancing
----------------------------------------
Database copy 'DB01\MELEX1': Activation Preference = 1
Database copy 'DB01\MELEX2': Activation Preference = 2
Database copy 'DB01\SYDEX1': Activation Preference = 3
Database copy 'DB01\SYDEX2': Activation Preference = 4
Database copy 'DB02\MELEX1': Activation Preference = 2
Database copy 'DB02\MELEX2': Activation Preference = 3
Database copy 'DB02\SYDEX1': Activation Preference = 4
Database copy 'DB02\SYDEX2': Activation Preference = 1
Database copy 'DB03\MELEX1': Activation Preference = 3
Database copy 'DB03\MELEX2': Activation Preference = 4
Database copy 'DB03\SYDEX1': Activation Preference = 1
Database copy 'DB03\SYDEX2': Activation Preference = 2
Database copy 'DB04\MELEX1': Activation Preference = 4
Database copy 'DB04\MELEX2': Activation Preference = 1
Database copy 'DB04\SYDEX1': Activation Preference = 2
Database copy 'DB04\SYDEX2': Activation Preference = 3

After the script has finished running we can use the same methods shown earlier to review the configuration.

[PS] C:\...\scripts>.\RedistributeActiveDatabases.ps1 -DagName DAG1 -ShowDatabaseDistributionByServer
ServerName          : SYDEX2
TotalDbs            : 4
ActiveDbs           : 2
PassiveDbs          : 2
PreferenceCountList : {1, 1, 1, 1}
MountedDbs          : 2
DismountedDbs       : 0
DagName             : DAG1
ServerName          : MELEX1
TotalDbs            : 4
ActiveDbs           : 0
PassiveDbs          : 4
PreferenceCountList : {1, 1, 1, 1}
MountedDbs          : 0
DismountedDbs       : 0
DagName             : DAG1
ServerName          : SYDEX1
TotalDbs            : 4
ActiveDbs           : 2
PassiveDbs          : 2
PreferenceCountList : {1, 1, 1, 1}
MountedDbs          : 2
DismountedDbs       : 0
DagName             : DAG1
ServerName          : MELEX2
TotalDbs            : 4
ActiveDbs           : 0
PassiveDbs          : 4
PreferenceCountList : {1, 1, 1, 1}
MountedDbs          : 0
DismountedDbs       : 0
DagName             : DAG1

Notice now that each DAG member has a PreferenceCountList of “{1, 1, 1, 1}” indicating an evenly balanced DAG as far as activation preferences go.

And again we can use Get-DAGApMap.ps1 to see it in CSV format instead.

get-dagagmap-csv-02

Rebalancing the Database Availability Group

Now that the activation preferences are evenly distributed, what about the active database copies themselves? We can look at the current active database copies by running Get-MailboxDatabaseCopyStatus.

[PS] C:\>Get-MailboxDatabaseCopyStatus * -Active | Select Name,Status,MailboxServer,ActivationPreference

Or rather we could, if not for this bug which has been present in every build of Exchange 2013 up to CU8 so far. A fix may be forthcoming in a later build.

Fortunately we can use RedistributeActiveDatabases.ps1 again with the -ShowDatabaseCurrentActives switch.

[PS] C:\...\scripts>.\RedistributeActiveDatabases.ps1 -DagName DAG1 -ShowDatabaseCurrentActives
***************************************
Balance DAG DBs
Tuesday, April 28, 2015 12:33:15 PM
***************************************
Dag                                :   DAG1
ServerCount                        :   4
DatabaseCount                      :   4
CopiesCount                        :   16
--------------------------
Starting Site Distribution
--------------------------
SiteName             TotalDbs ActiveDbs PassiveDbs PreferenceCountList MountedDbs DismountedDbs DagName
--------             -------- --------- ---------- ------------------- ---------- ------------- -------
Melbourne-Datacenter        8         0          8 {2, 2, 2, 2}                 0             0 DAG1
Sydney-Datacenter           8         4          4 {2, 2, 2, 2}                 4             0 DAG1
----------------------------
Starting Server Distribution
----------------------------
ServerName TotalDbs ActiveDbs PassiveDbs PreferenceCountList MountedDbs DismountedDbs DagName
---------- -------- --------- ---------- ------------------- ---------- ------------- -------
MELEX1            4         0          4 {1, 1, 1, 1}                 0             0 DAG1
MELEX2            4         0          4 {1, 1, 1, 1}                 0             0 DAG1
SYDEX1            4         2          2 {1, 1, 1, 1}                 2             0 DAG1
SYDEX2            4         2          2 {1, 1, 1, 1}                 2             0 DAG1
DbName                    : DB02
ActiveOnPreferenceAtStart : 1
ActiveServerAtStart       : SYDEX2
ActiveOnPreferenceAtEnd   :
ActiveServerAtEnd         :
IsOnMostPreferredCopy     : True
MoveStatus                : NoMoveAttempted
DbName                    : DB01
ActiveOnPreferenceAtStart : 4
ActiveServerAtStart       : SYDEX2
ActiveOnPreferenceAtEnd   :
ActiveServerAtEnd         :
IsOnMostPreferredCopy     : False
MoveStatus                : NoMoveAttempted
DbName                    : DB03
ActiveOnPreferenceAtStart : 1
ActiveServerAtStart       : SYDEX1
ActiveOnPreferenceAtEnd   :
ActiveServerAtEnd         :
IsOnMostPreferredCopy     : True
MoveStatus                : NoMoveAttempted
DbName                    : DB04
ActiveOnPreferenceAtStart : 2
ActiveServerAtStart       : SYDEX1
ActiveOnPreferenceAtEnd   :
ActiveServerAtEnd         :
IsOnMostPreferredCopy     : False
MoveStatus                : NoMoveAttempted
----------------
Summary of Moves
----------------
Successfully moved      : 0
Moved to less preferred : 0
Failed to move          : 0
Not moved               : 4
Start time              : Tuesday, April 28, 2015 12:33:07 PM
End time                : Tuesday, April 28, 2015 12:33:15 PM
Duration                : 00:00:08.3172669

The sections of the output above like this one tell us what we want to know.

DbName                    : DB02
ActiveOnPreferenceAtStart : 1
ActiveServerAtStart       : SYDEX2
ActiveOnPreferenceAtEnd   :
ActiveServerAtEnd         :
IsOnMostPreferredCopy     : True
MoveStatus                : NoMoveAttempted

In the example above the database DB02 is active on server SYDEX2, which has an AP of 1.

Finally, if we want to rebalance the DAG so that each database is active on its AP=1 copy, we can run RedistributeActiveDatabases.ps1 with the -BalanceDbsByActivationPreference switch. Use -Confirm:$false if you don’t want to be prompted for each switchover.

[PS] C:\...\scripts>.\RedistributeActiveDatabases.ps1 -DagName DAG1 -BalanceDbsByActivationPreference -Confirm:$false

This article PowerShell Scripts for Balancing Database Availability Groups is © 2015 ExchangeServerPro.com

Get more Exchange Server tips at ExchangeServerPro.com

     

Viewing all articles
Browse latest Browse all 515

Trending Articles