Magent介紹

Magent介紹



Magent是一款開源的Memcached代理服務器軟件。

 

項目地址:http://code.google.com/p/memagent


功能列表:


  • 和每個memcache server保持多個長連接,效果是減少memcache server保持的連接數量及創建銷燬連的開銷。不過,memcache本身就支持大併發連接,這個功能也就沒什麼特別的說道。


  • 支持memcache的binary協議命令,實現請求的轉發。支持下面的memcached命令:      


    1. get gets          
    2. delete          
    3. incr decr          
    4. add set replace prepend append          
    5. cas


  • 和memcache一樣,基於libevent的事件驅動來處理IO。


  • 支持ketama的一致性哈希算法。支持memcache backup集羣,當memcache集羣有機器掛了,memagent會將get請求轉向memcache backup集羣。這個功能對於cache的穩定性要求高的場景下會有用武之地。


  • 支持unix domain socket,是在socket架構上發展起來的用於同一臺主機的進程間通訊(IPC),它不需要經過網絡協議棧,不需要打包拆包、計算校驗和、維護序號和應答等,只是將應用層數據從一個進程拷貝到另一個進程。


問題描述:


Memcached其中一個節點失效以後,memcached本身是沒有任何策略維持失效轉發的,這對於大型系統是一個無法接受的事實。


架構方案:


採用 Magent 緩存代理,防止單點現象,緩存代理也可以做備份,通過客戶端連接到緩存代理服務器,緩存代理服務器連接緩存服務器,緩存代理服務器可以連接多臺Memcached機器。常用架構如下:

wKioL1ZSjffAl4J9AACFKIY5SQI099.jpg


magent與memcached 是可以混搭的,如下圖(2):



wKioL1ZSjinB9BgZAACIeHMfd3Q732.jpg


上圖此模型已經能夠很好的解決一個節點,一組服務器的緩存數據服務,但是如果在北方網通架設了一組服務器,同時在南方電信又架設了另外一組服務器,那麼這兩組相對獨立的節點之間如何做到數據的同步與共享,基於magent與memcached的解決方案如下:

wKiom1ZSjizwBqIaAACVfP8MkIw682.jpg


需要注意的是,兩組magent的配置最好完全一致,比如:


北方的magent配置爲:magent -s memcached1 -s memcached2 -b memcached3

那麼南方的magent配置也爲:magent -s memcached1 -s memcached2 -b memcached3


其順序都是一致的,因爲magent在分配key到memcached上時只是簡單的使用散列餘數算法。


當然如果你夠懶,那麼你可以直接連接備份magent,因爲所有的數據上面都有。


有個特別要注意的地方是:

1. 其中一臺Memcached死掉,從magent取數據,數據會從備份的Memcached取出,保證用戶不受影響。


2. Memcached重啓復活,由於這兩臺Memcached重啓後無數據,因此magent取得的將是空值,儘管備份Memcached還有數據。可採用定時維護服務器,恢復memcached。


3. 如果Memcached死掉,備份機同時死掉,那麼就沒有辦法,所以要設計健壯的架構。

工作原理:


我們以圖(1)爲示例架構來分析下magent的原理:


1. 應用程序連接magent,把緩存key1交給magent,magent根據自身的配置參數,再加ketama一致性哈希算法,會計算出key1存在3 臺主Memcached服務器的某一臺上,然後以同樣的算法,將key1也在2臺備用的Memcached服務器中的某一臺上,再存一份數據。即,主服務 器是分佈式存儲的,同時,從服務器也是分佈式存儲的。


2. 在應用程序獲取緩存數據key1時,magent一旦得知數據所存的那臺主Memcached服務器掛掉了,它就會轉向從備用的Memcached服務器中獲取數據。注意:服務器的定位選擇算法跟存的時候是一樣的。


3. 有個缺陷,當 down 掉的那臺主Memcached服務器重新恢復正常後,Memcahed裏是沒有數據的,即數據全部丟失,但此時備用的Memcached服務器又不會將數據同步到主服務器。


4. 應用程序連接代理的時候,最好每次隨機性只連一臺,這樣,一旦某臺代理掛了(即連不上),可切換連另外一臺代理服務器。而隨機性地去連,又保證了一定的負載均衡。

遇到的問題:


如 果memcached修復重啓後通過magent代理方式取到的值就會爲Null,這是由於memcache重啓后里邊的值隨着memcache服務的停 止就消失了(因爲在內存中),但是magent是通過key進行哈希計算分配到某臺機器上的,memcache重啓後會還從這臺機器上取值,所有取到的值 就爲空。

 

解決辦法:


1. 在每次memcache宕機修復後可以寫一個程序把集羣中的其他memcache的所有信息全給拷貝到當前宕機修復後的memcache中。

2. 自己寫代理,當從一個memcached服務上取到的值爲null時再去其他memcached上取值。

 

注意事項:


magent的調用方式同memcached一樣,客戶端可以不用改代碼即可實現切換到magent模式下。

參考:http://www.cnblogs.com/happyday56/p/3461113.html

本文轉自:http://ultrasql.blog.51cto.com/9591438/1633897

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章