Configuration Manager Database Replication
Several ConfigMgr components work together to replicate data between sites. The code that carries out replication resides in several places:
- The Executive service
- Stored procedures defined in the site database
- Managed code in .NET assemblies
ConfigMgr creates several Service Broker objects for its own use. Figure 3.42 displays the ConfigMgr Service Broker Queues and Services nodes in the tree pane along with the corresponding sections of the default Service Broker report.
Figure 3.42. Service Broker Objects in the CAS site database.
The SQL statements used to create these objects reveal how they work together. Here is the procedure to display the SQL language used to create an object:
- Right-click on the object in the Object Explorer tree.
- Select Script {objecttype} as -> CREATE to“ -> New Query Editor Window” where objecttype may be “Service,” “Queue,” and so on.
The queue used by the data replication service (DRS) to replicate global data is the ConfigMgrDRSQueue queue. The ConfigMgr DRS is implemented as managed code and runs within the Common Language Runtime (CLR) component of the .NET Framework integrated into SQL Server. CLR integration allows procedural language code to run in close proximity to the database engine, which provides performance advantages and other optimizations. Figure 3.43 shows the ConfigMgr managed code assemblies, together with the functions and procedures that depend on the MessageHanderService assembly. The code for the MessageHanderService, contained in <ConfigMgrInstallPath>\bin\x64\messagehanderervice.dll, implements much of the DRS functionality. For more information on SQL Server CLR integration, see http://msdn.microsoft.com/en-us/library/ms131089.aspx.
Figure 3.43. Managed code assemblies in the CAS site database and message handler service dependent objects.
Here is the object definition for the ConfigMgrDRSQueue:
CREATE QUEUE [dbo].[ConfigMgrDRSQueue] WITH STATUS = ON , RETENTION = OFF ON [PRIMARY]
The ConfigMgrDRS_SiteCAS service uses the ConfigMgrDRSQueue and is defined as follows:
CREATE SERVICE [ConfigMgrDRS_SiteCAS] AUTHORIZATION [dbo] ON QUEUE [dbo].[ConfigMgrDRSQueue] ([CriticalPriority], [HighPriority], [LowNormalPriority], [LowPriority], [NormalPriority])
Related service broker objects define the various DRS message types, broker priorities, local routes and routes to other sites, and contracts. As an example, the route to site PR2 is defined as
CREATE ROUTE [ConfigMgrDRSRoute_SitePR2] AUTHORIZATION [dbo] WITH SERVICE_NAME = N'ConfigMgrDRS_SitePR2' , ADDRESS = N'TCP://Ambassador.odyssey.com:4022'
A contract specifies the broker priorities for various message types. Figure 3.44 shows the CriticalPriority contract. All message types specified as critical priority will be delivered before messages of lower priorities in the same queue.
Figure 3.44. The message broker critical priority contract.
Table 3.6 shows the priority, service name, contract, message type, and message body for some typical messages from the ConfigMgrDRSQueue. For purposes of this discussion, the message body has been cast into a human readable form. The actual messages contain additional metadata including the conversation group ID and sequencing information.
Table 3.6. Sample Message Data from ConfigMgrDRSQueue
Priority |
service_name |
service_contract_name |
message_type_name |
casted_message_body |
7 |
ConfigMgrDRS_SiteCAS |
HighPriority |
DRS_SyncStart |
<DRS_SyncStart SourceSite=“PR2” SyncID=“21AC43A3-9A35-48D2-BE92-40FDE527335D” ReplicationGroup=“Alerts” StartTime=“2012-01-05T00:40:24.467” BuildNumber=“7678”/> |
7 |
ConfigMgrDRS_SiteCAS |
HighPriority |
DRS_SyncData |
<DRS_SyncData BuildNumber=“7678” LastSyncVersionToSource=“98540” ThisVersion=“230384” SyncID=“21AC43A3-9A35-48D2-BE92-40FDE527335D” ReplicationGroupID=“8” MessageID=“B214790C-717E-4BB7-83B6-2F851114C47C”><Operation Type=“U” TableName=“AlertVariable_G1” Context=“”><row ID=“23” Value_Int=“9” LastChangeTime=“2012-01-05T00:39:29.573”/></Operation></DRS_SyncData> |
7 |
ConfigMgrDRS_SiteCAS |
HighPriority |
DRS_SyncEnd |
<DRS_SyncEnd SourceSite=“PR2” SyncID=“21AC43A3-9A35-48D2-BE92-40FDE527335D” ReplicationGroup=“Alerts” LastSyncVersionFromSource=“230384”/> |
5 |
ConfigMgrDRS_SiteCAS |
NormalPriority |
DRS_SyncData |
<DRS_SyncData BuildNumber=“7678” LastSyncVersionToSource=“98544” ThisVersion=“356796” SyncID=“DCBA3151-830F-4AB6-93A6-2D197686487F” ReplicationGroupID=“3” MessageID=“9A6BC0AA-A096-4D67-A028-6B764492E2ED”><Operation Type=“U” TableName=“SEDO_LockableObjects” Context=“”><row ID=“154” LockID=“7735F1D5-E343-42A4-8D1D-429024D859DA” ObjectID=“580B2320-7903-4DEC-BF3B-1AA7775776BB” ObjectVersion=“DA1FC089-EA1F-4FF0-8860-BA24BB70B780” ObjectTypeID=“1” OrigSiteNum=“0”/></Operation><Operation Type=“U” TableName=“SMSPackages_G” Context=“”><row PkgID=“DAL00006” Name=“Report Viewer 2008” Version=“” Language=“” Manufacturer=“Microsoft” Description=“” Source=“C:\Packages\SD\Install - Report Viewer 2008” SourceSite=“PR1” RefreshSchedule=“” LastRefresh=“1970-04-10T06:35:00” ShareName=“” PreferredAddress=“” StorePkgFlag=“2” ShareType=“1” Permission=“15” UseForcedDisconnect=“0” ForcedRetryDelay=“2” DisconnectDelay=“5” IgnoreSchedule=“0” Priority=“2” PkgFlags=“1” MIFFilename=“” MIFPublisher=“” MIFName=“” MIFVersion=“” SourceVersion=“1” SourceDate=“2012-01-03T11:52:16” SourceSize=“2865” SourceCompSize=“0” UpdateMask=“268697632” Action=“1” Hash=“081760217364059FC0D7636927CA6DF9” ImageFlags=“0” UpdateMaskEx=“557056” HashVersion=“2” NewHash=“4B41F72B69B91928E9B3A04410FB26F6B860F261” ImagePath=“” Architecture=“” PackageType=“0” AlternateContentProviders=“” SourceLocaleID=“1033” DefaultImage=“1” SEDOComponentID=“4DAC422F-A2E5-4475-B90E-E420F67EC02B” TransformReadiness=“0” TransformAnalysisDate=“1980-01-01T00:00:00”/></Operation></DRS_SyncData> |
5 |
ConfigMgrDRS_SiteCAS |
NormalPriority |
DRS_SyncEnd |
<DRS_SyncEnd SourceSite=“PR1” SyncID=“DCBA3151-830F-4AB6-93A6-2D197686487F” ReplicationGroup=“Configuration Data” LastSyncVersionFromSource=“356803”/> |
The ConfigMgr SMS_REPLICATION_CONFIGURATION_MONITOR (RCM) executive thread component identifies the data replication, connects to the database, and initiates DRS synchronization. Figure 3.45 shows a sample of RCM database activity. The SQL Server Profiler template used to capture these events, ReplicationActivity.tdf, is included as online material for this book, see Appendix D, “Available Online,” for information.
Figure 3.45. SQL Server Profiler Trace Showing RCM Component Activity.
Here are some SQL stored procedures that carry out much of the work for the RCM:
- spDRSInitiateSynchronizations: RCM drives the replication process by calling this procedure for each message priority. spDRSInitiateSynchronizations extracts changed data from the ReplicationData table, constructs the appropriate message type and calls the spGetSSBDialogHandle to retrieve a handle for a dialog on the message builder queue, ConfigMgrDRSMsgBuilder. The procedure then uses the dialog handle to insert the message into the ConfigMgrDRSMsgBuilder queue.
- spGetSSBDialogHandle: This procedure first attempts to retrieve a handle from the Service Broker dialog pool (dbo.SSB_DialogPool) that matches the contract and conversation required for the message. If there is not an existing handle the procedure verifies that a valid route exists, and then creates a new handle in the dialog pool and initializes a new dialog. ConfigMgrDRSMsgBuilder returns a dialog handle to the calling procedure.
- spDRSMsgBuilderActivation: This is the activation stored procedure for the ConfigMgrDRSMsgBuilder queue. This means that the procedure automatically fires when there are messages in the queue. The procedure performs various checks and then calls the procedure spDRSSendChangesForGroup. spDRSSendChangesForGroup updates replication metadata table and then calls additional procedures to obtain an handle on the site or global DRS message queue and insert the message into the queue.
You can view the full text of these procedures using the same method described in the beginning of this section to script the object broker object definition language to a query editor window.