筆者之前在多場研討會和課程中講授SQL Azure時,都會強調一件事:『雖然SQL Azure和SQL Server很像,但它們本質上還是不同的』。看起來再怎麼像的東西,也一定有不同的地方,SQL Azure以Windows Azure基礎建設環境為基石建構,同時享有了高可用度與容錯能力,但是它並不是什麼都沒改就能做容錯的,除了基礎建設對網路與虛擬機器資源的支援外,SQL Server本身勢必也要做一些修改,才能符合SQL Azure原始設計上應有的功能。
每個資料中心最多會有650個分割區來儲存SQL Azure的資料庫,每個節點是一台實體伺服器(擁有8核心CPU、32GB RAM與12顆硬碟組成,平均每台成本3,500美元),在每台實體伺服器內都有安裝SQL Server執行個體,以及與其他SQL Server節點串接的Fabric Service,除了協調與管理SQL Server節點的重要工作,高可用性與容錯的核心也是由它負責,而SQL Server執行個體則是特別為SQL Azure環境所設計的,擁有特殊的資料複製演算法以及配合區域對應所設計的服務。SQL Azure的Fabric Service則有下列不同的功能:
SQL Azure在使用者建立新資料庫時,會在同一資料中心內將資料庫另存成三份並保存在不同的實體儲存區內(不同的磁碟櫃或不同的磁碟),這三份資料庫之間有特殊設計的複製機制,主要的資料庫稱為Primary Database,而複本則是Secondary Database,在每次資料庫進行變更(INSERT, UPDATE, DELETE)時,Primary Database會將變更發送給三個Secondary Database,並以投票式認可(Quorum Commit)的方式,確認資料變更已正確的寫入Secondary Database,內,以達成分散儲存的備援能力。
SQL Azure特製的SQL Server本身,利用了Replication Agent(執行資料複製與投票認可)以及Local Partition Map(對應不同資料庫分割的對照表)達成了將資料分散複製的能力,同時因為SQL Azure內的SQL Server都是自動化作業,所以有不少的系統級功能都無法在SQL Azure上使用,像是:
而部份T-SQL以及系統管理指令也因應這些功能的限制而修改,所以影響較大的會是存取到系統資源與系統管理的SQL指令,而只限於單一資料庫的T-SQL指令,像基本的SELECT, INSERT, UPDATE和DELETE都不會受到影響,SQL Azure可用的T-SQL指令也可以在MSDN Library中取得。
我們在Windows Azure Management Portal所建立的SQL Azure Server,它的本身其實是在SQL Azure基礎建設之上的隔離層(Façade),負責對外的連線管理以及存取控制等,稱為SQL Azure Gateway,對外以SQL Azure Server的方式呈現,它內含了一個master資料庫,以及使用者資料庫的分割位置和所屬的SQL Server的位置,每一條對資料庫的連線都會經過它,先進行指令解析與授權後,再將連線轉到實際處理的SQL Server,這個階段稱為Connection Routing。
連線的處理過程是:
因為SQL Azure的Gateway會偵測與處理連線過多或過長的問題,所以一般來說,存取SQL Azure的連線不宜過長,而且如果一個連線可以跑多個SQL的話,就不要建立其他的連線,同時也要避免連線進入Idle(閒置)狀態,如果閒置過久,連線也會被Gateway自動關閉。
因為這兩個是使用SQL Azure前必須要了解的核心知識,所以筆者就只針對這兩個來說明,其他關於高可用度與容錯的部份,可自行參考TechNet Wiki中的Inside SQL Azure一文。
Reference:
http://social.technet.microsoft.com/wiki/contents/articles/inside-sql-azure.aspx
http://en.wikipedia.org/wiki/Quorum_(distributed_computing)