Memcached在企業中的應用

Memcached簡介

Memcached是一個自由開源的,高性能,分佈式內存對象緩存系統。php

Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric爲首開發的一款軟件。如今已成爲mixi、hatena、Facebook、Vox、LiveJournal等衆多服務中提升Web應用擴展性的重要因素。html

Memcached是一種基於內存的key-value存儲,用來存儲小塊的任意數據(字符串、對象)。這些數據能夠是數據庫調用、API調用或者是頁面渲染的結果。前端

Memcached簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大數據量緩存的不少問題。它的API兼容大部分流行的開發語言。nginx

本質上,它是一個簡潔的key-value存儲系統。程序員

通常的使用目的是,經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度、提升可擴展性。web

特徵

memcached做爲高速運行的分佈式緩存服務器,具備如下的特色。算法

  • 協議簡單
  • 基於libevent的事件處理
  • 內置內存存儲方式
  • memcached不互相通訊的分佈式

Memcached在企業中架構應用的位置

第一個做爲數據庫的內容緩存
第二個做爲集羣節點會話共享
那麼架構上講能夠分爲三層前端用戶層 中間應用程序層,後面就是數據存儲層,那麼當數據經過互聯網到達機房以後會先找負載均衡器,負載均衡器請求web服務器,假如是瀏覽一篇博文,那麼web服務器先找內存緩存,若是內存緩存沒有,那麼會把請求轉發到數據庫,從數據庫讀完以後,再把數據放到內存一份,第二個用戶再訪問的時候就先訪問緩存,就不會找數據庫了,那麼數據庫的壓力就降下來了,這就是內存緩存的做用。
CDN服務 ,就是一個分佈式緩存系統,當用戶請求圖片的時候會先找CDN,CDN有就直接給用戶訪問了,大幅度的減輕網站壓力,同時節省帶寬。
緩存帶來的問題:
客戶發一張帖子到數據庫裏邊也緩存到緩存memcached裏邊,別人訪問就訪問緩存了,發帖子的人發現我這個內容須要修改下,是先更新數據庫,
不是先改緩存,其它用戶訪問就訪問到緩存了,仍是老的數據,有一個數據一致性的問題,因此程序員們這樣設計,它在更新數據庫的時候,它同時發送一個請求告訴memcached,對應的帖子過時了,那麼memcached會把過時的數據刪除,,會有這麼一個機制,那麼對於前端包括CDN,咱們在更新圖片的時候,告訴CND把舊的刪除,可是對於圖片來說不多有更改的操做,它的更改是更改文件名操做上傳,對於CDN來說是不一樣的數據。sql


session保持不論是nginx仍是apache只要用php,默認狀況下會放在/tmp目錄下,是在php.ini中指定的。
對於不一樣的服務器來說,每一個web服務器都放在本身的tmp下,早期會把會話保持到tmpfs文件系統裏。
那麼在php.ini裏邊能夠用IP加端口指定會話保持shell

在企業工做當中memcached緩存重啓數據全丟,假如數據丟了,數據庫壓力暴大
假如緩存每秒8000併發,數據庫併發1000,一下壓到數據庫,數據庫壓力大就會down機,數據庫剛要啓又down
這種狀況叫雪崩效應,這種狀況下一般把負載均衡下的web用防火牆禁止對外訪問。或者停掉
以後把memcached開啓來,經過程序初始化把memcached緩存好,而後慢慢的把web打開。數據庫

lvs或者haproxy 作cache的負載均衡
假設緩存把數據a.jpg存儲在cache1上,當用戶訪問a.JPG,若是訪問
到cache2上去了,那cache2上沒有就找數據庫了,那數據庫壓力不就大嘛,
那緩存有沒有了,有,只不過在cache1上,若是緩存把數據b.jpg存儲在cache2上
那用戶訪問被請求到cache1上,那cache1上沒有,那也只能找數據庫,那這就是一個問題
那在前邊負載算法就要指定url算法或者hash了,只要是這張圖片只要是這個路徑就存儲到指定地點。
web集羣是每一個服務器內容同樣的,不同的放在後端NFS裏邊了 ,因此web集羣能夠wrr算法。

memcached應用安裝

1. memcached服務端安裝
tar xf libevent-1.4.13-stable.tar.gz 
cd libevent-1.4.13-stable
./configure
make
make install

tar xf memcached-1.4.13.tar.gz 
cd memcached-1.4.13
./configure
make
make install
cd ..
[root@TCS tools]# echo "/usr/local/lib" >> /etc/ld.so.conf #配置ld.so.conf路徑防止啓動出錯
[root@TCS tools]# ldconfig 

