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機器。常用架構如下:
magent與memcached 是可以混搭的,如下圖(2):
上圖此模型已經能夠很好的解決一個節點,一組服務器的緩存數據服務,但是如果在北方網通架設了一組服務器,同時在南方電信又架設了另外一組服務器,那麼這兩組相對獨立的節點之間如何做到數據的同步與共享,基於magent與memcached的解決方案如下:
需要注意的是,兩組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模式下。