如何將一個資料均勻的分布到不同的快取服務器上?

來源:互聯網
上載者:User
假如我有十台快取服務器 ,
1:怎樣的演算法可以將 一個資料均勻的分配到快取服務器上,避免某一台伺服器壓力過高,
2:然後怎樣從十台快取服務器中的某一台讀取快取資料;
談談php的具體實現方法

回複內容:

假如我有十台快取服務器 ,
1:怎樣的演算法可以將 一個資料均勻的分配到快取服務器上,避免某一台伺服器壓力過高,
2:然後怎樣從十台快取服務器中的某一台讀取快取資料;
談談php的具體實現方法

可以先看下此文:http://www.codinglabs.org/html/consis...

最簡單的就是拉一個雜湊函數出來(比如jshash,sdbmhash,或者直接用stl裡頭對string的hash都可以):hash(key) % 10 => 給出機器的ID。存取都用這樣的規則,就沒有問題了。

不過這種簡單方式存在的問題是,可用性和擴充性降低了。任意一台機器掛掉,相應的資料就沒地方存,不能自動儲存到其他機器。新增機器的時候也很麻煩。

目前的終極解決方案是一致性雜湊演算法,相應的文章很多,開源實現也很多,自己去搜吧。

使用雜湊演算法是必然的,就是要看對什麼做雜湊
如果你的存的時候是不帶Key的,也就是說,存入一個值,快取服務器返回一個Key,下一次訪問使用這個返回的Key取值。可以用microtime對緩衝機器數模數。

如果你存的時候是帶Key的,就比較麻煩了,因為要保證一致性,我用過一個辦法是對md5做摺疊。
就是對你預設的Key做一次md5,得到一個32位的字串,然後把字串中間對摺,做16進位加法,得到一個較小的數字(可以對摺多次,得到足夠小的數字,如果不做對摺,直接做截取也可以,目標就是把大數字變小),然後用得到的這個數字對機器數模數,這樣可以保證一致性。下一次用這個Key還可以用相同的演算法定位到某台機器

建議樓主瞭解下“ 一致性hash ”, 這個能完全能解決你這個問題。

而且在php中,一致性hash是被memcahe等擴充內建支援的。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.