SQLserver Alwayson實現要點

2021-08-31 07:44:17 字數 1725 閱讀 8021

之前一直沒有完全弄清楚alwayson的原理,包括可用組的概念,集群的架構是怎麼樣的,故障轉移是如何實現的,讀寫分離是如何實現的,故障轉移和可用組群的關係,稍微學習總結一下。

最重要的結論是:

1、標準的alwayson方案提供讀寫分離的是統一的listener(包括虛擬ip、連線位址和埠,由wsfc機制在配置時建立);但實際通訊通過重定向完成,即客戶端實際通訊不是和listener而是與真正的某個副本通訊。

2、讀寫分離需要應用感知是否唯讀請求,需要資料庫驅動支援幷包含在請求中表明是readonly還是readwrite

3、故障切換是例項級別,多個主備例項提供同乙個的浮動ip位址,客戶端無感知;可用組是資料庫級別,客戶端有感知(通過listener重定向)。

一、集群架構

實現alwayson需要部署sqlserver集群,而實際上所謂sqlserver集群其實是部署在windows集群上的乙個應用程式,本質上是需要部署乙個windows故障轉移集群(wsfc)。sqlserver集群則是部署在windows集群每個節點上的sqlserver應用,最多有個16個節點。

按照官方的架構,實際上有三個層次:

層次一:windows集群,windows集群本身也有底層伺服器的故障轉移功能;

層次二:alwayson高可用組,乙個高可用組包含了乙個主副本(讀寫副本)和多個輔助副本(唯讀副本,2014版最多8個),每個副本可以可以是單個sqlserver節點,也可以是多個(2個?)sqlserver節點組成的故障轉移集群。乙個高可用組對應了乙個偵聽器,偵聽器通過的浮動ip來實現。

層次三:alwayson故障轉移集群,這個集群需要共享儲存。

二、讀寫分離實現

1、alwayson高可用組對外是提供了乙個統一的訪問連線,即偵聽器,客戶端任何時候都是連線這個windows集群上配置的sqlserver集群專用偵聽器而不是某個節點,偵聽器需要事先配置好ip位址、連線串(hostname)和埠(預設1433)。前面提到這個位址是浮動位址。

listener的ip、連線串和埠是wsfc集群配置的,即配置了以後就增加了相應ag的浮動ip、dns了。

3、故障轉移集群(fci)和可用組(ag)的區別

最核心的差異,**fci是sqlserver例項級別(可以認為是物理級別),ag是資料庫級別(邏輯級別)。**因此兩者關係就比較清楚了。訪問者對例項是無感的,只看到資料庫物件(位址、埠、hostname),庫的層級在例項上面。對於某個ag中的資料庫,它在ag中有多個副本,每個副本都可以是fci集群,因為副本是邏輯層,它並不了解也不關心底層是單節點還是fci。副本使用fci的好處就是增加了這個副本自身的可用性,即單節點down了這個副本並沒有不可用,同時fci的多個例項不能部署在同乙個節點(伺服器)上。

從ag的概念可以理解:乙個ag的所有可用性副本必須執行在windows群集的不同節點上。執行在同乙個節點上的兩個不同例項不能用作同乙個ag的副本。

4、實現負載均衡

故障轉移群集是用於獲得高可用性的,而非用於實現負載平衡。sql server 沒有任何內建的、自動負載平衡功能。必須通過應用程式的物理設計來實現負載平衡。

參考:全面學習wsfc:

alwayson介紹:

Collection框架中實現比較要實現什麼介面

comparable和 comparator介面 如果乙個類的不同物件需要比較大小,那麼就需要實現這兩個介面,根據業務需求定義規則。使用區別 1 comparable介面 是需要比較的類實現自己實現,例如 定義的student類需要比較,需要student類自己實現這個介面,實現comparato ...

Collection框架中實現比較要實現什麼介面?

因此treemap的 key treeset 的集合元素,都需要可以比較大小。集合框架中之比較大小的有兩種方式 a 自然排序 對於自然排序來說,要求 treemap 中的所有 key都實現 comparable介面,實現該介面時需要實現乙個int compareto t o 方法,用於判斷當前物件與...

為什麼要實現Serializable

首先第乙個問題,實現序列化的兩個原因 1 將物件的狀態儲存在儲存 中以便可以在以後重新建立出完全相同的副本 2 按值將物件從乙個應用程式域傳送至另乙個應用程式域。實現serializabel介面的作用是就是可以把物件存到位元組流,然後可以恢復,所以你想如果你的物件沒實現序列化怎麼才能進行持久化和網路...