Magent搭建Memcached集群
原文地址:http://ultrasql.blog.51cto.com/9591438/1636374
?
Memcached集群介紹
?
由于Memcached服務器與服務器之間沒有任何通訊,并且不進行任何數據復制備份,所以當任何服務器節點出現故障時,會出現單點故障,如果需要實現HA,則需要通過另外的方式來解決。
?
通過Magent緩存代理,防止單點現象,緩存代理也可以做備份,通過客戶端連接到緩存代理服務器,緩存代理服務器連接緩存連接服務器,緩存代理服務器可以連接多臺Memcached機器可以將每臺Memcached機器進行數據同步。如果其中一臺緩存服務器down機,系統依然可以繼續工作,如果其中一臺Memcached機器down掉,數據不會丟失并且可以保證數據的完整性。
?
搭建Memcached集群
?
Magent的架構方案已經在上一篇博文《Magent介紹》中有詳細描述。現以如下圖示例架構方案說明Magent如何搭建Memcached集群,而在生產環境需要根據自身業務特點設計健壯的架構方案。
?
?
現有測試機:192.168.11.51/52/68
先在三臺測試機上安裝好libevent和memcached,啟動memcached實例;
然后在51和52上安裝好magent,啟動magent實例。
?
安裝和啟動memcached實例
?
詳細步驟,請參見之前的博文《Memcached 1.4.22安裝和配置》,分別啟動如下實例:
| 1 2 3 | /usr/local/bin/memcached?-d?-m?256?-u?memcached?-l?192.168.11.51?-p?11211?-c?1024?-P?/var/run/memcached/memcached.pid /usr/local/bin/memcached?-d?-m?256?-u?memcached?-l?192.168.11.52?-p?11211?-c?1024?-P?/var/run/memcached/memcached.pid /usr/local/bin/memcached?-d?-m?256?-u?memcached?-l?192.168.11.68?-p?11211?-c?1024?-P?/var/run/memcached/memcached.pid |
?
安裝和啟動magent實例
?
筆者在測試magent-0.6.tar.gz時,該版本在與最新版memcached運行下不夠穩定,如下配置以magent-0.5.tar.gz為示例。
?
1. 安裝magent到/usr/local下: ??
| 1 2 3 4 5 6 | 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 |
?
2. 修改配置: ??
在ketama.h文件開頭添加 ? ?
| 1 2 3 | #ifndef?SSIZE_MAX???? #define?SSIZE_MAX?32767???? #endif |
?
| 1 2 3 4 | ln?-s?/usr/lib64/libm.so?/usr/lib64/libm.a /sbin/ldconfig sed?-i?"s#LIBS?=?-levent#LIBS?=?-levent?-lm#g"?Makefile???? vi?Makefile |
?
將 ? ?
| 1 | CFLAGS?=?-Wall?-O2?-g |
修改為: ? ?
| 1 | CFLAGS?=?-lrt?-Wall?-O2?-g |
保存
?
3. 編譯: ??
| 1 | make |
? ?
輸出如下信息: ? ?
| 1 2 3 | gcc?-lrt?-Wall?-O2?-g?-c?-o?magent.o?magent.c???? gcc?-lrt?-Wall?-O2?-g?-c?-o?ketama.o?ketama.c???? gcc?-lrt?-Wall?-O2?-g?-o?magent?magent.o?ketama.o?-levent?–lm |
?
4. 查看命令幫助: ??
| 1 | ./magent?–h |
? ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | memcached?agent?v0.4?Build-Date:?Apr?21?2015?09:21:10???? Usage:???? -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,?set?max?keep?alive?connections?for?one?memcached?server,?default?is?20???? -v?verbose |
?
5. 啟動magent實例 ??
| 1 2 | /usr/local/magent/magent?-u?root?-n?4096?-l?192.168.11.51?-p?11200?-s?192.168.11.51:11211?-s?192.168.11.52:11211?-b?192.168.11.68:11211???? /usr/local/magent/magent?-u?root?-n?4096?-l?192.168.11.52?-p?11200?-s?192.168.11.51:11211?-s?192.168.11.52:11211?-b?192.168.11.68:11211 |
?
測試流程
?
登錄51上的magent,存儲key1到key5:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [root@mongo01?~]#?telnet?192.168.11.51?11200 Trying?192.168.11.51... Connected?to?192.168.11.51. Escape?character?is?'^]'. stats memcached?agent?v0.4 matrix?1?->?192.168.11.51:11211,?pool?size?0 matrix?2?->?192.168.11.52:11211,?pool?size?0 END set?key1?0?0?1 1 STORED set?key2?0?0?2 22 STORED set?key3?0?0?3 333 STORED set?key4?0?0?4 4444 STORED set?key5?0?0?5 55555 STORED quit Connection?closed?by?foreign?host. |
?
登錄到51上的memcached,獲取到了key2和key4:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [root@mongo01?~]#?telnet?192.168.11.51?11211 Trying?192.168.11.51... Connected?to?192.168.11.51. Escape?character?is?'^]'. get?key1 END get?key2 VALUE?key2?0?2 22 END get?key3 END get?key4 VALUE?key4?0?4 4444 END get?key5 END quit Connection?closed?by?foreign?host. |
?
登錄到52上的memcached,獲取到了key1、key3和key5:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [root@mongo02?~]#?telnet?192.168.11.52?11211 Trying?192.168.11.52... Connected?to?192.168.11.52. Escape?character?is?'^]'. get?key1 VALUE?key1?0?1 1 END get?key2 END get?key3 VALUE?key3?0?3 333 END get?key4 END get?key5 VALUE?key5?0?5 55555 END quit Connection?closed?by?foreign?host. |
?
登錄到68上的memcached,獲取到了key1到key5:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [root@szlnmp01?~]#?telnet?192.168.11.68?11211 Trying?192.168.11.68... Connected?to?192.168.11.68. Escape?character?is?'^]'. get?key1 VALUE?key1?0?1 1 END get?key2 VALUE?key2?0?2 22 END get?key3 VALUE?key3?0?3 333 END get?key4 VALUE?key4?0?4 4444 END get?key5 VALUE?key5?0?5 55555 END quit Connection?closed?by?foreign?host. |
?
停掉52的memcached進程,通過51上的magent獲取到了key1到key5:
| 1 | kill?`cat?/var/run/memcached/memcached.pid` |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [root@mongo01?magent]#?telnet?192.168.11.51?11200 Trying?192.168.11.51... Connected?to?192.168.11.51. Escape?character?is?'^]'. get?key1 VALUE?key1?0?1 1 END get?key2 VALUE?key2?0?2 22 END get?key3 VALUE?key3?0?3 333 END get?key4 VALUE?key4?0?4 4444 END get?key5 VALUE?key5?0?5 55555 END quit Connection?closed?by?foreign?host. |
?
恢復52的memcached進程,通過51上的magent,只獲取到了key2和key4:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [root@mongo01?~]#?telnet?192.168.11.51?11200 Trying?192.168.11.51... Connected?to?192.168.11.51. Escape?character?is?'^]'. get?key1 END get?key2 VALUE?key2?0?2 22 END get?key3 END get?key4 VALUE?key4?0?4 4444 END get?key5 END quit Connection?closed?by?foreign?host. |
?
通過以上測試可以得出結論:
1. 通過magent的連接池存放的值會分別存在magent代理的所有memcached上去。
2. 如果有一個memcached宕機通過magent代理方式還能取到值。
3. 如果memcached修復重啟后通過magent代理方式取到的值就會為Null,這是由于memcache重啟后里邊的值隨著memcache服務的停止就消失了(因為在內存中),但是magent是通過key進行哈希計算分配到某臺機器上的,memcache重啟后會還從這臺機器上取值,所有取到的值就為空。
?
解決辦法:
1. 在每次memcache宕機修復后可以寫一個程序把集群中的其他memcache的所有信息全給拷貝到當前宕機修復后的memcache中。
2. 自己寫代理,當從一個memcached服務上取到的值為Null時再去其他memcached上取值。
?
注意事項:
magent的調用方式同memcached一樣,客戶端可以不用改代碼即可實現切換到magent模式下。
?
緩存與DB的同步
?
比較保險的做法是:查詢的時候從緩存中取,add、updae、delete的時候同時操作緩存與DB。
當然你也可以定時同步緩存與DB的數據,不同的業務應該有不同的選擇。
?
magent-0.6版本相關的錯誤匯總
?
產生如下錯誤: ??
| 1 2 3 4 5 6 | gcc?-Wall?-g?-O2?-I/usr/local/include?-m64?-c?-o?magent.o?magent.c???? magent.c:?In?function?‘writev_list’:???? magent.c:729:?error:?‘SSIZE_MAX’?undeclared?(first?use?in?this?function)???? magent.c:729:?error:?(Each?undeclared?identifier?is?reported?only?once???? magent.c:729:?error:?for?each?function?it?appears?in.)???? make:?***?[magent.o]?Error?1 |
? ?
解決方法: ? ?
在ketama.h文件開頭添加 ? ?
| 1 2 3 | #ifndef?SSIZE_MAX???? #define?SSIZE_MAX?32767???? #endif |
?
再次make ? ?
?
產生如下錯誤: ? ?
| 1 2 3 4 5 6 7 | gcc?-Wall?-g?-O2?-I/usr/local/include?-m64?-c?-o?magent.o?magent.c???? gcc?-Wall?-g?-O2?-I/usr/local/include?-m64?-c?-o?ketama.o?ketama.c???? gcc?-Wall?-g?-O2?-I/usr/local/include?-m64?-o?magent?magent.o?ketama.o????? usr/lib64/libevent.a?/usr/lib64/libm.a????? gcc:?/usr/lib64/libevent.a:?No?such?file?or?directory???? gcc:?/usr/lib64/libm.a:?No?such?file?or?directory???? make:?***?[magent]?Error?1 |
?
解決方法: ? ?
| 1 2 | ln?-s?/usr/lib64/libm.so?/usr/lib64/libm.a???? vi?Makefile |
找到LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a ? ?
按照如下格式修改: ? ?
LIBS = /usr/<libevent的安裝路徑>/libevent.a /usr/lib64/libm.a ? ?
如:LIBS = /usr/lib/libevent.a /usr/lib64/libm.a ? ?
保存 ? ?
?
再次make ? ?
?
產生如下錯誤: ? ?
| 1 2 3 4 5 6 7 | gcc?-Wall?-g?-O2?-I/usr/local/include?-m64?-o?magent?magent.o?ketama.o?/usr/lib/libevent.a?/usr/lib64/libm.a????? /usr/lib/libevent.a(event.o):?In?function?`gettime':???? /tmp/libevent-2.0.22-stable/event.c:370:?undefined?reference?to?`clock_gettime'???? /usr/lib/libevent.a(event.o):?In?function?`detect_monotonic':???? /tmp/libevent-2.0.22-stable/event.c:340:?undefined?reference?to?`clock_gettime'???? collect2:?ld?returned?1?exit?status???? make:?***?[magent]?Error?1 |
?
解決方法: ? ?
| 1 | vi?Makefile |
將 ? ?
| 1 | CFLAGS?=?-Wall?-g?-O2?-I/usr/local/include?$(M64) |
修改為: ? ?
| 1 | CFLAGS?=?-lrt?-Wall?-g?-O2?-I/usr/local/include?$(M64) |
保存 ? ?
?
再次make ? ?
?
輸出為: ? ?
| 1 | gcc?-lrt?-Wall?-g?-O2?-I/usr/local/include?-m64?-o?magent?magent.o?ketama.o?/usr/lib/libevent.a?/usr/lib64/libm.a ? |
轉載于:https://www.cnblogs.com/soundcode/p/7196335.html
總結
以上是生活随笔為你收集整理的Magent搭建Memcached集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 弱类型比较
- 下一篇: 以先开头的成语有哪些?