歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 下 Memcached 緩存服務器安裝配置

Linux 下 Memcached 緩存服務器安裝配置

日期:2017/2/28 16:09:43   编辑:Linux教程

【安裝Memcache服務器端】
我目前的平台,服務器是CentOS 5.4(內核:2.6.164),客戶端是Windows XP SP2,需要安裝的就是服務器的Memcached的守護進程和客戶端的PHP擴展php_memcache兩個東西。現在我分別來講。
服務器端主要是安裝memcache服務器端,目前的最新版本是 memcached-1.2.0

下載:http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
另外,Memcache用到了libevent這個庫用於Socket的處理,所以還需要安裝libevent,libevent的最新版本是libevent-1.2。(如果你的系統已經安裝了libevent,可以不用安裝)
官網:http://www.monkey.org/~provos/libevent/
下載:http://www.monkey.org/~provos/libevent-1.2.tar.gz
我分別把兩個東東下載回來,放到 /tmp 目錄下:
# cd /tmp
# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz
先安裝libevent:
# tar zxvf libevent-1.2.tar.gz
# cd libevent-1.2
# ./configure –prefix=/usr
# make
# make install
然後看看我們的libevent是否安裝成功:
# ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a
-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3
還不錯,都安裝上了,再來安裝memcache,同時需要安裝中指定libevent的安裝位置:
# cd /tmp
# tar zxvf memcached-1.2.0.tar.gz
# cd memcached-1.2.0
# ./configure –with-libevent=/usr
# make
# make install
如果中間出現報錯,請仔細檢查錯誤信息,按照錯誤信息來配置或者增加相應的庫或者路徑。
安裝完成後會把memcached放到 /usr/local/bin/memcached ,我們看以下是否安裝了:
# ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached
-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug
恩,安裝完成了,現在我們看以下memcache的幫助:
# /usr/local/bin/memecached -h
memcached 1.2.0
-p port number to listen on
-s unix socket path to listen on (disables network support)
-l interface to listen on, default is INDRR_ANY
-d run as a daemon
-r maximize core file limit
-u assume identity of (only when run as root)
-m max memory to use for items in megabytes, default is 64 MB
-M return error on memory exhausted (rather than removing items)
-c max simultaneous connections, default is 1024
-k lock down all paged memory
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
-h print this help and exit
-i print memcached and libevent license
-b run a managed instanced (mnemonic: buckets)
-P save PID in , only used with -d option
-f chunk size growth factor, default 1.25
-n minimum space allocated for key+value+flags, default 48
參數不算多,我們來啟動一個Memcache的服務器端:
# /usr/local/bin/memcached -d -m 256 -u root -l 192.168.1.5 -p 11210 -c 256 -P /data/memcached/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,如果要結束Memcache進程,執行:
# kill `cat /tmp/memcached.pid`

也可以啟動多個守護進程,不過端口不能重復。

memcached是一個高性能的分布式的內存對象緩存系統,通過在內存裡維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。最初為了加速 LiveJournal 訪問速度而開發的,後來被很多大型的網站采用。起初作者編寫它可能是為了提高動態網頁應用,為了減輕數據庫檢索的壓力,來做的這個緩存系統。它的緩存是一種分布式的,也就是可以允許不同主機上的多個用戶同時訪問這個緩存系統, 這種方法不僅解決了共享內存只能是單機的弊端, 同時也解決了數據庫檢索的壓力,最大的優點是提高了訪問獲取數據的速度!基於memcached作者對分布式cache的理解和解決方案。memcached完全可以用到其他地方 比如分布式數據庫, 分布式計算等領域。
1、 memcached 協議理解
memcache是為了加快http://www.livejournal.com/訪問速度而誕生的一個項目。
它的官方主頁是:http://www.danga.com/memcached/
目前在網站開發中應用較少,主要的應用有:

http://www.danga.com/memcached/users.bml

