我们为我们的客户配置了一个具有同步提交模式和两个集群的可用性组。一个群集是主群集,可写且可读。另一个群集是辅助群集,并且只能读取。我们将辅助群集用于只读操作。另外,我们在asp.net门户上使用此群集来读取数据库,并使用主群集写入数据库。通过测试门户网站和AG的功能,我们发现了问题。通过更改门户网站中某些数据库表中的数据并单击“保存”,站点的刷新将显示旧数据,直到我们再次刷新站点为止。第一个问题是同步提交模式到底是什么意思?将数据提交到主数据库后,我是否可以准确地从辅助数据库读取数据?
我在数据库上写了一个表和脚本来测试读/写功能。
创建测试表:
CREATE Table temp.tblAuthors
(
Id int identity primary key,
Author_name nvarchar(50),
country nvarchar(50)
)
在主群集上插入30000个数据行的第一个脚本:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
GO
BEGIN TRANSACTION A;
DECLARE @Id INT
SET @Id = 1
WHILE @Id <= 30000
BEGIN
INSERT INTO TEMP.tblAuthors
VALUES (
'Author - ' + CAST(@Id AS NVARCHAR(10)),
'Country - ' + CAST(@Id AS NVARCHAR(10)) + ' name'
)
SET @Id = @Id + 1
END
COMMIT TRANSACTION A;
PRINT CONVERT(VARCHAR, SYSDATETIME(), 121)
用于在一个循环中每2毫秒读取辅助集群的第二个脚本:
DECLARE @i INT = 1;
DECLARE @PrintVarchar NVARCHAR(max)
WHILE (@i <= 60000)
BEGIN
WAITFOR DELAY '00:00:00.002'
SELECT Count(*),
CONVERT(VARCHAR, SYSDATETIME(), 121)
FROM TEMP.tblAuthors
PRINT @PrintVarchar
SET @i = @i + 1;
END
[第一步,我将第二个脚本与连接一起运行到辅助群集,以跟踪我可以在辅助群集上看到数据的时间点。在下一步中,我运行第一个脚本以将数据插入主群集上的表中。最后,在插入的数据在辅助数据库上可读时,我检查了主数据库上提交的日期时间和辅助数据库上的日期时间。
结果:
Commit on primary: 2019-11-26 06:55:58.9978911
Readable on secondary: 2019-11-26 06:55:59.8104941
在主群集上提交后大约一秒钟后,可读取辅助数据库上的数据。这就解释了门户网站上的保存刷新问题。我们将数据保存在主数据库上,并且刷新速度比提交后的延迟更快。
有人能解释这种现象吗?对于asp.net门户来说,这种情况是正确的吗?还是仅应将主要集群用于该门户?
对不起,我的英语不好。
最诚挚的问候,
Alex
您的门户网站应用程序没有只读工作负载。应该使用主群集进行所有数据库访问。
同步模式确保事务日志在辅助数据库上得到加固,并确认主要节点,然后提交该事务。这并不意味着更改的数据在提交事务时在辅助服务器上可用。辅助服务器具有重做线程,可在辅助服务器上应用事务,这是延迟的来源。