[root@TCS tools]# which memcached
/usr/local/bin/memcached
[root@TCS tools]# /usr/local/bin/memcached -h   #memcached相關參數
2.memcached啓動 [root@TCS tools]# memcached -p 11211 -u root -m 16m -c 10240 -d # -p指定端口,-u 用戶,-m 內存大小,-c 最大併發鏈接數,-d 後臺運行 #其它參數: -P 設置保持Memcache的pid文件 -vv 以very vrebose模式啓動,調試信息和錯誤輸出到控制檯 [root@TCS tools]# lsof -i :11211 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME memcached 13875 root 26u IPv4 20953 0t0 TCP *:memcache (LISTEN) memcached 13875 root 27u IPv6 20954 0t0 TCP *:memcache (LISTEN) memcached 13875 root 28u IPv4 20957 0t0 UDP *:memcache memcached 13875 root 29u IPv6 20958 0t0 UDP *:memcache #memcached的多實例 [root@TCS tools]# memcached -p 11212 -u root -m 16m -c 10240 -d [root@TCS tools]# netstat -lnt|grep 1121 tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:11212 0.0.0.0:* LISTEN tcp 0 0 :::11211 :::* LISTEN tcp 0 0 :::11212 :::* LISTEN 3. 開機自啓動 放到/etc/rc.local中 memcached -p 11212 -u root -m 16m -c 10240 -d 4.寫入數據檢查結果 a.經過nc寫入 [root@TCS tools]# printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 127.0.0.1 11211 #增長 ,命令的字節是10,後面就要10個字符,不然添加不成功。 STORED [root@TCS tools]# printf "get key008\r\n"|nc 127.0.0.1 11211 #查詢 VALUE key008 0 10 oldboy0987 END [root@TCS tools]# printf "delete key008\r\n"|nc 127.0.0.1 11211 #刪除 DELETED [root@TCS tools]# printf "get key008\r\n"|nc 127.0.0.1 11211 #查詢 END b.經過telnet寫數據 [root@TCS tools]# telnet 192.168.179.134 11211 Trying 192.168.179.134... Connected to 192.168.179.134. Escape character is '^]'. set key 0 0 10 #寫數據 zhousq STORED get key #查詢 VALUE key 0 10 zhousq END delete key #刪除 DELETED get key END #CTRL+] 退回,而後qujit退出 #建議用第一種,有時telnet會很慢 經過stats能夠查看寫入數據的狀態信息 [root@TCS tools]# printf "stats\r\n"|nc 127.0.0.1 11211 STAT pid 14254 STAT uptime 312 STAT time 1461179190 STAT version 1.4.13 STAT libevent 1.4.13-stable STAT pointer_size 64 STAT rusage_user 0.000000 STAT rusage_system 0.015997 STAT curr_connections 10 STAT total_connections 14 STAT connection_structures 11 STAT reserved_fds 20 STAT cmd_get 1 STAT cmd_set 0 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 0 #查詢 命中的數量 STAT get_misses 1 #丟失數量 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 31 STAT bytes_written 1039 STAT limit_maxbytes 16777216 #內存大小 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 5. 重啓數據丟失
(經過簡單shell可讓memcache變爲持久化存儲)
6. memcache客戶端安裝 tar xf memcache-2.2.5.tgz cd memcache-2.2.5 /application/php/bin/phpize ./configure --with-php-config=/application/php/bin/php-config make make install ls /application/php5.3.27/lib/php/extensions/no-debug-zts-20090626/ 7. 測試 [root@TCS www]# cat test.php <?php $mem = new Memcache; $mem->connect("192.168.179.134", 11211) or die("Could not connect"); $version = $mem->getVersion(); echo "Server's version: ".$version."<br/>\n"; $mem->set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server"); echo "Store data in the cache (data will expire in 600 seconds)<br/>\n"; $get_result = $mem->get('testkey'); echo "$get_result is from memcached server."; ?> #瀏覽器訪問 http://192.168.179.134/test.php 返回結果以下。說明已經測試OK Server's version: 1.4.13 Store data in the cache (data will expire in 600 seconds) Hello World is from memcached server. 8.session共享會話存儲.在php.ini文件中改成相對應選項 session.save_handler memcache session.save_path tcp://192.168.179.134:11211 把全部web服務器的php.ini改爲同樣的地址,這樣就保持了會話保持 集羣架構多服務器同步session的多種方式: 1.lb層能夠作會話保持:例如: lvs -p nginx ip_hash hapoxy cookie insert PHP JAVA均可以用 2.軟件層,能夠作session複製,例如: tomcat ,resin,couchbase 3,session共享,例如: memcached或者其它工具的nosql工具,php經常使用這個。 4.高併發場景:例如門戶網站用cookies或cookies配合session把用戶級會話信息緩存在用戶本地; 9.memcache 圖形管理工具 [root@TCS tools]# tar xf memadmin-1.0.12.tar.gz [root@TCS tools]# mv memadmin /var/html/www/ [root@TCS tools]# /application/apache/bin/apachectl graceful http://192.168.179.134/memadmin/ 默認用戶密碼 admin:admin 10.內存管理機制的調優
指定1.25組間差距比因子爲2時小得多,更適合緩存幾百字節的記錄。 [root@TCS tools]
# memcached -m 512m -d -u root -c 8192 -f 2 -vv [root@TCS tools]# slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 192 perslab 5461 slab class 3: chunk size 384 perslab 2730 slab class 4: chunk size 768 perslab 1365 slab class 5: chunk size 1536 perslab 682 slab class 6: chunk size 3072 perslab 341 slab class 7: chunk size 6144 perslab 170 [root@TCS tools]# memcached -m 512m -d -u root -c 8192 -f 1.25 -vv [root@TCS tools]# slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 slab class 3: chunk size 152 perslab 6898 slab class 4: chunk size 192 perslab 5461 slab class 5: chunk size 240 perslab 4369 slab class 6: chunk size 304 perslab 3449 11.memcachedb和TTSERVER持久化存儲,兼容memcached協議。 12.memcached監控 check_me_sh #!/bin/sh [ $# -ne 2 ]&&{ echo "$0 ip port" exit } export oldboy=key export wwwServerIp=$1 export wwwServerPort=$2 cmd="nc $wwwServerIp $wwwServerPort" printf "delete $oldboy\r\n" | $cmd >/dev/null 2>&1 sleep 1 printf "set $oldboy 0 0 6\r\noldboy\r\n"|$cmd >/dev/null 2>&1 if [ `printf "get $oldboy\r\n"|$cmd|grep oldboy|wc -l` -eq 1 ] then echo "mc is alive." exit 0 else echo "mc is dead." exit 2 fi
相關文章
相關標籤/搜索