在國內的網站開發中,還很少沒見到有應用的,中文資料十分匮乏。
工作機制:通過在內存中開辟一塊區域來維持一個大的hash表來加快頁面訪問速度,和數據庫是獨立的。但是目前主要用來緩存數據庫的數據。允許多個server通過網絡形成一個大的hash,用戶不必關心數據存放在哪,只調用相關接口就可。存放在內存的數據通過LRU算法進行淘汰出內存。同時可以通過刪除和設置失效時間來淘汰存放在內存的數據。
2、 memcached 使用入門
2.1 memcached的安裝
?<1>memcached服務的安裝
先檢查linux內核版本,建議將memcached 安裝在2.6以上。
因為memcached 需要用到libevent和 epoll 。
memcached安裝前首先確定你的服務器上面安裝了libevent庫,
libevent下載地址( http://www.monkey.org/~provos/libevent/)。
下載memcached的源碼( http://www.danga.com/memcached/download.bml)。
Memcached最初是用perl寫的,現在的版本是用c寫的。
下載後拷貝到一個目錄,安裝需要root用戶來執行
tar -zxvf memcached-1.1.12.tar.gz
cd memcached-1.1.12
./configure
這裡必須先要configure, 它會檢測你的系統情況,然後生成一個config.h文件和其它的幾個文件,另外和其它的configure一樣,你可以配置它的安裝路徑等等。默認應用程序安裝在/usr/local/bin目錄下。
make //編譯
make install //安裝
<2>memcached客戶端的安裝
根據memcached協議,用戶可以自己寫出符合自己要求的客戶端程序。目前http://www.danga.com/memcached/download.bml
提供perl,c,java,python,php等客戶端程序供下載和參考。下面我就以perl客戶端程序為例說明客戶端的安裝:
下載後拷貝到一個目錄,安裝需要root用戶來執行
tar -zxvf Cache-Memcached-1.14.tar.gz
cd Cache-Memcached-1.14
perl makefile.pl
make
make install
make test
這樣就安裝好了memcahced, 啟動memcached就可使用分布式緩存系統了!
2.2 快速入門
<1> memcached服務的啟動
memcached的啟動非常簡單,它沒有配置文件,只要配置好幾個參數就可以使用了。下面我以一個實際應用的例子,具體說明一下:
memcached –d –m 500 -l 64.128.191.151 -p 11211 -vv >>/var/www/kelly/test/logs/memcached_$$.log
啟動的這個memcached為一個後台守護進程模式(-d), 然後緩存的空間為500M(-m), 監聽(-l)服務器64.128.191.15的11211號端口(-p).,將日志寫道/var/www/kelly/test/logs/memcached_$$.log(-vv)。
其實memcached的參數也非常的有限,就下面這幾個:
? -p port number to listen on
? -l interface to listen on, default is INDRR_ANY
? -d run as a daemon
? -r maximize core file limit
? -u assume identity of (only when run as root)
? -m max memory to use for items in megabytes, default is 64 MB
? -M return error on memory exhausted (rather than removing items)
? -c max simultaneous connections, default is 1024
? -k lock down all paged memory
? -v verbose (print errors/warnings while in event loop)
? -vv very verbose (also print client commands/reponses)
? -h print this help and exit
? -i print memcached and libevent license
我們也可以將這個啟動腳本寫道/etc/rc.d或者/erc/rc.local,這樣可以在服務器啟動時候執行。
<2> memcached客戶端的連接
下面我就以perl客戶端程序為例說明客戶端的連接:
啟動兩個memcached server
memcached –d –m 500 -l 64.128.191.151 -p 11211 -vv >>/var/www/kelly/test/logs/memcached_$$.log
memcached –d –m 500 -l 64.128.191.151 -p 11212 -vv >>/var/www/kelly/test/logs/memcached_$$.log
perl客戶端程序
#!/usr/bin/perl
use Cache::Memcached;
my $memd = new Cache::Memcached {
‘servers’ => [ "64.128.191.15:11211" , "64.128.191.15:11212"],
};
my $val = $memd->get( “my_key” );
if ( $val )
{
print “Value is ‘$val’\n”;
}
# Set a value
$memd->set(“my_key”, “123″);
$memd->disconnect_all();
?運行測試
$ perl test-memcache.pl
$ perl test-memcache.pl
Value is ’123′
可以看到,第一次沒有取得my_key,第二次從memcached中得到my_key的值。
同時通過查看日志,可以發現的確存儲在兩個memcache server中。
這個簡單的例子,解釋了如何在memcached中存取數據,以及memcache是真正的分布式緩存系統。
當然,這還只是很簡單的例子,體現不出memcache的優勢,下面將通過一個很具體的例子,給出詳細的應用。
3、 memcached在Zorpia的應用
http://www.zorpia.com 是一個網頁相冊,博客,交友,論壇的大型網站公司。現在已有超過140萬活躍使用者遍布美國,香港,東南亞,歐洲,澳洲,亞洲等其它地區。每天的訪問量都在增長,已成為全世界排名第五的社會生活關系網。
Memcached也采用了memcached來提高網站的訪問速度,並且取得了很好的效果,我在負責zorpia的memcached項目時候積累了一些經驗,主要的做法如下:
1) 通過對memcache的perl客戶端進行包裝,定制自己的客戶端。
2) 通過制定符合zorpia規范的hash key命名規范
? ? memcache中需要存儲的內容的key均由string組成。
這個string統一由一個memcache.pm的subroutine來實現。(假設這個subroutine是 get_key() )
? ? memcache中存放兩種形式的數據
(1) result of SQL query :
(2) 普通變量(variable)
這兩種數據的key的組合方式是不相同的,由get_key進行判斷和完成
? ? 關於get_key 和 naming rule
get_key subroutine完成所有memcache key的命名,naming rule也是在它裡邊體現:
(1)輸入參數 -- hash結構,裡邊定義了當前需要存放的數據的信息
結構
(2)返���值 -- string,返回數據的key_name
?必須確定 get_key 的傳入hash的結構,
hash中主要有兩個元素
type — 定義當前數據結構的類型 ,有 ‘var’ , ‘sql’兩種值
object — 存放當前數據結構的詳細信息,
當 type eq ‘var’時,object表示變量的名字,該名字由程序員指定
當 type eq ‘sql’時,object包含所存放sql的主要基本信息,hash結構,也由程序員按照規則制定
## 當variable 數據類型,比較簡單
$var_hash = {
type => ‘var’, ## var表示當前類型是 variable
object => ‘language’, ## language代表variable的名字
};
生成的key是Zorpia::var| language
## sql 數據
比如select first_name from user where user_id =2那麼hash為
$sql_hash = {
type => ‘sql’,
object => {
table => {table2=>”user”,}, ## sql 查詢的表
column => {column1=>”first_name”,}, ## sql所要查詢的column
condition => { user_id =>”2″,}, ## sql條件
},
};
生成的key是Zorpia::sql|user|first_name| user_id =2
get_key subroutine必須對傳入hash進行判斷,對不同類型的數據按照不同的方式組合,形成key,返回給使用者。這個key,必須保證其唯一性:
比如:所有字母小寫,一些數組在組合成key之前必須首先排序
? ? get_key函數
sub get_key{
my $hash = shift;
return undef unless $hash && ref $hash eq “HASH”;
my $type = $hash->{type};
my $key_name;
if ($type eq ‘sql’) {
my ($table_key,$column_key,$condition_key);
$table_key=_get_key($hash->{object}->{table});
$column_key=_get_key($hash->{object}->{column});
$condition_key=_get_key($hash->{object}->{condition});
$key_name = join(‘|’,$type,$table_key,$column_key,$condition_key);
#Currently the length limit of a key is set at 250 characters
if (length($key_name)>250)
{
$key_name=substr(0,250,$key_name);
}
}
elsif($type eq ‘var’)
{
$key_name = join(‘|’,$type,$hash->{object});
}
return $key_name;
}
sub _get_key
{
my $hash=shift;
return undef unless $hash && ref $hash eq “HASH”;
my ($t,$ret,$i);
foreach $i (sort keys %$hash)
{
$i=~s/^\s+|\s+$//g;
$hash->{$i}=~s/^\s+|\s+$//g;
push(@$t,lc(“$i=$hash->{$i}”));
}
$ret=join(‘:’,sort { $a cmp $b } @$t);
return $ret;
}
3) 制定需要應用memcached的規則
?經常訪問的表user,user_details
?合理設定變量在memcached的生存周期
?將活躍用戶的信息預先導入到memcached
?分別在多台機器上啟動多個memcached服務
?編寫腳本監控memcached服務是否活動
4) User表的具體應用舉例
? 在 select時候
先查詢memcahce裡有沒有,有的話,返回;否則從數據庫select,在memcache裡設置,返回。
my $sql_hash = {
type => ‘sql’,
object => {
table => {table1=>”user”,},
column => {column1=>”user_id”,},
condition => {email=>$user_id,},
},
};
my $key=Zorpia::MemCache::get_key($sql_hash);
my $user_id_by_email=Zorpia::MemCache::get($key);
if(!$user_id_by_email)
{
my $sth;
my $query =”select user_id from user where email=?”;
$sth = $dbh->prepare($query);
$sth->execute($user_id);
my $user1 = $sth->fetchrow_hashref();
$user_id_by_email=$user1->{‘user_id’};
Zorpia::MemCache::set($key,$user_id_by_email,1800);
}
?在 update,insert,delete時候
先在數據庫update,insert,delete,在memcache裡設置,返回。
&Zorpia::DB::data_entry_no_return($dbh,”user”,”COUNT(*)”,”$account_information_insert_statement user_id=$current_user_id”, “user_id=$current_user_id”);
#add by kelly
my $sql_hash = {
type => ‘sql’,
object => {
table => {table1=>”user”,},
column => {column1=>”user_id”,},
condition => {user_id=>$current_user_id,},
},
};
my $key=Zorpia::MemCache::get_key($sql_hash);
my $query = “SELECT *, user_id AS id FROM user WHERE user_id=?”;
my $sth_memc = $dbh->prepare($query);
$sth_memc->execute($current_user_id);
my $user_memc = $sth_memc->fetchrow_hashref();
&Zorpia::MemCache::set($key,$user_memc,21600);
4、 memcached的應用展望
使用了memcached以後, 我發現以前做過的很多的項目都可以應用它提高效率,包括最近做的“大單追蹤”, “數碼搜索”等等。當然既然memcahced是分布式的緩存系統,那麼它就是建立了一個分布式的平台, 我們可以用它來進行分布式的記數, 因為對於一個鍵值key我們可以設置它的數值以及有效期在參數中,另外還可以重新設置這個鍵值的數值。 所以我總結了一下目前可以應用到的地方:
<1>.數據庫檢索結果的緩存,也就是說可以有機的和數據庫結合起來應用,提高效率。
這也是目前memcached用到的最多的地方,比如用於大型網站等。
可以這樣來實現:
打開memcached服務器連接
編寫sql語句, 同時算出它的一個hash key值
獲取這個hash值的memcached保存數據(get)
如果獲取的這個hash值的數據存在。返回
否則連接數據庫查找
把這個查找結果保存在memcached中(set),可以設置有效期
返回查找結果
<2>.分布式計算
<3>.分布式共享數據
總之,memcached的機制比較靈活,可以適用於一切需要分布式緩存數據的地方,隨著memcached逐漸為人所知,必將在更多的分布式應用領域大放異彩。

