1. 程式人生 > >Memcached 安裝詳解【送源碼包】

Memcached 安裝詳解【送源碼包】

ESS directory var code sco dex fire ref .html

Memcached簡介

Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。

常用典型架構圖如下:
技術分享圖片

原理講解:
當Web客戶端發送請求到web服務器的應用程序時,應用程序會通過調用Memcached API客戶端程序庫接口去連接 Memcached服務器,進而查詢數據。如果此時web客戶端所請求的數據已經在 Memcached服務端中緩存,則 Memcached服務端會將數據返回給Web客戶端;如果數據不存在,則會將Web客戶端請求發送至MySQL數據庫,由數據庫將請求的數據返回給 Memcached以及Web客戶端,與此同時Memcached服務器也會將數據進行保存,方便用戶下次使用。

Memcached 特征
一、協議
memcached的服務器客戶端通信並不使用復雜的XML等格式,而使用簡單的基於文本行的協議。因此,通過telnet也能在memcached上保存數據、取得數據
下面是例子:
$ telnet localhost 11211
Trying 127.0.0.1
Connected to localhost.localdomain (127.0.0.1).
Escape character is ‘^]‘.
set foo 0 0 3 (保存命令)
bar (數據)
STORED (結果)
get foo (取得命令)
VALUE foo 0 3 (數據)
bar (數據)

二、基於libevent的事件處理

libevent是一套跨平臺的事件處理接口的封裝,能夠兼容包括這些操作系統:Windows/Linux/BSD/Solaris等操作系統的的事件處理。Memcached 使用libevent來進行網絡並發連接的處理,能夠保持在很大並發情況下,仍舊能夠保持快速的響應能力。

三、儲存方式與數據過期方式
1.數據儲存方式:Slab Allocator
(1)先把內存分成很多個Slab,這個大小是預先規定好的,以解決內存碎片的問題。分配給Slab的內存空間被稱為Page,默認是1M。一個Slab下可以有多個Page。 ?
(2)然後把一個Page分成很多個chunk塊,chunk塊是用於緩存記 錄的空間。chunk的大小是先有一個基本值,然後根據增長因子(1.25)來增大。 ? ?

(3)slab class : 內存區類別(48byte-1M) , 每個類別有一個slab classId ? ?
( 4)Memcached 裏面保存著slab內空閑的chunk列表,當收到要保存的item的時候,它會根據item的大小去選擇一個最合適的slab,然後找到空閑的chunk,把數據放進去。
技術分享圖片

2.理解數據過期方式: ? ?
(1)Lazy Expiration(延遲/惰性 過期) ? ?
Memcached不會監控記錄是否過期,而是在外部來獲取數據的時候,才檢查記錄時間戳。因此被稱為Lazy Expiration ? ?
(2)LRU(Least Recently Used )?? ?????
當空間不足的時候,Memcached會優先使用已經過期的數據空間,如果還不夠,那麽就會把最近最少使用的對象的空間釋放出來。 不是全局的,而是針對slab,可以說是區域性的。 ? ?
(3)懶惰刪除機制 ?????
? 刪除item對象時,不釋放內存,做刪除標記,指針放入slot回收插槽,下次分配的時候直接使用。

四、新建Item分配內存的過程 ? ?
1,快速定位slab classId , 先計算Item的長度 ????? ?
key鍵長 + flag + suffix (17字節) + value值長 + 結構大小(32字節)? 取最小冗余的 slab class ? ?
2,按順序尋找可用的chunk ????? ?
(1)slot:檢查slab回收空間slot裏是否有剩余的chunk ????????????? ?
delete:delete時標記到slot ????????????? ?
exptime: get時檢查的過期對象標記到slot ????? ?
(2)end page ptr:檢查page中是否有剩余的chunk ????? ?
(3)memory:內存還有剩余則開辟新的slab ????????
(4)LRU 三,memcached的數據存儲方式的缺點: ? ?
由於chunk的大小時預先分配好的特定長度,因此如果數據不能完全填滿chunk,那麽剩余的空間就浪費了 ?

