1. 程式人生 > >Memcached安裝及配置

Memcached安裝及配置

文章目錄

準備

從http://memcached.org/下載最新版的memcached(memcached-1.4.15.tar.gz)
wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz

從http://libevent.org/下載最新版的libevent(libevent-2.0.21-stable.tar.gz)
wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz

從http://ftp.free.org/mirrors/ftp.freebsd.org/ports/local-distfiles/swills/
下載memcached-replication(實現主備同步)
wget http://ftp.free.org/mirrors/ftp.freebsd.org/ports/local-distfiles/swills/repcached-2.3.1-1.4.15.patch.gz

將下載好的memcached、libevent、memcached-replication傳到linux伺服器上

安裝

安裝libevent

wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar
xzf libevent-2.0.21-stable.tar.gz cd libevent-2.0.21-stable ./configure --prefix=/usr make make install ldconfig cd ..

測試libevent是否安裝成功:

ls -al /usr/lib | grep libevent

libevent 安裝完畢

安裝memcached

wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
tar xzf  memcached-1.4.13.tar.gz
cd memcached-1.4.13
./configure --with-libevent=/usr
make
make install
cd ..

測試是否成功安裝memcached:

ls -al /usr/local/bin/mem*

memcache安裝完畢

安裝memcached-replication

wget http://ftp.free.org/mirrors/ftp.freebsd.org/ports/local-distfiles/swills/repcached-2.3.1-1.4.13.patch.gz
 
cd memcached-1.4.13
gzip -cd ../repcached-2.3.1-1.4.13.patch.gz | patch -p1 
#(注意這一步要在已有的memcached根目錄下進行,repcached-2.3.1-1.4.13.patch.gz的位置在memcached根目錄的上一層)
# 注:如果提示(bash: patch: command not found)執行命令(centos/redhat: yum install patch)
./configure --enable-replication --with-libevent=/usr
make
make install

注:該版本的replication有個BUG,builder.setCommandFactory(new BinaryCommandFactory());時無法同步,所以還是使用預設的

解除安裝方法

make uninstall

