Sun Cluster 資料服務開發者指南 (適用於 Solaris 作業系統)

伺服器如何將事件發送給用戶端

由於事件在叢集內產生,CRNP 伺服器會將其發送給要求這些類型事件的所有用戶端。 發送過程包括將 SC_EVENT 訊息發送給用戶端的回呼位址。 每個事件的發送均發生在新的 TCP 連接中。

用戶端註冊事件類型之後,伺服器會立即透過包含 ADD_CLIENT 訊息或 ADD_EVENT 訊息的 SC_CALLBACK_REG 訊息將該類型的最新事件發送給該用戶端。 然後,該用戶端就可以知曉發送後續事件的系統之目前狀態。

當伺服器開始與用戶端的 TCP 連接後,會透過此連接準確發送一條 SC_EVENT 訊息。 然後,該伺服器發怖全雙工關閉。

例如,該用戶端執行下列動作:

  1. 等待伺服器開始 TCP 連接

  2. 接受從伺服器進來的連接

  3. 等待 SC_EVENT 訊息

  4. 讀取 SC_EVENT 訊息

  5. 接收表明該伺服器已關閉連接 (從套接字讀取 0 位元組) 的指示器

  6. 關閉連接

所有用戶端均已註冊時,必須一直為進來的事件發送連接偵聽其回呼位址 (IP 位址與通訊埠編號)。

如果伺服器無法聯絡到用戶端,以致不能發送事件,則該伺服器會以您所定義的時間間隔與次數再次嘗試發送該事件。 如果所有嘗試均失敗,則會從伺服器的用戶端清單中移除該用戶端。 該用戶端還需要發送包含 ADD_CLIENT 訊息的另一個 SC_CALLBACK_REG 訊息來重新註冊,然後才可以接收更多事件。

如何保證事件的發送

叢集內事件的產生有一個總的排序,向每個用戶端發送事件的順序也會依照此順序。 換句話說,如果在叢集內先產生事件 A 而後產生事件 B,則用戶端 X 會先接收到事件 A ,然後接收到事件 B。然而,將事件發送給所有用戶端時不會保持總的排序。 即,在用戶端 X 接收到事件 A 之前用戶端 Y 可以接收事件 A 與事件 B。以此方式,那些速度慢的用戶端不會阻礙向所有用戶端發送事件。

除了當伺服器遇到導致遺失叢集產生的事件之錯誤以外,該伺服器發送的所有事件 (除了子類別的第 一個事件與包含伺服器錯誤的事件) 均是回應叢集產生的實際事件。 在此情況下,伺服器為每個事件類型產生一個事件,表示該事件類型的系統之目前狀態。 每個事件發送給表明對該事件類型感興趣的已註冊用戶端。

事件發送遵循「至少一次」的語義進行。 即,允許伺服器將同一事件多次發送給某一用戶端。 萬一伺服器暫時關閉,當它重新啟動後無法判斷該用戶端是否已接收到最新資訊,此時該允許是必要的。

SC_EVENT 訊息的內容

SC_EVENT 訊息包含叢集內所產生的實際訊息,該實際訊息已經過轉換以適應 SC_EVENT XML 訊息格式。 下表說明 CRNP 發送的事件類型,包括名稱、值對、出版商及供應商。

類別與子類別  

出版商與供應商 

名稱與值對 

註解 

EC_Cluster

ESC_cluster_membership

出版商: rgm 

供應商: SUNW  

名稱: node_list

值類型: 字串陣列  

名稱: state_list

值類型: 字串陣列 

state_list 的陣列元素位置與 node_list 的那些陣列元素位置是同步的。 即在 node_list 陣列中首先列出的節點之狀態就是 state_list 陣列中的第一個。

state_list 僅包含以 ASCII 表示的編號。 每個編號表示叢集中該節點的目前典型編號。 如果該編號與先前所接收到訊息中的編號相同,則該節點尚未變更其與叢集的關係 (分離、連結或者重新連結)。 如果典型編號為 –1,則該節點不是叢集的成員。 如果典型編號是非負數的編號,則該節點是叢集的成員。

ev_ 開始的其他名稱及其關聯的值可能出現,但不是供用戶端使用的。

EC_Cluster

ESC_cluster_rg_state

出版商: rgm 

供應商: SUNW  

名稱: rg_name

值類型: 字串  

名稱: node_list

值類型: 字串陣列  

名稱: state_list

值類型: 字串陣列 

state_list 的陣列元素位置與 node_list 的那些陣列元素位置是同步的。 即在 node_list 陣列中首先列出的節點之狀態就是 state_list 陣列中的第一個。

state_list 包含資源群組狀態的字串表示法。 有效值為可使用 scha_cmds(1HA) 指令擷取的那些值。

ev_ 開始的其他名稱及其關聯的值可能出現,但不是供用戶端使用的。

EC_Cluster

ESC_cluster_r_state

出版商: rgm 

供應商: SUNW  

有三項是必需的,如下所示:  

名稱: r_name

值類型: 字串 

名稱: node_list

值類型: 字串陣列 

名稱: state_list

值類型: 字串陣列 

state_list 的陣列元素位置與 node_list 的那些陣列元素位置是同步的。 即在 node_list 陣列中首先列出的節點之狀態就是 state_list 陣列中的第一個。

state_list 包含資源狀態的字串表示法。 有效值為可使用 scha_cmds(1HA) 指令擷取的那些值。

ev_ 開始的其他名稱及其關聯的值可能出現,但不是供用戶端使用的。