SQL Server AlwaysOn Availability Group: cấu hình HA cho doanh nghiệp

Chia sẻ bài viết

Mục lục
SQL Server2026-06-29·13 phút đọc

SQL Server AlwaysOn Availability Group: cấu hình HA cho doanh nghiệp

Hướng dẫn end-to-end setup AlwaysOn Availability Group cho SQL Server 2022 Enterprise - WSFC cluster, synchronous vs asynchronous, automatic failover, listener, readable secondary. Yêu cầu license, quorum, network và bài học triển khai thực tế.

TL;DR

AlwaysOn AG là giải pháp HA cấp doanh nghiệp của SQL Server - primary + lên đến 8 secondary, automatic failover < 60s, readable secondary để offload reporting. Yêu cầu Enterprise edition (~360M/2-core), Windows Server Failover Cluster (WSFC) + storage shared/local, network < 5ms ping giữa node. Basic AG có ở Standard (2 node, 1 DB, không read) là lựa chọn rẻ cho SMB. Cần tối thiểu 3 node hoặc 2 node + file share witness cho quorum.

1. AlwaysOn AG vs Basic AG vs FCI - phân biệt nhanh

Tính năngBasic AG (Standard)AlwaysOn AG (Enterprise)FCI
Edition tối thiểuStandardEnterpriseStandard hoặc Enterprise
Số replica2 (1 primary + 1 secondary)9 (1 primary + 8 secondary)2-N node (chia share storage)
Số DB / AG1Không giới hạnInstance-level (toàn instance)
Readable secondaryKHÔNGKHÔNG
StorageLocal mỗi nodeLocal mỗi nodeShared (SAN, S2D)
Failover automatic
RPO0 (sync) hoặc > 0 (async)0 hoặc > 00 (shared storage)
RTO~30-60s~10-30s~60-120s (mount storage)

Khái niệm cốt lõi: AG sync log changes giữa các replica qua network (replica có local storage riêng); FCI dùng shared storage và chỉ 1 instance chạy tại 1 thời điểm. AG tốt cho DR cross-site, FCI tốt cho HA cùng datacenter với SAN.

2. Yêu cầu phần cứng và license trước khi setup

License

  • AG full (Enterprise): license CẢ primary và secondary đầy đủ Enterprise. KHÔNG có discount cho passive replica trừ khi có Software Assurance - SA cho phép 1 passive secondary FREE.
  • Basic AG (Standard): license cả 2 node Standard. SA cũng cho 1 passive secondary FREE.
  • Readable secondary: ngay khi secondary được read query (kể cả vô tình bằng IntelliSense), nó trở thành active replica - phải license đầy đủ.

Phần cứng / hạ tầng

  • 3 server SQL identical (CPU, RAM, disk) cho production sync. Tối thiểu 2 + file share witness.
  • Network < 5ms latency giữa node cho sync mode. Async mode tolerate > 50ms (cross-region DR).
  • Local storage NVMe SSD cho log file (write throughput cao critical cho AG sync).
  • Windows Server 2019/2022 (cho WSFC) hoặc Linux Pacemaker cluster.
  • Domain Active Directory (AG truyền thống); SQL 2017+ có domain-independent AG dùng cert.

3. Sync mode vs Async mode

  • Synchronous-commit: primary chờ secondary confirm log đã write xong mới commit. RPO = 0 (zero data loss). Latency tăng theo network. Bắt buộc cho automatic failover.
  • Asynchronous-commit: primary commit ngay, không chờ secondary. RPO > 0 (có thể mất data đang transit). Latency thấp. Chỉ manual failover.

Best practice: 2 node primary + secondary sync cùng datacenter (RTO/RPO = 0), thêm 1 node async ở datacenter khác (DR). Đây là pattern phổ biến nhất cho doanh nghiệp Việt cần HA + DR.

4. Setup WSFC cluster (Windows)

WSFC là pre-requisite cho AG trên Windows. Quy trình:

# PowerShell trên cả 3 node (Run as Administrator)
# 1. Cài Failover Clustering feature
Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools

# 2. Validate cluster (chạy 1 lần từ 1 node bất kỳ)
Test-Cluster -Node SQL01, SQL02, SQL03

