問題現象
啟用 AlwaysOn 後主副本 CPU 持續高位,默認配置下「主角色中的連接」=「允許所有連接」、「可讀輔助副本」=「是」。
四大連接配置選項解析
| 配置項 | 選項 | 行為 | 適用場景 |
| 主角色連接 | 允許所有連接 | 讀/寫/管理 (SSMS、sqlcmd 皆可) | 生產主庫 (默認) |
| 允許讀/寫連接 | 僅讀/寫,管理連接被拒 | 嚴格隔離管理流量 |
| 可讀輔助副本 | 是 | 所有副本可讀 (SSMS 瀏覽、報表查詢) | 讀寫分離、報表卸載 |
| 僅讀意向 | 需連接字符串 `ApplicationIntent=ReadOnly` 才能連接 | 強制應用聲明只讀意圖,防誤寫 |
| 否 | 副本不可連接 (僅作 HA 熱備) | 嚴格 HA、無讀寫分離需求 |
CPU 高負載根因與優化
- 可讀副本開啟 + 讀寫分離未正確路由:應用未加 `ApplicationIntent=ReadOnly`,讀請求仍打主庫
2. 副本同步延遲導致主庫阻塞:同步提交模式下,主庫等待次要副本確認
3. 幽靈記錄清理/版本存儲:可讀副本啟用 Row Versioning,主庫 tempdb 版本存儲增長
4. 自動統計更新/索引維護:主庫維護窗口與業務高峰重疊
優化建議
- 連接字符串強制加入 `ApplicationIntent=ReadOnly`,配合「僅讀意向」模式
- 讀寫分離層 (如 ProxySQL、HAProxy、應用級路由) 將讀流量導向副本
- 非關鍵業務副本改為「異步提交」,降低主庫提交延遲
- 錯開維護窗口,啟用
TF 2371 (SQL 2016+ 默認) 更積極統計更新
- 監控 `sys.dm_hadr_availability_replica_states` 同步健康度