五、 Memcached緩存機制
緩存是常駐在內存的數據,能夠快速進行讀取。而 Memcached就是這樣一款非常
出色的緩存軟件,當程序寫入緩存數據請求時, Memcached的API接口將Key輸入路
由算法模塊路由到集群中一臺服務器,之後由API接口與服務器進行通信,完成一次
分布式緩存寫入,如下圖:
技術分享圖片

六、Memcached 分布式
Memcached分布式部署主要依賴於 Memcached的客戶端來實現,多個 Memcached
服務器是獨立的。分布式數據如何存儲是由路由算法所決定的。當數據到達客戶端程序庫時,客戶端的算法就依據路由算法來決定保存的Memcached服務器。讀取數據時,客戶端依據保存數據時的路由算法選中和存儲數據時相同的服務器來讀取數據。如下圖:
技術分享圖片

七、 Memcached路由算法
1.求余數hash算法
求余數hash算法先用key做hash運算得到一個整數,再去做hash算法,根據余數進行路由。這種算法適合大多數據需求,但是不適合用在動態變化的環境中,比如有大量機器添加或者刪除時,會導致大量對象的存儲位置失效

2.一致性hash算法
一致性hash算法適合在動態變化的環境中使用。原理是按照hash算法把對應的
key通過一定的hash算法處理後,映射形成一個首尾相接的閉合循環,然後通過使用與對象存儲一樣的hash算法將機器也映射到環中,按順時針方向將所有對象存儲到離自己最近的機器中,如下圖所示:
技術分享圖片

Memcached存在的問題:
本身沒有內置分布式功能,無法實現使用多臺Memcachd服務器來存儲不同的數據,最大程度的使用相同的資源;無法同步數據,容易造成單點故障,這裏可以通過Memcached代理實現集群功能

實驗案例:
使用2臺CentOS7系統完成,一臺Memcached服務器,一臺基於LAMP架構進行的Memcache客戶端

實驗環境
技術分享圖片
所有安裝包下載鏈接:https://pan.baidu.com/s/1APlqsA45yNu1-0onYJ5cVw
密碼:w38l
特別提醒:一定要特別註意軟件包版本問題,否則就會出錯!

實驗步驟
一、安裝Memcached 服務器
1.安裝Libevent
簡介:Libevent是一款跨平臺的事件處理接口的封裝,可以兼容多個操作系統的事件訪問。 Memcached的安裝依賴於 Libevent,因此需要先完成 Libevent的安裝。

yum install gcc gcc-c++ make -y
tar xzvf   libevent-2.1.8stable.tar.gz  -C /opt
cd  /opt/  libevent-2.1.8stable
./configure --prefix=/usr/local/libevent
Make && make install

2.安裝Memcache

 tar xf memcached-1.5.6.tar.gz -C /opt/
