當面服務面對巨大的訪問時,需要以伺服器集群的方式來完成請求的處理。構建伺服器集群的方式有多種選擇,下圖勾勒了一種如何構建伺服器集群的邏輯架構。
client與server中間設有clustermanagementlayer。構成這一層包含乙個重要的元件serviceregister(sr)服務,sr可記錄後台伺服器的服務資訊,後台伺服器的服務型別可以按servicetype進行分類,不同的伺服器按服務型別以儲存在嵌入式資料庫中,同時也記錄服務所屬的群組資訊以方式儲存,並將該資訊註冊到sr上。service對應的邏輯實體是requestmanagementcenter(rmc),每一rmc群組中的伺服器都提供同一邏輯意義上的服務。client在啟動初始化的時候就需要知道sr的資訊,並從sr獲得rmc的列表,從而將不同的服務請求發給相應的rmc。
rmc需要包含init/failover_schedule,session_keep,server_load_monitor,add/delete_server等服務:
1). add/delete_server
若增加一後台伺服器,該伺服器首先要向sr傳送訊息註冊自己,而後sr傳送訊息給rmc,rmc在其伺服器列表中增加該條記錄,則該伺服器完成加入到服務群組中的操作。rmc對server請求的超時及sr對server的心跳超時都會導致該伺服器被剔除出集群。rmc和sr之間也維護有心跳資訊,若果某一rmc宕機,sr會給client傳送一服務阻塞資訊,併發訊息讓servicegroup某一當前負載較低的伺服器啟動該服務,讓後更新各個client的服務群組列表(servicegroupinfolist:sgil)。服務重新開始提供。
2). server_load_monitor
各個伺服器需要執行resource_self_monitor模組,將自己的執行狀態以push/pull方式傳輸到server_load_monitor模組,從而使rmc知道其管理的所有的伺服器的執行狀態。
3). init _schedule
init _schedule根據server_load_monitor提供的執行時狀態資料能夠從後台server中選擇一台負載最小的伺服器來提供服務。
4). session_keep
rmc將某一client的請求傳送給乙個後台伺服器處理後,會記錄這個client和選中的伺服器的關係,以後同一client的請求會被傳送到同乙個伺服器去處理。
5). 後台server的session資料備份策略
sx/ \
sy sz
server_x的資料會被同時備份到server_y和server_z上,server_x、server_y、server_z的關係會被記錄在rmc。
6). failover_schedule
當發生伺服器宕機事件時,rmc根據其記錄的server資料備份資訊將有session性質的請求傳送到其對應的server_y或server_z上,從而保持服務的一致性。
上面的敘述可用下面的圖來描述,
而上圖中的三個模組rmc、sr、dcs可以被合併為cluste***ctor,部署在每乙個server上。
初始配置的時候,伺服器集群中需要有一台機器的sr屬性執行,所有的伺服器都需要知道誰是sr,但是在以後的執行過程中可能發生變化。client啟動時需要乙個資訊即sr的ip:port/namingservice/url.client啟動後檢查自己的服務群組列表,若為空,則從初始配置的sr處獲取,在有該列表的情況下,client的每個同類請求都應傳送的列表所指示的rmc上去。client和sr之間以某一固定的時間間隔進行短連線心跳互動,當client發現某一服務超時後,短連線改為長連線,向sr傳送告警資訊,sr恢復後台server的服務後可在第一時間讓client得到該資訊,是client由阻塞恢復到正常。
每一台server啟動的時候需要向sr註冊自己的service、ip:port/url等資訊。sr會以service為key標誌對server分群,建立sgil。並向各個sgil中編號對大的sever傳送命令,令其啟動rmc服務,待其服務啟動後,將sgil傳送給rmc。至此整個系統啟動完畢,可對外提供服務。
相對較小的集群sr伺服器可以以ha的方式執行。對於較大的集群sr可以執行在二叉樹同步演算法之上,能以最快的速度保證集群中資料的一致性。該演算法的核心是每個節非葉子節點只向兩個預定的節點傳送自己收到的資訊,所有節點按完全平衡二叉樹的方式連線,移除和新增節點同完全平衡二叉樹的平衡演算法。假如乙個sr集群有7臺伺服器組成,下圖描述了當節點sa和se第一次收到訊息時的擴散方式。
easyexcel自適應列寬的一種方式
源 中,是讀取所有列的長度,然後取最大列的長度,但是它的本地快取用的是static final,導致每次匯出的列寬都和第一次的一樣,這樣就不能實現自適應了,所以我就取巧了下 public class custemhandler extends abstractcolumnwidthstylestra...
一種改進的OPenCV區域性 自適應快速二值化
由於用opencv自帶的函式adaptivethreshold 在光照不均勻的影象中進行二值化時,效果不佳,之後看了derek bradley和gerhard roth於2007年寫的 adaptive thresholding using the integral image 方法簡單實現簡便且速...
CPU GPU集群計算中的一種動態負載均衡設計方法
在cpu gpu協同計算中,cpu和gpu的計算能力不同,靜態地給cpu和gpu劃分任務會導致cpu和gpu計算不同步,導致嚴重的負載不均衡,為了實現cpu和gpu的負載均衡,需要對cpu和gpu不同的劃分方法。把每個節點上的所有cpu看成乙個裝置,每塊gpu卡看成乙個裝置,對集群節點上的所有cpu...