作者:張鼎松 (Dingsong Zhang) @ Microsoft
在上一節的結尾簡單介紹了Service Fabric中分區Partitions和復制replicas的概念,本節主要以示例的形式來具體說明這個抽象概念在Service Fabric中的工作方式。
1. 分區Partitions和復制replicas
一個service可以包含多個分區Partition,Service Fabric通過使用分區作為擴展的機制來將工作分布到不同的service實例上。
一個分區Partition可以包含一個或者多個復制replicas。Service Fabric通過使用復制來實現可用性。一個分區可以有一個主復制和多個從復制,多個復制之間的狀態可以自動同步。當主復制出現錯誤時,其中一個從復制被自動提升為主復制,以保證系統的可用性。然后將從復制的個數恢復到正常水平,保證足夠的從復制冗余。
(Note: 下文中出現的所有Instance 跟Replica是同一個意思)
如下圖示例,我們假設一個有一個Cluster中有5個Node, 現在我們要在Cluster上部署一個Application, 這個Application包含兩個Service。 Application Type為“A”,Service Type為“S”。
首先我們要創建一個Named Application, 按照上一節提到的Application的命名規范,我們將這個Named Application叫做“faric:/A1”。依次再創建兩個“S” type的Named Service,並將它們命名為“fabric:/A1/S1”和“fabric:/A1/S2”。
2. 創建Named Application
對於創建的這個Named Application “faric:/A1”, Service Fabric提供三種方式對其進行管理:
- REST API: 可以使用REST API 通過HTTP 協議和 port 19080進行管理
- PowerShell commands: PS Cmdlet 使用的是 TCP 協議和 port 19000進行管理
- Fabric Client: 還可以使用 C#/VB的.Net 類庫Fabric Client, 其實內部使用的仍然是 TCP on port 19000的方式
3. 創建Named Service
我們希望S1有一個分區,三個Instance. S2有2個分區,2個Instance.
我們看到Named Service fabric:/A1/S1,按照要求我們希望設置 Partition count為 1, Instances count 為 3。 1個Partition乘以3個 Instances等於3。 (1x3=3). 所以Service Fabric會選擇Cluster中的3個Node來存放這個Named Service. 我們不需要去控制這個過程,Service Fabric會幫我們完成這個操作。
現在,S1在Cluster中的分布如下圖:
Service fabric選擇了 Node #1 #2 和 #3 給
Partition 1, Instance 1: fabric:/A1/S1, P1, I1
Partition 1, Instance 2: fabric:/A1/S1, P1, I2
Partition 1, Instance 3: fabric:/A1/S1, P1, I3
同一Partition的不同instance要分布在不同的Node上。
就是說Instance1 和Instance2永遠不可能在同一個Node上,這樣設計的原因是高可用性:當任何一個Node突然出現故障不能工作時,其他Node能夠正常提供服務。 但是如果兩個或兩個以上的Instance在同一個Node上時,這個Node出現故障,您將會失去這個Node上的所有數據。
Service Fabric 被設計成可以將 instance分散發布在不同的Nodes上,以保證可以給用戶高可用性的體驗。
我們繼續創建另一個Named Service: “fabric:/A1/S2”, Partitions count為2, Instances/Replicas count為2。 (2x2=4)
Partition 1, Instance 1: fabric:/A1/S2, P1, I1
Partition 1, Instance 2: fabric:/A1/S2, P1, I2
Partition 2, Instance 1: fabric:/A1/S2, P2, I1
Partition 2, Instance 2: fabric:/A1/S2, P2, I2
Service Fabric 會首先將Partition1 Instance1部署在 Node3上, 然后再將 Partition1 Instance2 放置在Node4上。
(Service Fabric 可以確保不同的 instances/replicas被放置部署在不同的 Nodes上)
然后繼續將 Partition2 Instance2 放置在Node5, Partition2 Instance1 放置在 Node4.
你會注意到 Partition1 Instance2 和 Partition2 Instance1 都在同一個 Node4上。這樣是沒有問題的,因為當 Node4出現故障時, 我們在Cluster中仍然擁有 Partition1 的一個Instance1和 Partition2的 Instance2。
Node4 is a single point of failure but for two instances of different Partitions, 我們永遠不會讓一個Partition的兩個Instance出現在同一個Node上。
到此為止,Service Fabric就完成了S1 和S2的部署。