大型網站最佳化-memcache技術,最佳化-memcache技術
大型網站最佳化-memcache技術
memory+cache 記憶體緩衝
memcache簡介
memcache是一套分布式的高速緩衝系統,由LiveJournal的Brad Fitzpatrick開發,目前被許多網站使用以提升網站的訪問速度,尤其對於一些大型的、需要頻繁訪問資料庫的網站訪問速度提升效果十分顯著 。這是一套開放原始碼軟體,以BSD license授權發布。【摘取自百度百科】
官網:http://memcached.org/
分布式:多台Memcache伺服器來管理資料的架構。
緩衝系統:將使用者查詢的資料緩衝到記憶體之中,方便下次直接從記憶體中擷取。減少了磁碟IO的開銷。
什麼是nosql?(sql 關係型資料庫)
答:MySQL 叫做關係型資料庫(主要的特點是都是一個二維表結構(表中的行和列),表與表之間是由關係的)(oracle(Java)、db2、sqlserver)
非關係型資料:就是不使用sql語句作為查詢的資料庫(儲存資料的系統),並且沒有嚴格意義上的二維表的概念。它的資料結構全部是一張巨大的hash表(key-value)
hash表好處: 時間複雜度是 0(1):隨著資料的增加,查詢時間不會存在數量級(1s)的變化。
hash表壞處: hash碰撞 不同 key 對應同一個值
key1 ===MD5(sql) |
Asion |
key2 |
12 |
key3 |
shenzhen |
key4 |
iphone |
selinux沒有關閉
讓selinux立即生效
2.1 環境準備
在Linux環境下,需要gcc、g-c++、make(makefile)、cmake、autoconfig(configure)、libtool等工具
在Linux下連網的情況下,使用如下命令
# yum install -y gcc make cmake autoconfig libtool
-y 不需要使用確認互動式
2.2 編譯安裝memcached
memcached依賴於 libevent庫,因此需要先安裝,分別到各自的官網下載穩定版
libevetnt官網:http://libevent.org/
memcache官網:http://memcached.org/
先編譯安裝libevent,在編譯安裝memcached,同時在安裝memcached需要指定libevent的安裝路徑
具體步驟:
上傳
先下載libevent,解壓,並安裝(一般Linux下軟體安裝都是放在 /usr/local/src目錄下,安裝的軟體一般放在/usr/local/NAME)# ./configure --prefix=/usr/local/libevent && make && make install
b. 安裝memcache,解壓、編譯、安裝
# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent && make && make install
2.3 memcached的啟動
# /usr/local/memcached/bin/memcached -m 64 -p 11211 -u nobody -vv
注意:此時memcached成功啟動,但把資訊輸出到控制台。
如果想讓memcached作為服務在後台啟動,只需要加上-d選項(daemon 後台)
# /usr/local/memcached/bin/memcached -m 64 -p 11211 -u nobody -d
如何查看伺服器是否正常啟動?
# ps axu | grep memcached
如果需要查看參數資訊,使用 memcached -h 查看協助:
操作memcache
memcached的用戶端與伺服器端的通訊很簡單,基於文本的協議,類似http協議,可以直接使用Telnet來做互動
使用Telnet操作(quit退出)
# telent 伺服器的IP 11211
Windows下串連之後 使用 ctrl + ] 開啟Telnet的回顯
Linux下
2. 基本命令:
學習memcache的增刪改查命令:
add key flag expire length
key: 名稱
flag: 1 memcache按照字串的方式儲存
expire:到期時間,memcache時間
length:資料長度(B)
※add 增加
# add name 1 0 2 # 在memcache伺服器上添加一個key為的name值 長度為2個位元組,有效期間長期有效
如何理解expire
設定緩衝的有效期間,有三種格式
設定秒數,從設定開始,n秒後失效
時間戳記,到指定時間戳記後失效
設定為0,不自動失效(特別注意,不是永久有效。a. 在memcache安裝時候,指定了一個最長的有效時間,預設是30天(原始碼) b. 可能不到30天,就會被擠出去)最近最少使用原則
※delete 刪除
# delete key
※replace 替換
# replace key flag expire length
※get 擷取
# get key
※set 如果資料有 replace ,沒有則 add
# set key flag expire length
name存在:
age不存在:
※incr 增加
# incr age NUMBER
※decr 減少
# decr age NUMBER
※stats 統計memcache伺服器資訊
# stats
※flush_all 清空所有資料
# flush_all
使用php操作memcache
Windows下
到(http://downloads.php.net/pierre/)下載擴充dll檔案
將該檔案放到php的extension_dir 對應的目錄下
修改php.ini檔案,加入 extension=php_memcache.dll,引入該檔案
重啟Apache
Linux下 (在Linux下如何為php開啟一個擴充,說一下通用方案)beta :測試版:一般都有一些小bug,但是需要使用者去使用發現,如果有問題,可以給官方反饋。然後在做修複
alpha:自我裝載版:內部在開發的時候,使用的版本,一般這個版本bug眾多。但是這個版本往往有新的功能加入。(一般也是新公司才試試)alpha版本有一些補償。
stable:穩定版:基本無bug,能夠穩定的運行。
ftp使用的注意事項:
vsftpd 是否正常的開啟 service vsftpd status
一般都只能使用普通使用者串連ftp(不能root來串連ftp)擷取使用 sudo
自己家目錄的大小空間不夠(上傳檔案成功,但是顯示的大小為0)
防火牆是否關閉(iptables -F 關閉)(iptables -L)
# cls
# cd
# vim .bashrc
Linux下載末行模式下
# :x 小寫 退出 wq
linux在編輯模式下
# Z 大寫
# /usr/local/php/bin/phpize 絕對路徑phpize
d. 利用上面產生的configure檔案,收集系統資訊 不需要指定安裝路徑
# ./configure --with-php-config=/usr/local/php/bin/php-config 告訴它如何去找php設定檔
e. 執行編譯、安裝
# make && make install
注意:可以查看上述命令執行完成之後的結構
# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
注意:在Linux下,如何查看php.ini設定檔的位置?
解決:phpinfo();
注意:在Linux下,修改設定檔之前,一定要備份
php.ini-backup-2016-1-12
注意:.so是什麼檔案?
.so是Linux下的共用對象,類型Windows下的.dll檔案
注意:Linux下,關閉一個服務 可以使用
# pkill -9 httpd
# ps aux | grep httpd
#ps uax | grep httpd
將上面產生的地址增加到php.ini設定檔,如下
extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
extension=memcacahe.so
建立一個test.php檔案,測試php是否有memcache的一個模組
php操作memcache,儲存並擷取值
memcached的記憶體管理與刪除機制
注意:Memcache最大的value也只能是1M的空間。
注意:記憶體片段化永遠都存在,只是哪一種方式可以使得記憶體片段最小。
1. 什麼是記憶體片段化?
在使用這種記憶體緩衝系統的時候,由於不斷的申請,釋放,就會形成一些很小的記憶體片段,無法被利用,這種現象就叫做,記憶體的片段化。這個小紅塊就是作業系統無法使用的空間。
如何解決?memcache利用slab allocator的方式來管理(每個slab class大小為1M)
最小的單元叫做 chunk(小塊):存放資料的倉庫
多個小單元組成一個chunks:多個小塊組成(所有的小塊的大小全部一致)
每個 slab class的大小為1M
memcache如何選擇合適的大小?注意:如果 122Bytes的slab裝滿了,現在有一個100Bytes的資料來了,存到哪裡去?
答:肯定不會存在144,還是存在122這個chunk裡面,利用LRU演算法來實現資料存放區。
固定chunk帶來的記憶體浪費,22B
factor調優memcached在啟動的時候,會按照一定的大小來組織slab class,可以通過-f 來指定
預設是1.25,相鄰chunk之間的比值就是增加因子。可以根據自己網站的業務調整緩衝因子的大小。
是因為每個業務不一樣,所需要的最小的chunk是不一樣的。這個參數使得我們的系統變得更加適應自己的業務,因為資料可以自己設定大小。
memcache的惰性刪除memcached內部不會監視記錄是否到期,而是在get時查看記錄的時間戳記,檢查記錄是否到期。這種行為被稱為lazy(惰性)expiration。因此,好處是memcached不會在到期監視上耗費CPU時間。
比如:有 set(name, asion, 0, 3600) 過了3600秒就失效,失效後,並不會自動刪除,只有當get查詢時,檢測是否到期,如果到期則刪除。
例如 # add name 1 8 2 當8s後,是失效,還是不存在?通過stats分析
分析:是失效你,而不是不存在,只有在下一次去擷取時候,memcache才會去檢測它是否到期,到期了就刪除
memcache的LRU演算法memcached會優先使用已逾時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況,此時就要使用名為 Least Recently Used(LRU)機制來分配空間。
顧名思義,這是刪除"最近最少使用"的記錄的機制。因此,當memcached的記憶體空間不足時(無法從slab class 擷取到新的空間時),就從最近未被使用的記錄中搜尋,並將其空
間分配給新的記錄。從緩衝的實用角度來看,該模型十分理想。
當mecache裡面的資料空間(預設是64M)已經佔滿了,再繼續儲存資料能否儲存呢?
答:能儲存,要刪除到期的資料,如果都沒有到期,則刪除最不活躍的資料,騰出空間給後面添加資料。
例如:以122Bytes的slab舉例,當資料裝滿後,如果來了一個100Bytes資料,如何處理?(即使永久有效,也會被踢)
分析:記憶體的管理 LRU演算法 、FIFO演算法
memcache的一些參數 Ctrl+C注意:在vim下如果輸入了 ctrl+s 可以使用 ctrl+q 退出
-p 監聽的連接埠
-l 串連的IP地址, 預設是本機
-d start 啟動memcached服務
-d restart 重起memcached服務
-d stop|shutdown 關閉正在啟動並執行memcached服務
-d install 安裝memcached服務
-d uninstall 卸載memcached服務
-u 以的身份運行 (僅在以root啟動並執行時候有效)
-m 最大記憶體使用量,單位MB。預設64MB
注意:如果系統是32位的,則最大限制為2G,如果系統是64位,則無限制。
-M 記憶體耗盡時返回錯誤,而不是刪除項
-c 最大同時串連數,預設是1024
-f 塊大小增長因子,預設是1.25
-n 最小分配空間,key+value+flags預設是48
-h 顯示協助
-v 輸出警告和錯誤資訊
-vv 列印用戶端的請求和返回資訊
-i 列印memcached和libevent的著作權資訊
實際使用情境
儲存:1. 檔案 2. mysql
問題:如果一個檔案夾下session檔案過多,檢索變慢,如何處理?
答:分層處理
使用Memcache來儲存,Memcache使用分布式來儲存(拿多台Memcache做儲存)
使用memcache儲存session
1. 修改php.ini檔案,配置資訊如下
session.save_handler = memcache #代表使用memcache儲存session
session.save_path ="tcp://127.0.0.1:11211" # 指定memcache伺服器的地址和連接埠
測試1. 開啟session,儲存session
從Memcache擷取session進階特性
分布式memcache配置
什麼是分布式?
由於單台memcache的服務能力有限,可以使用多台memcache來提供緩衝的功能,這種架構就叫做memcache的分布式緩(叢集)存系統
如何??
可以這樣理解,如何將資料分散答各台Memcache伺服器上。
在用戶端實現分布式,在資料儲存之前,根據一定的演算法,將資料儲存到那台memcache伺服器上,在擷取資料的時候,按照前面相同的演算法去對應的memcache伺服器上擷取資料
分布式演算法
取摸演算法 將key的值對伺服器的台數取餘,然後將對應的value值儲存到對應的餘數的那台memcache伺服器上,一般這個hash函數 crc32( key ) % 3
crc32()這個函數可以使得一個字串變成一個32位的整數
壞處:當某一台伺服器宕機或者需要增加一台伺服器的時候,這個時候快取資料基本全部失效,因為除數變了。 不嚴格的公式, 命中率 = 取到資料/總數 1/N N代表格服務器的台數
引發出來的問題:當memcache宕機之後,快取資料失效,這個時候MySQL的壓力會驟增,
這個時候,MySQL會宕機,然後在重啟MySQL,MySQL會在短時期內再次宕機,然後,稍微延遲一點(緩衝已經重建立立了一部分),又宕機。隨著時間的慢慢推移,MySQL基本上趨於穩定,緩衝系統成功建立。因為快取資料不存在,所有的請求全部要轉向MySQL來提供,這種現象就叫做memcache的雪崩現象。
概圖:
一致性hash實現分布式
假想有一個圓環,分布著從 0 到 2^32 這麼多個正整數
然後在將伺服器的節點數通過hash函數(crc32())運算後,按照順時針的方向映射到上面的圓環上
將需要儲存的資料的key也按照上面的hash函數運算後,按照順時針的方向儲存到一個不比自己小的節點上
注意:只要是memcache宕機,就一定會有資料的丟失。但是要想辦法讓資料丟失的最少,使用一致性hash,即使有一台伺服器宕機,也只是影響一台伺服器上的資料。
虛擬節點:分擔任務
緩衝雪崩現象
雪崩造成的原因?
由於演算法不當,取摸演算法,造成大量緩衝失效,會引發雪崩解決方案:一致性hash演算法
緩衝時間都是同一時間,緩衝系統會在同一時間全部失效,這個也會造成雪崩解決方案:緩衝時間設定成一個範圍內的隨機時間(3-9小時)
由於某個memcache節點的快取資料失效,導致其他memcache節點的快取命中率下降,緩衝中缺失的資料會去MySQL資料庫中查詢,短時期內,造成了MySQL伺服器壓力巨大,造成宕機,就叫做緩衝雪崩現象。
當重啟MySQL之後,短期內再次宕機,但快取資料已經建立了一部分,在MySQL反覆多次啟動之後,緩衝全部重建完畢,MySQL不再宕機趨於穩定。
解決方案:把緩衝的時間設定成一個範圍內的隨機值(3-9小時),這樣就在不同的時間段失效,把重建的工作分擔到不同的時間上。
memcache如何做高可用
使用repcached實現,全稱 replication cached是由日本人發明的memcached的高可用性技術,簡稱複製緩衝區技術。
MemcacheDB是一個分布式、key-value形式的持久儲存系統。由sina人員開發。它不是一個緩衝組件,而是一個基於對象存取的、可靠的、快速的持久儲存引擎。協議跟memcache一致(不完整),所以很多memcached用戶端都可以跟它串連。MemcacheDB採用Berkeley DB作為持久儲存群組件,故很多Berkeley DB的特性的他都支援。擴充
如何在Linux下給一個php添加一個擴充,說出通用步驟?答:
memcache的安全性如何解決?答:
由於memcache的本身設計就是極為簡潔的,根本沒有設定許可權方面的限制。為什麼不設定許可權? 只提供緩衝功能,為了精簡
放在內網 192.168.1.110 內網IP外網無法訪問
寫一個防火牆驗證規則,只允許自己規定IP的包可以轉進來,其他的全部丟棄192.168.1.221 ---224
3. 當使用檔案儲存session檔案時候,如果檔案過多,如何處理?
一般來說,超過65535個session檔案的時候,這個時候session的擷取就會變得異常緩慢,意味php代碼執行很慢,如何解決?
答:
分層處理: 一個檔案夾下建立A-Z開頭的檔案夾 然後A_Z在建立
使用memcache處理: 單台memcache處理能力有限,就使用分布式memcache來處理
如何理解負載平衡叢集也是高可用叢集,但有不是?答:負載平衡叢集提供了高可用的能力,如果某一台宕機之後,還是可以提供正常的服務,只是服務提供的有些吃力而已。
因為負載平衡叢集不提供keepalive的機制。監控機制
案例:
在項目中如何使用Memcache?
Memcache存在的意義就是快取資料,減輕MySQL的壓力。
書寫一個列表頁
詳情頁
擴充
Linux下安裝一個php的擴充的通用方法答:
下載對應的擴充的源碼 http://pecl.php.net/package/memcache
將對於的擴充上傳到Linux伺服器上,放在(/usr/local/src/下)
執行 tar -zxvf NAME.tar.gz
cd NAME
執行絕對路徑下的phpize命名 (/usr/local/php/bin/phpize)必須在擴充包的目錄內
執行 ./configure --with-php-config=/usr/local/php/bin/php-config (--with-php-config=絕對路徑下的php-config的路徑,並且不需要指定安裝的路徑)
make && make install
會產生一個目錄,在個目錄裡面有對於的NAME.so檔案
去修改php.ini的設定檔,增加兩行資訊extension_dir='上面產生的目錄'
extension='NAME.so'
重啟Apache,然後使用phpinfo()函數測試一下,在瀏覽器輸入地址查看,搜尋如果有Memcache,代表擴充成功的開啟。
http://www.bkjia.com/PHPjc/1117896.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1117896.htmlTechArticle大型網站最佳化-memcache技術,最佳化-memcache技術 大型網站最佳化-memcache技術 memory+cache 記憶體緩衝 memcache簡介 memcache是一套 分布式 的高速 緩衝系統...