iT邦幫忙

DAY 23
7

高有效性 (High Availability) 初論 30 講系列 第 23

高有效性簡介30篇: Scheduling 的範例 (23)

  • 分享至 

  • xImage
  •  

**上一篇講了 SLB 須要的基本知識, 上一篇事實上有一半都是書上有的, 寫起來挺無趣的, 但還是要有一些 Overview 會比較好, 而這篇來講一個實務的專論好了.

說是 SLB 說四種方式前三種是大家最常遇到與使用, 但事實上第四種才是根基, 因為若是無法設計成 Scale Up 的系統, 很多 High Avaialability 都是空談, 而這個就往往是要從系統架構的程式設計下手.**
甚至有時候一個 Tier 是不足夠的, 有可能是要建立兩個 Tiers, 我就曾經設計過一套系統:

1. 提出工作者透過 Dispater 分派給許多 Group 來計算.
2. 每個 Group 會產生接續的 Tasks Queues 給下面的機器群來運算.
3. 每台機器會有一群 VM 來作模擬.

若是每台機器可以跑 20 個 VM, 每一個 Group 可以處理 30 台機器, Dispatcher 可以處理 40 組 Group, 這樣一套系統就是代表可以同時給 2400 個計算單元來計算.

而在這兩個環節有各自的 Failover Mechanism 機制以及 Scheduling 排程的方式, 此時這個是不是叫 SLB, 就見人見智, 至少我認為是.

事實上還有第四個環節, 就是 Data Warehouse 的運作, 上面幾篇講的 DB 同步的實例就是講這套系統, 所以我一直說 HA 有時沒那麼簡單, 也常看到有人想用同一個機制來解決所有 HA 的事, 結果花了很多工夫還是走回來了, 畢竟每一種事情或多或少不一樣, 要去做 Generlization 一般化的成本是相當高的, 我常說比專屬系統高上四倍到五倍是基本.

但這麼大的系統要如何分配到能夠有最有效率的運算是很困難的, 所以有時難不是難在系統的設計, 而是 Scheduling 排程.

我就在這套系統實作了一個有趣的排程方式:

1. 計算每個 Group 一段時間的運算速度.
2. 計算這個 Group 還有多少還沒算, 因此算出預計那時完成的時間.
3. 依照這時間長短來做未來排程的權重.
4. 依照這權重來分派工作.

前三個都很好解, 但第四個問題就很有趣了, 當然大部份的系統都是有權重的 Round Robin, 或有權重的 Random, 但如何找到一個演算法能夠有權重的均勻分配工作, 就是 Eduard Hagenbach-Bischoff 演算法.

而我把這系統實作如下:

			//
			// Decision rules
			//
			$aGroupIds = array_keys($aGroups);
			$iScanCount=$oCache->get(SCAN_COUNT);
			//$iStartIndex = $iScanCount % count($aGroupIds);
            $iWeightIndex = $iScanCount % TOTAL_WEIGHT;                  
       
            $sWeight = $oCache->get(GROUP_WEIGHT);
            
            if ($sWeight === false) {
               $cag=count($aGroupIds)-1;
               for($igi=0;$igi<$cag;$igi++){
                  $sWeight.=sprintf("%d,", TOTAL_WEIGHT/$cag);
               }
            }
            
            $iGroupWeight = explode(",", $sWeight);
            $iGroupCount = sizeof($iGroupWeight)-1;

            $iSC=0;
            $SeatCount=0;
            while($SeatCount<$iWeightIndex){
                $iSC++;
                $SeatCount=0;
                for($ii=0;$ii<$iGroupCount;$ii++){
                   $SeatCount+=round($iGroupWeight[$ii]/TOTAL_WEIGHT*$iSC);
                }
            }
            $Seats="";
            $overSeat=$SeatCount-$iWeightIndex;
            for($ii=0;$ii<$iGroupCount;$ii++){
                if(round($iGroupWeight[$ii]/TOTAL_WEIGHT*$iSC)>round($iGroupWeight[$ii]/TOTAL_WEIGHT*($iSC-1)))
                   $Seats.=$ii.",";
            }
            $Seata = explode(",", $Seats);
            $iStartIndex = $Seata[$overSeat];

理論上我是最不想貼程式的, 因為不太可能今天當時的創作, 但與其去講那麼多, 或者寫這樣複雜的演算法, 還不如把 Source Code 貼給大家看, 我想也是這次唯一的一次了.

但我是想說的, 這演算法原本是要來解決 "政治問題" 的席次分配, 為了要讓席次與比例有一定的配合, 是非常的吹毛求疵, 我反而是在看一些數學的書看到這種計算方式, 所以有時候不見得要看電腦書才能學到, 多方面閱讀才是王道阿.


上一篇
高有效性簡介30篇: SLB, NLB 的底層 (22)
下一篇
高有效性簡介30篇: Load Balancing Servers, ... (24)
系列文
高有效性 (High Availability) 初論 30 講30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
食夢黑貘
iT邦研究生 3 級 ‧ 2011-11-02 21:04:07


至少這程式是我寫的, 所以原創性還是 100%

我要留言

立即登入留言