1、原理
我說的數據修改同步過程指的是在快照生成完畢,分發代理將快照應用於訂閱服務器完成訂閱服務器初始化后,發布服務器后續的更改同步到訂閱服務器過程,這也就是我們常常關注的延遲。此過程主要涉及兩個代理,分發代理和日志讀取代理,因為我們使用的是推送訂閱,所以這兩個代理都工作在分發數據庫上。首先,日志讀取代理讀取發布事務日志,並表示任何INSERT、UPDATE以及DELETE語句,然后將這些事務定時將批量復制到分發服務器的分發數據庫中。分發庫中存儲着事務和命令,每個事務以多條命令組成。分發代理順序分發分法庫中的事務,以邏輯命令(SQL語句)方式在訂閱庫上執行。流程圖見下:
優化這兩個代理主要考慮從兩方面考慮,一方面是縮短每個批次的間隔,一方面需要在小間隔的情況下增加代理處理的性能,這兩個方面是相關聯的,所以要一起修改才能起作用。
2.復制延遲測試
- 查看日志讀取代理配置文件的默認參數:
- 查看分發代理配置文件的默認參數:
SELECT * FROM msdb.dbo .MSagent_profiles WHERE agent_type =3 SELECT * FROM MSagent_parameters WHERE profile_id= 4

- 通過跟蹤令牌方式測試復制延遲時間

3.代理參數優化測試
- 新建日志讀取代理參數配置文件,命名為“日志讀取代理參數優化參數 ”
- 日志讀取代理參數優化
-- 查詢該代理的profile_id SELECT * FROM msdb.dbo .MSagent_profiles WHERE agent_type =2 EXEC sp_change_agent_parameter @profile_id = 20, @parameter_name = 'ReadBatchSize', @parameter_value = 2000 EXEC sp_change_agent_parameter @profile_id = 20, @parameter_name = 'PollingInterval', @parameter_value = 1 新建分發參數配置文件,命名為“分發代理參數優化參數” EXEC sp_change_agent_parameter @profile_id = 18, @parameter_name = 'PollingInterval', @parameter_value = 1 EXEC sp_change_agent_parameter @profile_id = 18, @parameter_name = 'CommitBatchSize', @parameter_value = 1000 EXEC sp_change_agent_parameter @profile_id = 18, @parameter_name = 'CommitBatchThreshold', @parameter_value = 10000
- 優化參數后測試結果(記得更改代理配置文件后要重啟代理生效),效果立竿見影,但是不是峰值情況。我們在生產上應用的效果很好,高峰值時也能保證很低的延遲。對於CommitBatchSize和CommitBatchThreshold的參數設置評估方法,CommitBatchThreshold取DML操作數/s上限作為設置,CommitBatch就是CommitBatchThreshold/10~CommitBatchThreshold/5。
