Memcache安裝

開發中用到了memcache做緩存,但是公司提供的測試地址掛了,所以找資料在我們自己的測試機安裝memcache,找到一篇很好的文字,轉過來備忘。


原帖地址:http://snowolf.iteye.com/blog/1447348


一、下載 

1.Libevent 
簡單的說就是一個事件觸發的網絡庫,Memcached離不開它。 
Shell代碼  收藏代碼
  1. wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.17-stable.tar.gz  

2.Memcached 
今天的主角 
Shell代碼  收藏代碼
  1. wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz  

二、安裝 
1.Libevent 
解壓縮 
Shell代碼  收藏代碼
  1. tar zxvf libevent-2.0.17-stable.tar.gz  

編譯、安裝 
Shell代碼  收藏代碼
  1. ./configure --prefix=/usr && make && make install   

這裏一定要注意指定--prefix,後面配置memcached的時候就有必要用到。 
2.Memcached 
解壓 
Shell代碼  收藏代碼
  1. tar zxvf memcached-1.4.13.tar.gz  

編譯、安裝 
Shell代碼  收藏代碼
  1. ./configure --with-libevent=/usr/lib && make && make install  

這裏一定要指定libevent的路徑,否則啓動的時候就有找不到libevent的so文件的錯誤! 
啓動 
Shell代碼  收藏代碼
  1. memcached -d -m 512 -p 11211 -u root -c 256 -P /var/run/memcached.pid  

參數 
引用

-p <num>      TCP port number to listen on (default: 11211) 
-U <num>      UDP port number to listen on (default: 11211, 0 is off) 
-l <addr>     interface to listen on (default: INADDR_ANY, all addresses) 
              <addr> may be specified as host:port. If you don't specify 
              a port number, the value you specified with -p or -U is 
              used. You may specify multiple addresses separated by comma 
              or by using -l multiple times 
-d            run as a daemon 
-u <username> assume identity of <username> (only when run as root) 
-m <num>      max memory to use for items in megabytes (default: 64 MB) 
-M            return error on memory exhausted (rather than removing items) 
-c <num>      max simultaneous connections (default: 1024) 
-v            verbose (print errors/warnings while in event loop) 
-P <file>     save PID in <file>, only used with -d option 

要關掉memcached 
Shell代碼  收藏代碼
  1. kill -9 `cat /var/run/memcached.pid`    

是否正常?Telnet上去看看 
Shell代碼  收藏代碼
  1. telnet xxx.xxx.xxx.xxx 11211  

然後輸入
Shell代碼  收藏代碼
  1. stats  

接着就能看到: 
引用

STAT pid 3021 
STAT uptime 3621 
STAT time 1331261509 
STAT version 1.4.13 
STAT libevent 2.0.17-stable 
STAT pointer_size 64 
STAT rusage_user 0.000000 
STAT rusage_system 0.000999 
STAT curr_connections 6 
STAT total_connections 7 
STAT connection_structures 7 
STAT reserved_fds 20 
STAT cmd_get 0 
STAT cmd_set 0 
STAT cmd_flush 0 
STAT cmd_touch 0 
STAT get_hits 0 
STAT get_misses 0 
STAT delete_misses 0 
STAT delete_hits 0 
STAT incr_misses 0 
STAT incr_hits 0 
STAT decr_misses 0 
STAT decr_hits 0 
STAT cas_misses 0 
STAT cas_hits 0 
STAT cas_badval 0 
STAT touch_hits 0 
STAT touch_misses 0 
STAT auth_cmds 0 
STAT auth_errors 0 
STAT bytes_read 72 
STAT bytes_written 1038 
STAT limit_maxbytes 52428800 
STAT accepting_conns 1 
STAT listen_disabled_num 0 
STAT threads 4 
STAT conn_yields 0 
STAT hash_power_level 16 
STAT hash_bytes 524288 
STAT hash_is_expanding 0 
STAT expired_unfetched 0 
STAT evicted_unfetched 0 
STAT bytes 0 
STAT curr_items 0 
STAT total_items 0 
STAT evictions 0 
STAT reclaimed 0 
END 

