SQL Server 2012 推出的最重要的功能之一Alwayson,是一個集以前Cluster和Mirror於一體的新功能,即解決了Cluster依賴共享存儲的問題,又解決了鏡像不能實時讀以及轉移後鏈接串須要添加轉移IP的問題,看起來的確很實用。sql
並且Alwayson多副本的功能爲實現讀寫分離提供了可能,試想一下,當主副本壓力比較大的時候,是否能夠將讀操做引向輔助副本呢?答案通常來說是確定的,請注意,是通常!數據庫
Alwayson有兩個同步模式,同步和異步,即然是同步,理所固然的我認爲他是實時的,因此我配置了只讀路由,來使用這個功能。服務器
遺憾的是,這個同步並非數據的實時同步,當主副本數據發生變化時,同步模式下的輔助副本並不能當即取到變化的數據。異步
實驗以下:ide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
EXEC
sp_addlinkedserver @server = N
'Secondary'
, @srvproduct = N
''
,
@provider = N
'SQLNCLI'
, @datasrc = N
'192.168.200.201'
;
EXEC
sp_addlinkedsrvlogin
'Secondary '
,
'false '
,
NULL
,
'sa'
,
'sqlcn.com'
USE DemoDB
go
CREATE
TABLE
tb_alwayson
(
id
INT
IDENTITY
PRIMARY
KEY
,
name
VARCHAR
(200)
)
INSERT
INTO
tb_alwayson
(
name
)
SELECT
NEWID()
SELECT
COUNT
(*)
FROM
tb_alwayson
WAITFOR DELAY
'00:00:00.900'
SELECT
COUNT
(*)
FROM
Secondary.DemoDB.dbo.tb_alwayson
|
使用鏈接服務器,這是一個很是好理解的測試辦法,在個人環境裏,你會發現,在輔助副本上要取到變化的數據,大概要900ms才能保證,900ms如下,都無法保證,甚至在300ms如下,沒出現過一次能同步的狀況。性能
這就是同步模式,讓你沒有一點點兒防備。測試
那麼這個同步模式究竟是怎麼個同步呢?spa
答案是這樣的:它能夠保證事務日誌是同步的,也就是能夠保證不丟失數據,但不能保證數據變化沒有延時,這是因爲輔助副本在接收主副本傳來的Trans log時,首先將其緩到本地Log Cache,接着強制硬化到本地Ldf,而後隨即向主副本告知你能夠commit了,但注意,此時的硬化到本地ldf並不是本地數據已經變化,這是由於輔助副本將trans log硬化到本地的同時,它是使用一個異步進程去redo這些trans log產生的Page變化到Data文件的,這也就決定了這個Redo的操做是不可能比硬化日誌早的,因此數據的延時就是確定的了。線程
《SQL Server 2012實施與管理實戰指南》中指AlwaysON同步過程以下:翻譯
任何一個SQL Server裏都有個叫Log Writer的線程,當任何一個SQL用戶提交一個數據修改事務時,
它會負責把記錄本次修改的日誌信息先記入一段內存中的日誌緩衝區,而後再寫入物理日誌文件(日誌固化)。
因此對於任何一個數據庫,日誌文件裏都會有全部數據變化的記錄。
對於配置爲AlwaysOn主副本的數據庫,SQL Server會爲它創建一個叫Log Scanner的工做線程。
這個線程專門負責將日誌記錄從日誌緩衝區或者日誌文件裏中讀出,打包成日誌塊,發送給各個輔助副本。
因爲它的不間斷工做,才使主副本上的數據變化,能夠不斷地向輔助副本上傳播。
在輔助副本上,一樣會有兩個線程,完成相應的數據更新動做,它們是固化(Harden)和重作(Redo)。
固化線程會將主副本Log Scanner所發過來的日誌塊寫入輔助副本的磁盤上的日誌文件裏(這個過程被稱爲"固化")。
而重作線程,則負責從磁盤上讀取日誌塊,將日誌記錄翻譯成數據修改操做,在輔助副本的數據庫上完成。
當重作線程完成其工做之後,輔助副本上的數據庫就會跟主副本一致了。AlwaysOn就是經過這種機制,保持副本之間的同步。
重作線程每隔固定的時間點,會跟主副本通訊,告知它本身的工做進度。主副本就可以知道兩邊數據的差距有多遠。
這些線程在工做上各自獨立,以達到更高的效率。Log Scanner負責傳送日誌塊,而無須等待Log Writer完成日誌固化;輔助副本完成日誌固化之後就會發送消息到主副本,告知數據已經傳遞完畢,而無須等待重作完成。其設計目標,是儘量地減小AlwaysOn所帶來的額外操做對正常數據庫操做的性能影響。
事實已經很清楚了,同步的原理決定了數據的延時,想用AlwaysON作讀寫分離的朋友們,考慮好你所能容忍的延時時間吧!
另外,微軟你敢在官方聯機文檔與各類技術大會上把同步模式非數據實時同步提一下嗎?