注: 如在安裝memcached-replication時出現如下錯誤,請安如下設定
error: `IOV_MAX’ undeclared (first use in this function)
【原因】 memcache.c 對該系統 red hat enterprise 5 server 的偵測錯誤,導致巨集 IOV_MAX 未定義
【解決方法】 手動修改檔案 memcache.c,定義 IOV_MAX
【實施步驟】 用vi開啟memcache.c 檔案,註釋掉57及59行,修改結果如下

57 //#if defined(__FreeBSD__) || defined(__APPLE__)
58 # define IOV_MAX 1024
59 //#endif

啟動

master memcached

/usr/local/bin/memcached -d -p 11211 -u nobody -c 256 -m 256 -x 127.0.0.1 -X 11212

slave memcached

/usr/local/bin/memcached -d -p 11213 -u nobody -c 256 -m 256 -x 127.0.0.1 -X 11212

注: repcached只做同步,具體哪個是主,哪個是備,需要在客戶端設定

檢視幫助:

/usr/local/bin/memcached -h

-d 以守護(daemon)程式方式執行memcached
-l 設定監聽的ip地址,如果是本機,通常不設定
-p 設定監聽埠,預設為11211 通常不設定
-m 設定記憶體大小 單位 M
-u 指定使用者。當前使用者為root時,可以指定使用者。(不能以root使用者許可權啟動)
-vv 用very vrebose模式啟動,除錯資訊和錯誤輸出到控制檯

還有很多命令可以用 memcached –h 來檢視

-p 監聽的埠
-l 連線的IP地址, 預設是本機
-d start 啟動memcached服務
-d restart 重起memcached服務
-d stop|shutdown 關閉正在執行的memcached服務
-d install 安裝memcached服務
-d uninstall 解除安裝memcached服務
-u 以的身份執行 (僅在以root執行的時候有效)
-m 最大記憶體使用,單位MB。預設64MB
-M 記憶體耗盡時返回錯誤,而不是刪除項
-c 最大同時連線數,預設是1024
-f 塊大小增長因子,預設是1.25
-n 最小分配空間,key+value+flags預設是48
-h 顯示幫助

測試

telnet  server  port

基本 memcached 客戶機命令

您將使用五種基本 memcached 命令執行最簡單的操作。這些命令和操作包括:

  • set
  • add
  • replace
  • get
  • delete

前三個命令是用於操作儲存在 memcached 中的鍵值對的標準修改命令。它們都非常簡單易用,且都使用以下語法:

command <key> <flags> <expiration time> <bytes> <value>

memcached 修改命令引數

引數 用法
key key 用於查詢快取值
flags 可以包括鍵值對的整型引數,客戶機使用它儲存關於鍵值對的額外資訊
expiration time 在快取中儲存鍵值對的時間長度(以秒為單位,0 表示永遠)
bytes 在快取中儲存的位元組點
value 儲存的值(始終位於第二行)

快取管理命令

  • stats顯示了關於當前 memcached 例項的資訊
  • flush_all用於清理快取中的所有名稱/值

參考資料

https://www.ibm.com/developerworks/cn/java/j-memcached1
http://blog.163.com/lgh_2002/blog/static/44017526201282410131261/

java客戶端

  1. Spymemcached
    下載地址http://code.google.com/p/spymemcached/downloads/list也可以從maven中直接下載
  2. xmemcached
    下載地址http://code.google.com/p/xmemcached/downloads/list也可以從maven中直接下載

以上介紹的兩種java客戶端是目前較為優秀的,具體使用哪種根據自己喜好。我在本次整合中使用的是xmemcached

與hibernate整合

從http://code.google.com/p/hibernate-memcached/ 下載hibernate-memcached。該專案預設與spymemcahed整合,Xmemcached在它的基礎上做了擴充套件

配置如下屬性

hibernate.cache.provider_class com.googlecode.hibernate.memcached.MemcachedCacheProvider
hibernate.cache.use_query_cache true
hibernate.cache.use_second_level_cache true
hibernate.memcached. memcacheClientFactory net.rubyeye.xmemcached.utils.hibernate.XmemcachedClientFactory
hibernate.memcached .servers localhost:11211 localhost:11212
hibernate.memcached.cacheTimeSeconds 300

注:XmemcachedClientFactory預設只支援多節點叢集,不支援主備模式。可擴充套件該類,重寫createMemcacheClient方法,採用AddrUtil.getAddressMap(getServerList())獲取伺服器地址就可以

還有如下可選屬性

hibernate.memcached.keyStrategy HashCodeKeyStrategy
hibernate.memcached.readBufferSize DEFAULT_SESSION_READ_BUFF_SIZE
hibernate.memcached.operationTimeout DEFAULT_OP_TIMEOUT
hibernate.memcached.hashAlgorithm NATIVE_HASH,KETAMA_HASH etc.
hibernate.memcached.commandFactory TextCommandFactory , BinaryCommandFactory
hiberante.memcached.sessionLocator ArrayMemcachedSessionLocator,KetamaMemcachedSessionLocator

參考資料

memcached-session-manager介紹

memcached-session-manager(簡稱msm)是結合memcached實現的Tomcat session共享解決方案,目前只支援Tomcat6、Tomcat7,是通過Tomcat容器的Manager實現多臺tomcat的session共享,解決了在叢集環境下session複製問題。
另外還有人制作了jboss6的版本,可從http://vdisk.weibo.com/s/295xp下載

環境

  1. Linux 環境
  2. Tomcat7.X (3臺),在同一臺機器上啟動三臺Tomcat需要修改conf/server.xml中的三個埠:8080,8005,8009
  3. MemBase (1臺),也可採用memcached,使用方法一樣,只是在java客戶端連線時有不同。
  4. nginx

準備的jar包

注意:不同的tomcat版本(tomcat6,tomcat7)所需的包不一樣,需要針對tomcat版本下載對應的包.

  1. 這是採用的最新穩定版1.6.1,序列化方式使用的是kryo,注意版本要求與msm版本基本一致,建議統一採用最新穩定版,如下。其中序列化方式是可選的。
    kryo序列化配置msm

  2. 這是採用的javolution的序列化方式所有需要的包
    javalution序列化配置msm

建議採用kryo序列化方式,效率更高

注:
如果使用de.javakaffee.web.msm.JavaSerializationTranscoderFactory序列化,只需引入以下3個包即可:
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
spymemcached-2.8.12.jar

配置

  1. 將上面所提到的包全部拷貝到tomcat的lib下(三臺tomcat都需要)
  2. 修改每臺tomcat的conf目錄下得context.xml檔案或者server.xml檔案,在其中加入如下任意一段程式碼:

A:使用預設的sticky session,kryo序列化方式,memcached快取(建議使用sticky session方式)

<Context>  
  ...  
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"  
    failoverNodes="n1"  
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
    />  
</Context>  

B:使用non-sticky session

<Context>  
  
  ...  
  
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
 memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"  
    sticky="false"  
    sessionBackupAsync="false"  
    lockingMode="uriPattern:/path1|/path2"  
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
    />  
  
</Context>  

C:使用membase

<Context>  
  
  ...  
  
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
    memcachedNodes="http://host1.yourdomain.com:8091/pools"  
    username="bucket1"  
    password="topsecret"  
    memcachedProtocol="binary"  
    sticky="false"  
    sessionBackupAsync="false"  
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
    />
 
</Context>

當使用javolution序列化方式時將:

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory”   

替換為:

transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"   

配置完成後,分別啟動tomcat,正常啟動說明msm配置成功。

  1. 最後附上nginx配置:

修改配置檔案nginx\conf\nginx.conf

  1. 找到內容server {

在它的上面加入如下內容:

upstream  10.6.53.120 {  
ip_hash;  ----#ip_hash策略將同一IP的所有請求都轉發到同一應用伺服器  
server   10.6.53.120:8080;---------我的tomcat埠號  
server   10.6.53.120:7080;  
server   10.6.53.120:6080;  
}
  1. 找到
location / {  
root   html;  
index  index.html index.htm;  
}  

把內容更改如下:

location / {  
proxy_pass http://10.6.53.120  
proxy_redirect default;  
proxy_connect_timeout 10; #(跟代理伺服器連線的超時時間,必須留意這個time out時間不能超過10秒.當一臺伺服器當掉時,過10秒轉發到另外一臺伺服器)  
}   
  1. 找到
server {  
listen       80;  
server_name  localhost;  

把內容改成如下:

server {  
listen       80;  
server_name  10.6.53.120;  

(這是監聽訪問域名繫結那臺伺服器80埠的請求)
到這裡所有的配置已經完成,現在準備一個簡單的web工程,並分別部署到三臺tomcat下。啟動memcached(membase),啟動三臺tomcat,啟動nginx,然後在位址列輸入url地址,看能否成功訪問。關閉其中一臺tomcat,看是否仍然能夠正常訪問,能夠則說明配置nginx配置成功。

參考資料