上面狀況說明Memcached服務正常。 
還可以試試get、set、delete、replace 
引用
set foo 0 0 3     (保存命令) 
bar               (數據) 
STORED            (結果) 
get foo           (取得命令) 
VALUE foo 0 3     (數據) 
bar               (數據)


輸入
Shell代碼  收藏代碼
  1. quit  
退出。 

三、系統服務 
參照Nginx的系統服務,自己寫了一個Memcached的系統服務腳本。 
先構建/etc/init.d/memcahed這個文件,然後賦予其可執行權限: 
Shell代碼  收藏代碼
  1. touch /etc/init.d/memcached  
  2. chmod +x /etc/init.d/memcached  

memcached腳本如下: 
Shell代碼  收藏代碼
  1. #!/bin/bash  
  2. # v.0.0.1  
  3. # create by snowolf at 2012.5.25  
  4. #  
  5. # memcached  - This shell script takes care of starting and stopping memcached.  
  6. #  
  7. # chkconfig: - 90 10  
  8. # description: Memcache provides fast memory based storage.  
  9. # processname: memcached  
  10.   
  11. memcached_path="/usr/local/bin/memcached"  
  12. memcached_pid="/var/run/memcached.pid"  
  13. memcached_memory="1024"  
  14.   
  15. # Source function library.  
  16. . /etc/rc.d/init.d/functions  
  17.   
  18. [ -x $memcached_path ] || exit 0  
  19.   
  20. RETVAL=0  
  21. prog="memcached"  
  22.   
  23. # Start daemons.  
  24. start() {  
  25.     if [ -e $memcached_pid -a ! -z $memcached_pid ];then  
  26.         echo $prog" already running...."  
  27.         exit 1  
  28.     fi  
  29.   
  30.     echo -n $"Starting $prog "  
  31.     # Single instance for all caches  
  32.     $memcached_path -m $memcached_memory -l 0.0.0.0 -p 11211 -u root -d -P $memcached_pid  
  33.     RETVAL=$?  
  34.     [ $RETVAL -eq 0 ] && {  
  35.         touch /var/lock/subsys/$prog  
  36.         success $"$prog"  
  37.     }  
  38.     echo  
  39.     return $RETVAL  
  40. }  
  41.   
  42.   
  43. # Stop daemons.  
  44. stop() {  
  45.     echo -n $"Stopping $prog "  
  46.     killproc -d 10 $memcached_path  
  47.     echo  
  48.     [ $RETVAL = 0 ] && rm -f $memcached_pid /var/lock/subsys/$prog  
  49.   
  50.     RETVAL=$?  
  51.     return $RETVAL  
  52. }  
  53.   
  54. # See how we were called.  
  55. case "$1" in  
  56.         start)  
  57.             start  
  58.             ;;  
  59.         stop)  
  60.             stop  
  61.             ;;  
  62.         status)  
  63.             status $prog  
  64.             RETVAL=$?  
  65.             ;;  
  66.         restart)  
  67.             stop  
  68.             start  
  69.             ;;  
  70.         *)  
  71.             echo $"Usage: $0 {start|stop|status|restart}"  
  72.             exit 1  
  73. esac  
  74. exit $RETVAL  

注意這幾行配置,請根據實際情況配置memcached執行文件路徑,以及Memcached使用內存大小: 
引用
memcached_path="/usr/local/bin/memcached" 
memcached_memory="1024"


追加爲系統服務: 
Shell代碼  收藏代碼
  1. chkconfig --add memcached  
  2. chkconfig memcached on  


然後就可以通過service memcached start|stop|status|restart控制memcached了! 

四、常規錯誤 
一開始沒有指定libevent路徑安裝memcached的時候,啓動memcached就報這個錯誤: 
引用
memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory 

其實這個文件就在/usr/lib下。錯就錯在Linux是64bit系統,如果沒有指定libevent路徑,memcached就會去/usr/lib64下去找。 
找到這個文件 
Shell代碼  收藏代碼
  1. whereis libevent-2.0.so.5  

引用
libevent-2.0.so: /usr/lib/libevent-2.0.so.5

Shell代碼  收藏代碼
  1. ldd /usr/local/bin/memcached  

