1

我们为客户配置了一个具有同步提交模式和两个集群的可用性组。一个集群是主集群并且是可写和可读的。另一个集群是辅助集群并且是只读的。我们使用辅助集群进行只读操作。此外,我们在 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 门户的这种情况是正确的,还是我们应该只将门户用于主集群?

对不起,我的英语不好。

最好的祝福,

亚历克斯

4

1 回答 1

0

您的门户应用程序没有只读工作负载。它应该使用主集群进行所有数据库访问。

同步模式保证事务日志在辅助节点上得到强化,并确认主节点,然后主节点提交事务。这并不意味着在事务提交时更改的数据在辅助节点上可用。辅助节点有一个重做线程来在辅助节点上应用事务,这就是延迟的来源。

于 2019-11-26T16:53:44.603 回答