Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。但是它並不提供冗余(例如,復制其hashmap條目);當某個服務器S停止運行或崩潰了,所有存放在S上的鍵/值對都將丟失。
說簡單一點memcached就是維護著一個位於內存中的大map。它利用RAM的隨機訪問優勢(內存的讀寫速度要比磁盤的讀寫速度快得多,前者是後者的10的6次方倍),將某個對象通過特定的索引值存儲,當需要這個對象的時候通過這個索引值可以立即找出來。索引值在整個內存緩沖系統中是唯一的,也同時對應唯一的一個對象。這樣在涉及查詢數據的操作時加入這樣一種機制即可起到加快訪問速度的效果。
閒話少敘,下面介紹memcached在Linux x86_64環境中的編譯過程。
工作機器各項參數如下:
CPU:Intel Xeon 5110
內存:DDR2 1G*4
主機型號:ProLiant DL140 G3
操作系統:Red Hat Enterprise Linux Server release 5.4 x86_64版
內核版本:2.6.18
gcc版本:4.1.2
g++版本:4.1.2
1.下載memcached源碼包
訪問memcached官方網站http://memcached.org可以下載到最新最穩定版本的memcached源碼包
下載完成後將其解壓
- [root@ www.linuxidc.com ~]# cd Download
- [root@ www.linuxidc.com Download]# ll
- total 312
- -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
- [root@ www.linuxidc.com Download]# tar -xf memcached-1.4.10.tar.gz
- [root@ www.linuxidc.com Download]# ll
- total 316
- drwxr-xr-x 6 1000 1000 4096 Nov 10 08:32 memcached-1.4.10
- -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
2.嘗試配置memcached編譯
進入memcached解壓後的目錄後,執行./configure命令來檢測當前系統環境並生成makefile
- [root@ www.linuxidc.com Download]# cd memcached-1.4.10
- [root@ www.linuxidc.com memcached-1.4.10]# ./configure
如果在執行之後發現最後一行有如下提示表明缺少libevent庫:
- checking for libevent directory... configure: error: libevent is required. You can get it from http://www.monkey.org/~provos/libevent/
-
- If it's already installed, specify its path using --with-libevent=/dir/
-
- [root@ www.linuxidc.com memcached-1.4.10]#
這是在編譯memcached過程中經常遇到的問題(memcached基於libevent的事件處理機制。libevent是個程序庫,它將Linux的epoll、BSD類操作系統的kqueue等事件處理功能封裝成統一的接口。即使服務器的連接數增加,也能發揮時間復雜度O(1)的性能。 memcached使用這個libevent庫,因此能在Linux、BSD、Solaris等操作系統上發揮其高性能。)。這時就要安裝libevent庫了。在libevent官方網站http://libevent.org中可以下載到最新最穩定版源代碼:
同樣需要解壓並進入解壓後的源碼包目錄:
- [root@ www.linuxidc.com Download]# ll
- total 1140
- -rw-r--r-- 1 root root 837650 Nov 20 17:16 libevent-2.0.16-stable.tar.gz
- drwxr-xr-x 6 1000 1000 4096 Nov 20 17:03 memcached-1.4.10
- -rw-r--r-- 1 root root 311926 Nov 20 16:51 memcached-1.4.10.tar.gz
- [root@ www.linuxidc.com Download]# tar -xf libevent-2.0.16-stable.tar.gz
- [root@ www.linuxidc.com Download]# cd libevent-2.0.16-stable
接下來要配置libevent庫的編譯了。這裡的配置需要注意添加--prefix參數,這個參數要指定編譯完成後,如果安裝此庫,庫安裝到哪裡。默認值是/usr/local。如果保持默認值,會將庫安裝到/usr/local/lib目錄中。多數Linux發行版默認的加載庫路徑都不包含此路徑。為了避免麻煩,這裡指定--prefix=/usr。這樣編譯後安裝就會安裝到/usr/lib目錄中了。這個目錄是多數Linux發行版默認的加載庫路徑。
執行配置腳本:
- [root@ www.linuxidc.com libevent-2.0.16-stable]# ./configure --prefix=/usr
如果你在配置時忘了加這個參數,不要緊,後面還有解決辦法,接著往下看。
配置好之後就可以編譯了:
- [root@ www.linuxidc.com libevent-2.0.16-stable]# make
編譯好之後就是用root權限安裝:
- [root@ www.linuxidc.com libevent-2.0.16-stable]# sudo make install
3.正式編譯memcached
剛剛介紹的是遇到了一個小麻煩時的解決辦法,現在已經不存在libevent庫缺失的問題了,如果你遇到了libevent庫缺失的問題,此時需要回到memcached源碼包目錄,再次執行一次編譯配置腳本:
- [root@ www.linuxidc.com memcached-1.4.10]# ./configure
不添加參數直接執行編譯配置腳本,在安裝時將自動安裝到/usr/local/bin目錄中。如果要更改安裝位置,可以添加參數--prefix。例如--prefix=/usr/local/memcached,則安裝時將安裝到/usr/local/memcached/bin中。
檢查沒問題,可以開始編譯了:
- [root@ www.linuxidc.com memcached-1.4.10]# make
編譯完成後進行安裝
- [root@ www.linuxidc.com memcached-1.4.10]# sudo make install
然後去看一看是否已經安裝(memcached默認安裝目錄為/usr/local/bin)。轉到memcached目錄,然後啟動memcached加參數-h顯示幫助。幫助第一行即當前memcached版本:
- [root@ www.linuxidc.com memcached-1.4.10]# cd /usr/local/bin/
- [root@ www.linuxidc.com bin]# sudo ./memcached -h
- ./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
- [root@ www.linuxidc.com bin]#
如果之前的libevent編譯時加了--prefix=/usr參數,此時執行應該是正常的,會顯示幫助信息。我剛才編譯libevent庫的時候故意沒有加此參數,因此memcached到這一步的時候就會出現上面的問題——無法加載共享庫libevent-2.0.so.5。如果你也遇到了這樣的問題,接著往下看:
在多數linux發行版中,程序啟動後靜態加載的庫默認查找路徑為/lib(64位系統還有/lib64)和/usr/lib(64位系統中還有/usr/lib64),而目前我們編譯的libevent庫安裝路徑不在這些默認庫加載路徑中,因此需要配置庫加載路徑:
先通過ldd命令看一看memcached都需要加載哪些庫:
- [root@ www.linuxidc.com bin]# ldd memcached
- libevent-2.0.so.5 => not found
- librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
- libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
- libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
- /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
- [root@ www.linuxidc.com bin]#
此時看到結果第一行:libevent-2.0.so.5 => not found,正是缺少的庫,該庫無法找到。
那這個庫在哪裡呢?我們來問一下系統:
- [root@ www.linuxidc.com bin]# whereis libevent-2.0.so.5
- libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5
- [root@ www.linuxidc.com bin]#
它告訴我們,libevent-2.0.so.5庫存放在/usr/local/lib目錄中。因此我們把這個目錄加入到系統默認的庫加載路徑中。這裡要修改系統環境變量$LD_LIBRARY_PATH。
先看一下當前$LD_LIBRARY_PATH的值:
- [root@ www.linuxidc.com bin]# echo $LD_LIBRARY_PATH
-
- [root@ www.linuxidc.com bin]#
當前值為空,說明目前庫加載路徑還是上文提到的/lib(64位系統還有/lib64)和/usr/lib(64位系統中還有/usr/lib64)。接下來使用root權限修改/etc/profile文件,在文件末尾追加一行:
- export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
然後保存,更新一下系統配置:
- [root@ www.linuxidc.com bin]# source /etc/profile
再查看一下默認加載庫路徑:
- [root@ www.linuxidc.com ~]# cd /etc/
- [root@ www.linuxidc.com etc]# source profile
- [root@ www.linuxidc.com etc]# echo $LD_LIBRARY_PATH
- /usr/local/lib:
- [root@ www.linuxidc.com etc]#
libevent庫所在的目錄已經添到了系統默認庫加載路徑中了,再次使用ldd命令查看memcached是否能夠完全加載所需的庫:
- [root@ www.linuxidc.com etc]# cd /usr/local/bin/
- [root@ www.linuxidc.com bin]# ls
- dialyzer erl escript memcached run_test typer
- epmd erlc event_rpcgen.py run_erl to_erl
- [root@ www.linuxidc.com bin]# ldd memcached
- libevent-2.0.so.5 => /usr/local/lib/libevent-2.0.so.5 (0x00002b52aedd1000)
- librt.so.1 => /lib64/librt.so.1 (0x0000003714400000)
- libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003712800000)
- libc.so.6 => /lib64/libc.so.6 (0x0000003711c00000)
- /lib64/ld-linux-x86-64.so.2 (0x0000003711800000)
- [root@ www.linuxidc.com bin]#
已經都能找到了,看一下版本信息:
- [root@ www.linuxidc.com bin]# ./memcached -h
- memcached 1.4.10
- -p <num> TCP port number to listen on (default: 11211)
- -U <num> UDP port number to listen on (default: 11211, 0 is off)
已經沒有問題了。
至此memcached的編譯安裝完成。