1.編譯libevent
./configure --prefix=xxx
make && make install
2.編譯memcached
./configure --prefix=xxx
make && make install
3.啓動memcached
服務器端的命令爲:
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
-d選項是啓動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,我這裏是10MB,
-u是運行Memcache的用戶,我這裏是root,
-l是監聽的服務器IP地址,若是有多個地址的話,我這裏指定了服務器的IP地址192.168.0.200,
-p是設置Memcache監聽的端口,我這裏設置了12000,最好是1024以上的端口,
-c選項是最大運行的併發鏈接數,默認是1024,我這裏設置了256,按照你服務器的負載量來設定,
-P是設置保存Memcache的pid文件,我這裏是保存在 /tmp/memcached.pid,
想開機自動啓動的話,只需在/etc/rc.d/rc.local中加入一行,上面命令
有人用如下命令:
/usr/local/memcached/bin/memcached -d -m 20 -p 11211 -u apache
上面有些東西能夠參考一下:即,ip不指定時,默認是本機,用戶,最好選擇是:apache 或 deamon
這樣,也就是屬於哪一個用戶的服務,由哪一個用戶啓動。
4.memcached退出
kill `cat /tmp/memcached.pid`
5.安裝libmemcached
./configure --prefix=/xxxx/libmemcached --with-memcached=/xxxx/memcached/bin/memcached
make && make install
--with-memcached 選項要指定到memcached可執行文件
gcc是4.1,所以只能用老版本libmemcached(選了libmemcached-0.50)
6.使用
pythom-memcached下載連接不可用 ( http://www.tummy.com/software/python-memcached/)
改用
pylibmc ( https://pypi.python.org/pypi/pylibmc#downloads)
7.安裝magent
ketama.* 是一致性hash的實現
0.5版本:
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 ../
0.6版本:
不須要額外操做,直接執行make便可
-------------
光用不理解說不過去,加點料( http://code.google.com/p/memagent/wiki/HowMagentWorks ):
-------------
部署結構:
client---magent---{普通memcached集羣, 備份memcached集羣}
工做方式:
1.get操做,先到普通mem上讀取;若是失敗,再到備份mem上讀取(即服務器失效會致使兩次讀,不過只是特殊狀況下的處理,能夠接受)
2.若是一次get多個key的值,會逐個執行1.中的步驟
3.delete,incr,decr,add,set,replace,prepend,append,cas,同時操做{普通mem,備份mem}
* 寫操做:先操做備份men,再操做普通mem
* 不關聯二者之間操做的成功/失敗
4.client從magent上斷開,不影響magent保持與集羣server的連接
5.建議:client和magent部署在一塊兒,client經過127.0.0.1訪問magent時,效率會更高
-------------
8.配置轉發
在memcached的bin/目錄
./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
./memcached -m 1 -u root -d -l 127.0.0.1 -p 11213
magent -u root -n 51200 -l 127.0.0.1 -p 12000 -s 127.0.0.1:11211 -s 127.0.0.1:11212 -b 127.0.0.1:11213
- 分別在112十一、112十二、11213端口啓動3個Memcached進程,在12000端口開啓magent代理程序;
- 112十一、11212端口爲主Memcached,11213端口爲備份Memcached;
- 鏈接上12000的magent,set key1和set key2,根據哈希算法,key1被寫入11212和11213端口的Memcached,key2被寫入11211和11213端口的Memcached;
- 當112十一、11212端口的Memcached死掉,鏈接到12000端口的magent取數據,數據會從11213端口的Memcached取出;
- 當112十一、11212端口的Memcached重啓復活,鏈接到12000端口,magent會從11211或11212端口的Memcached取數據,因爲這兩臺Memcached重啓後無數據,所以magent取得的將是空值,儘管11213端口的Memcached還有數據(此問題尚待改進)。
9.測試流程
參照 http://blog.s135.com/post/393/ 其中使用的是magent-0.5
我嘗試了0.5和最新的0.6,但裏面提到的重啓後的」 因爲這兩臺Memcached重啓後無數據,所以magent取得的將是空值,儘管11213端口的Memcached還有數據(此問題尚待改進)「,仍然存在
10.題外話,緩存集羣的造成歷程
緩存集羣不是天生就有的,只有應用場景的發展纔會引起對集羣的須要。
STEP1:無緩存--->STEP2:單機memcached--->STEP3:memcached集羣+請求端分片--->STEP4:memcached集羣+單臺代理--->STEP5:memcached集羣+代理集羣--->再之後,就沒有之後了
1~3階段都是很輕鬆的(不少業務能到3階段已是規模不小,值得慶幸了);
4階段後期就會遇到各類壓力,要考慮memcached單臺失效對後端(極可能是DB或其餘持久化存儲)突發壓力的影響;magent的備份服務器是方法之一,但具體的備份方案須要琢磨,簡單的2倍存儲代價不小;
5階段要考慮集羣+集羣的失效,須要引入DNS/名字服務等更低層的網絡措施; python