# 3. Tạo cluster
New-Cluster -Name SQLCluster `
  -Node SQL01, SQL02, SQL03 `
  -StaticAddress 10.0.0.100 `
  -NoStorage

# 4. Cấu hình quorum (3 node = node majority, không cần witness)
# Nếu 2 node: thêm file share witness:
# Set-ClusterQuorum -Cluster SQLCluster `
#   -FileShareWitness "\\fileserver\witness$"

5. Enable AlwaysOn trên SQL Server

# PowerShell - bật trên TẤT CẢ instance tham gia AG
Enable-SqlAlwaysOn -ServerInstance SQL01 -Force
Enable-SqlAlwaysOn -ServerInstance SQL02 -Force
Enable-SqlAlwaysOn -ServerInstance SQL03 -Force

# Service tự restart. Verify:
Invoke-Sqlcmd -ServerInstance SQL01 -Query "SELECT SERVERPROPERTY('IsHadrEnabled')"
# Trả về 1 = OK

6. Tạo Availability Group bằng T-SQL

-- Trên primary (SQL01)
USE [master];
GO

-- 1. Backup full + log của DB cần đưa vào AG, restore WITH NORECOVERY lên SQL02, SQL03
BACKUP DATABASE [ERPDb] TO DISK = N'\\backup\erp_full.bak' WITH INIT, COMPRESSION;
BACKUP LOG [ERPDb] TO DISK = N'\\backup\erp_log.trn' WITH INIT, COMPRESSION;

-- Trên SQL02, SQL03:
RESTORE DATABASE [ERPDb] FROM DISK = N'\\backup\erp_full.bak' WITH NORECOVERY, REPLACE;
RESTORE LOG [ERPDb] FROM DISK = N'\\backup\erp_log.trn' WITH NORECOVERY;

-- 2. Tạo AG trên primary
CREATE AVAILABILITY GROUP [AG_ERP]
WITH (
  AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
  DB_FAILOVER = ON,
  DTC_SUPPORT = NONE,
  CLUSTER_TYPE = WSFC
)
FOR DATABASE [ERPDb]
REPLICA ON
  N'SQL01' WITH (
    ENDPOINT_URL = N'TCP://SQL01.tnd.local:5022',
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    FAILOVER_MODE = AUTOMATIC,
    SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
  ),
  N'SQL02' WITH (
    ENDPOINT_URL = N'TCP://SQL02.tnd.local:5022',
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    FAILOVER_MODE = AUTOMATIC,
    SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
  ),
  N'SQL03' WITH (
    ENDPOINT_URL = N'TCP://SQL03.tnd.local:5022',
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL,
    SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
  );

-- 3. Trên SQL02, SQL03: join AG
ALTER AVAILABILITY GROUP [AG_ERP] JOIN;
ALTER DATABASE [ERPDb] SET HADR AVAILABILITY GROUP = [AG_ERP];

7. Tạo Availability Group Listener

Listener là virtual network name + IP để app connect, tự động route tới primary hiện tại. Không có listener thì app phải biết tên primary và cập nhật khi failover - rất phiền.

-- Trên primary
ALTER AVAILABILITY GROUP [AG_ERP]
ADD LISTENER N'AG_ERP_LSN' (
  WITH IP (('10.0.0.110', '255.255.255.0')),
  PORT = 1433
);

-- App connection string sau đó dùng:
-- Server=AG_ERP_LSN,1433;Database=ERPDb;...
-- Để tận dụng read-only routing:
-- Server=AG_ERP_LSN;Database=ERPDb;ApplicationIntent=ReadOnly;...

8. Read-only routing - offload reporting query

Tính năng "cool" nhất của AG: app set ApplicationIntent=ReadOnly → connection tự route đến readable secondary. Heavy report không tốn IO của primary nữa.

-- Define read-only routing list
ALTER AVAILABILITY GROUP [AG_ERP]
MODIFY REPLICA ON N'SQL01' WITH (
  PRIMARY_ROLE (
    READ_ONLY_ROUTING_LIST = ('SQL02', 'SQL03')
  )
);