提示找不到libevent-2.0.so.5 
引用
        linux-vdso.so.1 =>  (0x00007fff41dfd000) 
        libevent-2.0.so.5 => not found 
        librt.so.1 => /lib64/librt.so.1 (0x0000003c94a00000) 
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c93a00000) 
        libc.so.6 => /lib64/libc.so.6 (0x0000003c92e00000) 
        /lib64/ld-linux-x86-64.so.2 (0x0000003c92a00000)

定位 
Shell代碼  收藏代碼
  1. LD_DEBUG=libs /usr/local/bin/memcached -v  

引用
     19905:     find library=libevent-2.0.so.5 [0]; searching 
     19905:      search path=/usr/lib/lib/tls/x86_64:/usr/lib/lib/tls:/usr/lib/lib/x86_64:/usr/lib/lib          (RPATH from file /usr/local/bin/memcached) 
     19905:       trying file=/usr/lib/lib/tls/x86_64/libevent-2.0.so.5 
     19905:       trying file=/usr/lib/lib/tls/libevent-2.0.so.5 
     19905:       trying file=/usr/lib/lib/x86_64/libevent-2.0.so.5 
     19905:       trying file=/usr/lib/lib/libevent-2.0.so.5 
     19905:      search cache=/etc/ld.so.cache 
     19905:      search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64            (system search path) 
     19905:       trying file=/lib64/tls/x86_64/libevent-2.0.so.5 
     19905:       trying file=/lib64/tls/libevent-2.0.so.5 
     19905:       trying file=/lib64/x86_64/libevent-2.0.so.5 
     19905:       trying file=/lib64/libevent-2.0.so.5 
     19905:       trying file=/usr/lib64/tls/x86_64/libevent-2.0.so.5 
     19905:       trying file=/usr/lib64/tls/libevent-2.0.so.5 
     19905:       trying file=/usr/lib64/x86_64/libevent-2.0.so.5 
     19905:       trying file=/usr/lib64/libevent-2.0.so.5 
     19905: 
/usr/local/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory 

注意這句: 
引用
19905: trying file=/usr/lib64/libevent-2.0.so.5


做個軟連接 
Shell代碼  收藏代碼
  1. ln -s /usr/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5  

再試試: 
Shell代碼  收藏代碼
  1. ldd /usr/local/bin/memcached  

這回找到了! 
引用
        linux-vdso.so.1 =>  (0x00007fffffef6000) 
        libevent-2.0.so.5 => /usr/lib64/libevent-2.0.so.5 (0x00002b5608a26000) 
        librt.so.1 => /lib64/librt.so.1 (0x0000003c94a00000) 
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c93a00000) 
        libc.so.6 => /lib64/libc.so.6 (0x0000003c92e00000) 
        /lib64/ld-linux-x86-64.so.2 (0x0000003c92a00000)


五、監控 
可以在服務器上配置一個PHP頁面來監測Memcached的情況, 
下載MemcachePHP 



配置也比較簡單,主要包括賬戶配置,以及Memcached Server地址配置。 
Php代碼  收藏代碼
  1. define('ADMIN_USERNAME','memcache');    // Admin Username  
  2. define('ADMIN_PASSWORD','password');    // Admin Password  
  3. define('DATE_FORMAT','Y/m/d H:i:s');  
  4. define('GRAPH_SIZE',200);  
  5. define('MAX_ITEM_DUMP',50);  
  6.   
  7. $MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'// add more as an array  
  8. $MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'// add more as an array  


常見錯誤: 
引用
Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /home/usr/local/apache.../memcache.php on line 726 

在memcache.php頂端加上“date_default_timezone_set('Asia/Hong_Kong');”即可,具體地域設置參考:http://www.php.net/manual/zh/datetime.configuration.php#ini.date.timezone 

如果不方便搭建PHP服務,可以使用Perl腳本memcache-top 
修改@default_instances或使用--instances參數: 
Shell代碼  收藏代碼
  1. perl memcache-top-v0.6 --instances 10.11.155.26 10.11.155.41  


 

先到這裏,後續做壓力測試,Java客戶端開發,Spring系統集成等。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章