./configure --prefix=/usr/local/memcached make && make install
ln -s /usr/local/memcache/bin/* /usr/local/bin
 memcached -d -m 32m -p 11211 -u root    //   開啟服務(-d守護進程  -m緩存大小32M  -p端口11211)
 netstat -anpt | grep memc      //查看端口 11211/tcp端口
 systemctl stop firewalld.service 
 setenforce 0

二、Memcache API 客戶端安裝
1.搭建LAMP架構

安裝apache服務

(1) 解壓各種軟件包
tar xf apr-1.6.2.tar.gz -C /opt
tar xf apr-util-1.6.0.tar.gz -C /opt
tar jvxf httpd-2.4.29.tar.bz2 -C /opt
mv apr-1.6.2 httpd-2.4.29/srclib/apr
mv apr-util-1.6.0 httpd-2.4.29/srclib/apr-util

(2) 安裝編譯環境工具

yum -y install gcc gcc-c++ make pcre-devel expat-devel perl

(3) 編譯安裝

cd  /opt/httpd-2.4.29
./configure \ 
--prefix=/usr/local/httpd \   #指定安裝目錄
--enable-so \ #啟用動態加載模塊支持
--enable-rewrite \ #啟用網頁地址重寫功能,實現偽靜態
--enable-charset-lite \  #啟動字符集支持,以便支持使用各種字符集編碼的網頁 
--enable-cgi #啟用CGI腳本程序支持(通用網關接口)

make && make install  #編譯安裝

4.添加系統服務

cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd  #將啟動腳本拷貝服務程序目錄下
vim /etc/init.d/httpd  #修改啟動腳本

#chkconfig: 35 85 21   #35級別自動運行  第85個啟動 第21個關閉 #description: Apache is a World Wide Web server.

5.修改配置文件

vi /usr/local/httpd/conf/httpd.conf
ServerName  www.yun.com:80  #填寫完全主機名
Listen 192.168.65.173:80  #監聽本地IP

6.優化服務

ln -s /usr/local/httpd/conf/httpd.conf  /etc/httpd  #優化配置文件路徑
ln -s /usr/local/httpd/bin/*  /usr/local/bin/  #優化命令路徑
chkconfig --add httpd //將httpd加入到service管理器

7.重啟服務,關閉防火墻

systemctl stop firewalld.service
setenforce 0
systemct httpd start
netstat -anpt | grep “:80”

技術分享圖片

安裝MYSQL數據庫

1.解壓軟件包,安裝編譯環境工具

yum -y install ncurses-devel bison libaio-devel cmake
tar xzvf mysql-5.6.26.tar.gz -C /opt

2.編譯安裝

cd /opt/mysql-5.6.26
cmake  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \   #軟件安裝位置
-DDEFAULT_CHARSET=utf8 \   #默認字符集 
-DDEFAULT_COLLATION=utf8_general_ci \  #默認字符校驗
-DEXTRA_CHARSETS=all \  #額外的編碼,請使用all來編譯
-DSYSCONFIDIR=/etc  \   #數據目錄
-DMYSQL_DATADIR=/home/mysql/  \  #指定mysql的運行用戶
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock  

make && make install #編譯安裝

3.添加系統服務

cp support-files/mysql.server /etc/init.d/mysqld #添加系統服務
chmod 755 /etc/init.d/mysqld #添加執行權限
chkconfig --add /etc/init.d/mysqld #將mysqld添加為系統服務
chkconfig mysqld --level 235 on #
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile #重新讀取系統環境變量
useradd -s /sbin/nologin mysql #創建進程用戶mysql
chown -R mysql:mysql /usr/local/mysql/ #修改mysql安裝目錄的所有者,所屬組

4.初始化數據庫

/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql

5.建立軟連接
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock

6.修改配置文件

cp support-files/my-default.cnf /etc/my.cnf
vim /etc/init.d/mysqld

basedir=/usr/local/mysql
datadir=/home/mysql

7.啟動服務
systemctl start mysqld
netstat -anpt | grep 3306
技術分享圖片

mysqladmin -u root password "abc123" //給數據庫root賬號設置密碼

安裝PHP

1.安裝編譯環境

yum -y install \
gd \
libpng \
libpng-devel \
pcre \
pcre-devel \
libxml2-devel \
libjpeg-devel

2.解壓軟件包
tar xjvf php-5.6.11.tar.bz2 -C /opt #解壓軟件包

3.編譯安裝

cd /opt/php-5.6.11 進入編譯目錄下
./configure \
--prefix=/usr/local/php5 \ #
--with-gd \
--with-zlib \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-mysql=/usr/local/mysql \
--with-config-file-path=/usr/local/php5 \
--enable-mbstring

make && make install #編譯安裝

3.創建PHP配置文件

cp php.ini-development /usr/local/php5/php.ini

4.建立軟鏈接

ln -s /usr/local/php5/bin/ /usr/local/bin/ #優化命令路徑(軟連接)
ln -s /usr/local/php5/sbin/
/usr/local/sbin/

5.修改Apache配置文件
vim /etc/httpd.conf //
約143行檢查下面這條語句是否存在,如果不存在還需要重新安裝mysql,如果還沒有,直接重裝apache
LoadModule php5_module modules/libphp5.so

#約242行添加php首頁識別:
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>

#約348添加支持PHP後綴:
<IfModule mime_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule mime_module>

6.添加PHP測試內容

vim /usr/local/httpd/htdocs/index.php

<?php
phpinfo();
?>

7.重啟httpd服務,在網頁測試“http://192.168.65.173/index.php”
技術分享圖片

8.測試數據庫

mysql -u root -pabc123 #進入數據庫
CREATE DATABASE sky;
GRANT all ON sky.* TO ‘skyuser‘@‘%‘ IDENTIFIED BY ‘admin123‘;
flush privileges;
exit

9.修改站點內容

vim /usr/local/httpd/htdocs/index1.php
<?php
$link=mysql_connect(‘192.168.65.173‘,‘skyuser‘,‘admin123‘);
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
mysql_close();
?>

10.在網頁驗證
技術分享圖片

11.安裝Memcached客戶端

yum install autoconf -y
tar zvxf memcache-2.2.7.tgz -C /opt/
cd /opt/memcache-2.2.7
//使用PHP的phpize腳本生成配置腳本configure 再進行配置編譯
/usr/local/php5/bin/phpize

技術分享圖片

12.安裝編譯

./configure \
--enable-memcache \
--with-php-config=/usr/local/php5/bin/php-config

make && make install

/usr/local/php5/lib/php/extensions/no-debug-zts-20131226 #復制此行

13.配置PHP添加Memcached組件
vim /usr/local/php5/php.ini
搜索extension_dir = ,增加下面2行
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-
zts-20131226/"
extension = memcache.so

14.編寫測試頁面,

vim /usr/local/httpd/htdocs/index.php

<?php
$memcache = new Memcache();
$memcache->connect(‘192.168.65.159‘,11211);
$memcache->set(‘key‘,‘Memcache test Successfull!‘,0,60);
$result = $memcache->get(‘key‘);
unset($memcache);
echo $result;
?>

15.重啟httpd服務,去網頁驗證客戶端能否連接服務端
技術分享圖片


友情提醒:若此時網頁打開出錯,可嘗試如下方法:
  [root@localhost htdocs]# service httpd restart     
  [root@localhost htdocs]# netstat -ntap | grep httpd    #查看所有httpd占用端口
  tcp        0      0 192.168.65.173:80       0.0.0.0:*       LISTEN      64008/httpd         
  tcp        0      0 192.168.65.173:80       192.168.65.176:49304    
  FIN_WAIT2   64010/httpd         
  [root@localhost htdocs]# pkill -9 httpd    #強制關閉所有httpd進程
  [root@localhost htdocs]# service httpd start    #開啟httpd服務
    [root@localhost htdocs]# netstat -ntap | grep httpd     #再次查看端口
 tcp        0      0 192.168.65.173:80       0.0.0.0:*               
 LISTEN      64253/httpd         

總結:1.此實驗過程時間比較長,約1個小時左右,需要耐心等待!
2.實驗步驟較多,刷腳本時註意先後順序,避免遺漏某些命令。
3.千萬註意軟件包版本號,換一種版本號可能無法做出實驗結果!
4.在網頁驗證前註意查看各種服務的端口是否被占用,無法成功重 啟(主要是Apache)

附加資料
Memcached官網:http://memcached.org/

Memcached教程:http://www.w3cschool.cn/memcached/

Memcached下載:http://memcached.org/downloads

Memcached 安裝詳解【送源碼包】