ALTER AVAILABILITY GROUP [AG_ERP]
MODIFY REPLICA ON N'SQL02' WITH (
  SECONDARY_ROLE (
    READ_ONLY_ROUTING_URL = N'TCP://SQL02.tnd.local:1433'
  )
);
-- Tương tự cho SQL03

-- Sau khi config, app dùng:
-- "Server=AG_ERP_LSN;Database=ERPDb;ApplicationIntent=ReadOnly;"
-- → connection được route sang SQL02 hoặc SQL03

9. Monitor và test failover

Monitor health

-- DMV cho AG status
SELECT
  ag.name AS AGName,
  ar.replica_server_name AS Replica,
  hars.role_desc AS Role,
  hars.synchronization_health_desc AS SyncHealth,
  hars.connected_state_desc AS Connection
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_availability_replica_states hars
  ON ar.replica_id = hars.replica_id;

-- Latency / lag
SELECT
  ar.replica_server_name,
  drs.database_id,
  DB_NAME(drs.database_id) AS DBName,
  drs.log_send_queue_size,
  drs.redo_queue_size,
  drs.last_commit_time
FROM sys.dm_hadr_database_replica_states drs
JOIN sys.availability_replicas ar
  ON drs.replica_id = ar.replica_id;

Test failover manual

-- Failover sang SQL02 (đảm bảo SQL02 đang sync và healthy)
ALTER AVAILABILITY GROUP [AG_ERP] FAILOVER;

-- Force failover (mất data nếu chưa sync - chỉ dùng disaster)
ALTER AVAILABILITY GROUP [AG_ERP] FORCE_FAILOVER_ALLOW_DATA_LOSS;

10. Bài học triển khai thực tế tại Việt Nam

Một vài lưu ý từ kinh nghiệm TND triển khai AG cho khách hàng tài chính / sản xuất:

  • Network giữa 2 datacenter: nếu > 10ms ping, async mode bắt buộc. Sync > 5ms làm transaction commit chậm rõ rệt.
  • Backup từ secondary: set AUTOMATED_BACKUP_PREFERENCE = SECONDARY để backup không tốn IO primary. Có thể backup nén từ secondary lên storage chung.
  • Quorum: 3 node = node majority quorum (chịu được 1 node down). 2 node bắt buộc file share witness hoặc cloud witness để tránh split-brain.
  • Listener DNS TTL: set thấp (60s) để app failover nhanh khi DNS đổi.
  • App connection string: dùng MultiSubnetFailover=True để client retry nhanh giữa nhiều subnet.
  • Test failover định kỳ: mỗi quý 1 lần planned failover. Đừng để 2 năm mới biết failover không hoạt động.
  • Sizing hạ tầng tham khảo: Dedicated Server NVMe cho primary, Cloud VPS cho async DR replica.

11. Hoá đơn VAT và license cho AG triển khai doanh nghiệp

AG cần license Enterprise cho TẤT CẢ node (~360M/2-core × số node). Với SA, 1 passive secondary được FREE → tiết kiệm đáng kể. TND là đại lý chính thức Microsoft tại Việt Nam, cung cấp license SQL Server 2022 Enterprise + Software Assurance genuine, xuất hoá đơn VAT điện tử Thông tư 78 đầy đủ cho mọi đơn hàng doanh nghiệp.

Đọc thêm: Standard vs Enterprise, Backup & Restore best practice, SQL cho ERP & compliance.

Triển khai AlwaysOn AG cho hệ thống doanh nghiệp?

TND đại lý Microsoft SQL Server tại Việt Nam - license genuine cho Standard, Enterprise, CAL. Hoá đơn VAT điện tử TT 78 đầy đủ cho doanh nghiệp.

Xem giá SQL Server →

2009
15+ năm vận hành liên tục
10+
tập đoàn lớn tin dùng
100+
doanh nghiệp SMB Việt
30 ngày
đổi key lỗi miễn phí
Phần mềm bản quyền chính hãng chúng tôi cung cấp
Bản quyền chính hãng Hóa đơn VAT đầy đủ Đổi key lỗi 30 ngày Vận hành từ 2009 MST 0200994870 Hotline 0225.999.6666