安裝magent到/usr/local/下
cd /usr/local
mkdir magent
cd magent/
wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
tar zxvf magent-0.5.tar.gz
/sbin/ldconfig
sed -i "s/LIBS = -levent/LIBS = -levent -lm/g" Makefile
makehtml
magent命令參數:
-h this message
-u uid
-g gid
-p port, default is 11211. (0 to disable tcp support)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip and port
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is 4096
-D don't go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. default is off
-i number, max keep alive connections for one memcached server, default is 20
-v verbose前端
啓動magent服務
magent -u root -n 4096 -l 127.0.0.1 -p 12000 -s 127.0.0.1:8086 -s 127.0.0.2:8086 -b 127.0.0.1:11213算法
magent的hash算法
magent採用的是:Consistent Hashing原理,Consistent Hashing以下所示:首先求出memcached服務器(節點)的哈希值, 並將其配置到0~232的圓(continuum)上。 而後用一樣的方法求出存儲數據的鍵的哈希值,並映射到圓上。 而後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。 若是超過232仍然找不到服務器,就會保存到第一臺memcached服務器上。
從上圖的狀態中添加一臺memcached服務器。餘數分佈式算法因爲保存鍵的服務器會發生巨大變化 而影響緩存的命中率,但Consistent Hashing中,只有在continuum上增長服務器的地點逆時針方向的 第一臺服務器上的鍵會受到影響。後端
利用magent實現對memecache的分佈式管理,搭建一套memcache集羣服務緩存
一、前端php對magent的訪問跟對memcache訪問相同,不須要作任何更改,對於插入的key,magent會把值散列到各個memcache服務上,只操做magent,不用關心後端處理
二、公司項目應用:南北各10臺前端,南北各部署一套magent服務,主要是考慮電信網通的跨網訪問
以北方爲例,每一個前端安裝memcached服務(大內存機器能夠啓動多個服務),每一個前端都安裝magent服務,後端掛載所有機器的 memcached服務,啓動參數:服務器
magent -p 12000 -s 127.0.0.1:8086 -s 127.0.0.2:8086 -s 127.0.0.3:8086.......-s 127.0.0.10:8086網絡
,全部前端配置都是相同的,任何一個前端只需訪問本地端口的magent,這樣的memcache集羣對應用帶來很大便利.
好比項目的基本配置信息,早期策略只能在中控機生成配置文件,同步到各個前端,沒有辦法把配置信息放到緩存中,由於各個前端的memcache是不共享 的,一臺機器緩存更新,其它機器是不更新的,用程序去控制更新,仍是存在不穩定因素,並且隨着服務增多,也不便於管理,部署了magent後,就能夠解決 這個問題,任何一個前端更新數據=全局更新
這種部署還能夠解決的應用:session共享
項目中多處已經實際應用,magent對memcache的均衡和穩定性都很是不錯,推薦使用session
from:http://hi.baidu.com/zhizhesky/blog/item/277886b118cf1b5a082302f6.html架構
magent是一款開源的Memcached代理服務器軟件,能夠用它作一些高可用嘗試。
1、安裝步驟:
一、編譯安裝libevent:
wget http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz
tar zxvf libevent-1.4.9-stable.tar.gz
cd libevent-1.4.9-stable/
./configure --prefix=/usr
make && make install
cd ../
二、編譯安裝Memcached:
wget http://danga.com/memcached/dist/memcached-1.2.6.tar.gz
tar zxvf memcached-1.2.6.tar.gz
cd memcached-1.2.6/
./configure --with-libevent=/usr
make && make install
cd ../
三、編譯安裝magent:
mkdir magent
cd magent/
wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
tar zxvf magent-0.5.tar.gz
/sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
make
cp magent /usr/bin/magent
cd ../
2、高可用網絡架構
服務器A 服務器B
啓動兩個memcached進程,端口分別爲11211和11212:
memcached -m 1 -u root -d -l 127.0.0.1 -p 11211
memcached -m 1 -u root -d -l 127.0.0.1 -p 11212
啓動兩個magent進程,端口分別爲10000和11000:
magent -u root -n 51200 -l 127.0.0.1 -p 10000 -s 127.0.0.1:11211 -b 127.0.0.1:11212
magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s 127.0.0.1:11212 -b 127.0.0.1:11211
-s 爲要寫入的memcached, -b 爲備份用的memcached。
說明:測試環境用magent和memached的不一樣端口來實現,在生產環境中能夠將magent和memached做爲一組放到兩臺服務器上。
也就是說經過magent可以寫入兩個memcached。
[root@odb ~]# telnet 127.0.0.1 10000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set key 0 0 8 <---在10000端口設置key的值
88888888
STORED
quit
Connection closed by foreign host.
[root@odb ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get key <---在11211端口獲取key的值成功
VALUE key 0 8
88888888
END
quit
Connection closed by foreign host.
[root@odb ~]# telnet 127.0.0.1 11212
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get key <---在11212端口獲取key的值成功
VALUE key 0 8
88888888
END
quit
Connection closed by foreign host.
高可用性測試:
[root@odb ~]# ps aux |grep -v grep |grep memcached
root 23455 0.0 0.0 5012 1796 ? Ss 09:22 0:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11212
root 24950 0.0 0.0 4120 1800 ? Ss 10:58 0:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11211
[root@odb ~]# ps aux |grep -v grep |grep 'magent -u'
root 25919 0.0 0.0 2176 484 ? Ss 12:00 0:00 magent -u root -n 51200 -l 127.0.0.1 -p 10000 -s 127.0.0.1:11211 -b 127.0.0.1:11212
root 25925 0.0 0.0 3004 484 ? Ss 12:00 0:00 magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s 127.0.0.1:11212 -b 127.0.0.1:11211
[root@odb ~]# telnet 127.0.0.1 10000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set stone 0 0 6 <---在10000端口設置stone的值
123456
STORED
quit
Connection closed by foreign host.
[root@odb ~]# telnet 127.0.0.1 11000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set shidl 0 0 6 <---在11000端口設置shidl的值
666666
STORED
get stone <---在11000端口獲取stone的值成功
VALUE stone 0 6
123456
END
incr stone 2 <---在11000端口修改stone的值成功
123458
get stone
VALUE stone 0 6 <---在11000端口驗證stone的值,證實上面的修改爲功
123458
END
get shidl <---在11000端口獲取shidl的值成功
VALUE shidl 0 6
666666
END
quit <---退出11000端口
Connection closed by foreign host.
[root@odb ~]# telnet 127.0.0.1 10000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get stone <---在10000端口獲取stone的值,已被修改
VALUE stone 0 6
123458
END
get shidl <---在10000端口獲取shidl的值成功
VALUE shidl 0 6
666666
END
delete shidl <---在10000端口刪除shidl
DELETED
get shidl <---在10000端口刪除shidl生效
END
quit
Connection closed by foreign host.
[root@odb ~]# telnet 127.0.0.1 11000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get shidl <---在11000端口驗證刪除shidl生效
END
get stone <---在11000端口獲取stone的值成功
VALUE stone 0 6
123458
END
quit
Connection closed by foreign host.
Down機模擬測試:
Down掉11211端口的memcached:
[root@odb ~]# kill -9 24950
[root@odb ~]# telnet 127.0.0.1 10000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get stone <---在10000依然能夠獲取stone的值
VALUE stone 0 6
123458
END
quit
Connection closed by foreign host.
[root@odb ~]# telnet 127.0.0.1 11000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get stone <---在11000依然能夠獲取stone的值
VALUE stone 0 6
123458
END
quit
Connection closed by foreign host.
Down掉11000端口的magent:
[root@odb ~]# kill -9 25925
[root@odb ~]# telnet 127.0.0.1 10000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get stone <---在10000依然能夠獲取stone的值
VALUE stone 0 6
123458
END
quit
Connection closed by foreign host
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
magent使用
1、Linux環境下安裝magent:
一、安裝libevent:
wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz |
wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz |
mkdir magent |
memcached -m 1 -u root -d -l 192.168.1.219 -p 11211
|
# telnet 192.168.1.219 12000 |
@@@@@@@@@@@@@@@@@@@@@@@@@
文章分類:綜合技術
# cd /usr/bin
# magent -u root -n 51200 -l 127.0.0.1 -p 12000 -s 10.1.1.1:11211 -s 10.1.1.2:11211
-b 10.1.1.3:11211