【安裝Memcache服務器端】
我目前的平台,服務器是Fedora Core 1(內核:2.4.22),客戶端是Windows XP SP2,需要安裝的就是服務器的Memcached的守護進程和客戶端的PHP擴展php_memcache兩個東西。現在我分別來講。
服務器端主要是安裝memcache服務器端,目前的最新版本是 memcached-1.2.0 。
下載:http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
另外,Memcache用到了libevent這個庫用於Socket的處理,所以還需要安裝libevent,libevent的最新版本是libevent-1.2。(如果你的系統已經安裝了libevent,可以不用安裝)
官網:http://www.monkey.org/~provos/libevent/
下載:http://www.monkey.org/~provos/libevent-1.2.tar.gz
我分別把兩個東東下載回來,放到 /tmp 目錄下:
# cd /tmp
# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz
先安裝libevent:
# tar zxvf libevent-1.2.tar.gz
# cd libevent-1.2
# ./configure –prefix=/usr
# make
# make install
然後看看我們的libevent是否安裝成功:
# ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a
-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3
還不錯,都安裝上了,再來安裝memcache,同時需要安裝中指定libevent的安裝位置:
# cd /tmp
# tar zxvf memcached-1.2.0.tar.gz
# cd memcached-1.2.0
# ./configure –with-libevent=/usr
# make
# make install
如果中間出現報錯,請仔細檢查錯誤信息,按照錯誤信息來配置或者增加相應的庫或者路徑。
安裝完成後會把memcached放到 /usr/local/bin/memcached ,我們看以下是否安裝了:
# ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached
-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug
恩,安裝完成了,現在我們看以下memcache的幫助:
# /usr/local/bin/memecached -h
memcached 1.2.0
-p port number to listen on
-s unix socket path to listen on (disables network support)
-l interface to listen on, default is INDRR_ANY
-d run as a daemon
-r maximize core file limit
-u assume identity of (only when run as root)
-m max memory to use for items in megabytes, default is 64 MB
-M return error on memory exhausted (rather than removing items)
-c max simultaneous connections, default is 1024
-k lock down all paged memory
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
-h print this help and exit
-i print memcached and libevent license
-b run a managed instanced (mnemonic: buckets)
-P save PID in , only used with -d option
-f chunk size growth factor, default 1.25
-n minimum space allocated for key+value+flags, default 48
參數不算多,我們來啟動一個Memcache的服務器端:
# /usr/local/bin/memcached -d -m 256 -u root -l 192.168.1.5 -p 11210 -c 256 -P /data/memcached/memcached.pid
開機時自動開啟memcached:/etc/rc.d文件夾下的rc.local文件中加入
/usr/local/bin/memcached -d -m 256 -u root -l 192.168.1.6 -p 11210 -c 256 -P /data/memcached/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,如果要結束Memcache進程,執行:
# kill `cat /tmp/memcached.pid`

也可以啟動多個守護進程,不過端口不能重復。

Copyright © Linux教程網 All Rights Reserved