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客戶端
- Spymemcached
下載地址http://code.google.com/p/spymemcached/downloads/list也可以從maven中直接下載 - 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 |
參考資料
- http://code.google.com/p/xmemcached/wiki/User_Guide
- http://code.google.com/p/hibernate-memcached/wiki/Configuration
memcached-session-manager介紹
memcached-session-manager(簡稱msm)是結合memcached實現的Tomcat session共享解決方案,目前只支援Tomcat6、Tomcat7,是通過Tomcat容器的Manager實現多臺tomcat的session共享,解決了在叢集環境下session複製問題。
另外還有人制作了jboss6的版本,可從http://vdisk.weibo.com/s/295xp下載
環境
- Linux 環境
- Tomcat7.X (3臺),在同一臺機器上啟動三臺Tomcat需要修改conf/server.xml中的三個埠:8080,8005,8009
- MemBase (1臺),也可採用memcached,使用方法一樣,只是在java客戶端連線時有不同。
- nginx
準備的jar包
注意:不同的tomcat版本(tomcat6,tomcat7)所需的包不一樣,需要針對tomcat版本下載對應的包.
-
這是採用的最新穩定版1.6.1,序列化方式使用的是kryo,注意版本要求與msm版本基本一致,建議統一採用最新穩定版,如下。其中序列化方式是可選的。
-
這是採用的javolution的序列化方式所有需要的包
建議採用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
配置
- 將上面所提到的包全部拷貝到tomcat的lib下(三臺tomcat都需要)
- 修改每臺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配置成功。
- 最後附上nginx配置:
修改配置檔案nginx\conf\nginx.conf
- 找到內容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;
}
- 找到
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秒轉發到另外一臺伺服器)
}
- 找到
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配置成功。