這個問題實際上是資料分布方式的問題(怎麼分組)。最簡單最容易想到的就是根據資源數目對資料進行雜湊分布,比如算出乙個雜湊值,然後對資源數取模。這種簡單處理的結果就是當資源數變化的時候,每個資料重新取模後,其分布方式都可能變化,從而需要遷移大量的資料。
舉個簡單的例子來說明一下,假設我的資料是自然數(1-20),資源現在是三颱主機(a,b,c),採用取模分配方式,那麼分配後a主機的資料 為(1,4,7,10,13,16,19),b為(2,5,8,11,14,17,20) c(3,6,9,12,15,18) 現在增加一台主機d,重新分布後的結果是a(1,5,9,13,17) b(2,6,10,14,18) c(3,7,11,15,19) d(4,8,12,15,20) 。
可以看到,有大量的資料需要從一台主機遷移到另外一台主機。這個遷移過程是很消耗效能的。需要找到一種方式來盡可能減少對現存資料的影響(沒有影響當然也不可能,那說明新新增的主機沒有資料)。
dynamo 採用的是 consistent hashing 來解決這個問題的。那麼我們先來了解一下什麼是consistent hashing。先想象乙個圓,或者你自己的手錶表面,把它看成是乙個首尾相接的數軸,現在我們的資料,自然數,已經分布到這個圓上了,我們可以把我們的 資源採用某種方式,隨機的分布到這個圓上(圖1-1)。
現在我們讓每乙個資源負責它和上乙個資源之間的資料,就是說a來負責區間(c,a],b來負責區間(a,b],c負責區間(b,c]。採用這種 策略,當我們增加乙個資源主機的時候,比如d,那麼我們只需要影響新節點相鄰的節點a所負責的範圍(只需要將a中(c,d]這個區間的資料遷移到d上)就 可以了。
因為資源節點是隨機分布到資料圓上的,所以當資源節點的數量足夠多的時候,可以認為每個節點的負載基本是均衡的。這是原始的consistent hashing。
dynamo並沒有採用這個模型。這個理想的理論模型跟現實之間有乙個問題,在這個理論模型上,每個資源節點的能力是一樣的。我的意思是,他們有相同的cpu,記憶體 ,硬碟 等,也就是有相同的處理能力。可現實世界,我們使用的資源卻各有不同,新買的n核機器和老的奔騰主機一起為了節約成本而合作。如果只是這麼簡單的把機器直接分布上去,效能高的機器得不到充分利用,效能低的機器處理不過來。
這個問題怎麼解決呢?dynamo 使用的方法是虛節點。把上面的a b c等都想象成乙個邏輯上的節點。一台真實的物理節點可能會包含幾個虛節點(邏輯節點),也可能只包含乙個,看機器的效能而定。
等等,好像我們的**還沒發展成 google 呢,我們能使用的硬體資源還不多,比如就4臺主機。這個時候採用上面的方式,把資源隨機分布上去,幾乎一定會不均衡。這要怎麼辦呢?我們可以把那個資料圓 分成q等份(每乙個等份就是乙個虛節點),這個q要遠大於我們的資源數。
現在假設我們有s個資源,那麼每個資源就承擔q/s個等份。 當乙個資源節點離開系統的時候,它所負責的等份要重新均分到其他資源節點上,乙個新節點加入的時候,要從其他的節點"偷"到一定數額的等份。
這個策略下,當乙個節點離開系統的時候,雖然需要影響到很多節點,但是注意,遷移的資料總量只是離開那個節點的資料量。同樣,乙個新節點的加 入,遷移的資料總量也只是乙個新節點的資料量。之所以有這個效果是因為q的存在,使得增加和減少機器的時候不需要對已有的資料做重新雜湊。這個策略的要求 是q>>s(其實還有儲存 備份的問題,現在還沒介紹到,假設每個資料儲存n個備份 則要滿足q>>s*n)。如果業務快速發展,使得不斷的增加主機,從而導致q不再滿足q>>s,那麼這個策略將不斷的退化。
**:
oracle檢視表空間並擴容,解決查詢慢問題
資料庫非常慢,簡單的sql速度也很慢。可能的原因 1 歸檔日誌是否滿了。如果滿了,清理下 2 表空間是否滿了。這裡說下表空間的處理。檢視表空間及使用率 total表示目前的可用空間 檢視表空間及使用率等資訊 select a.tablespace name,filenum,total total m...
一致性雜湊虛節點解決雪崩問題
一致性雜湊的基本原理大家都知道,就是找乙個最近的節點或者順時針,逆時針找乙個節點,而不是通過模乙個n去找節點,這樣做的好處就是當其中一台磬機的時候,一致性雜湊還可以繼續工作,而模n的方法,所有定位在磬機節點上都會失敗。如下 是乙個簡單的一致性雜湊 class redis public functio...
二 利用動態規劃的思想來解決馬爾可夫決策問題
動態規劃 dynamic programming 是非常經典的求解最優解的演算法思想,它要求問題滿足最優子特性才可以使用。我們對馬爾可夫問題的定義是乙個五元組 假設上圖每個節點上都有乙個值,現在要求從頂點經過一條路徑到達最底層的某乙個節點,使得路徑上值之和最大。按照動態規劃的思想,我們很容易可以想到...