MemCached原理
- 許多Web應(yīng)用都將數(shù)據(jù)保存到RDBMS中惰聂,應(yīng)用服務(wù)器從中讀取數(shù)據(jù)并在瀏覽器中顯示
- 隨著數(shù)據(jù)量的增大,訪問的集中愚屁,就會出現(xiàn)RDBMS的負擔(dān)加重奸笤,數(shù)據(jù)庫響應(yīng)惡化,網(wǎng)站顯示延遲等重大影響
數(shù)據(jù)庫存儲位置對比
- 性能: CPU緩存>內(nèi)存>磁盤>數(shù)據(jù)庫
- 價格: CPU緩存>內(nèi)存>磁盤>數(shù)據(jù)庫
Memcached簡介
memecached是高性能的分布式緩存服務(wù)器
- 用來集中緩存數(shù)據(jù)庫查詢結(jié)果碴开,減少數(shù)據(jù)庫訪問次數(shù)毅该,以提高動態(tài)Web應(yīng)用的響應(yīng)速度
- 官方網(wǎng)站:http://memcached.org/
內(nèi)存管理機制
- 傳統(tǒng)內(nèi)存分配機制
- 使用完通過分配的內(nèi)存后回收內(nèi)存,這種方式易產(chǎn)生內(nèi)存碎片并降低操作系統(tǒng)對內(nèi)存的管理效率
- Slab Allocation機制
- memcached使用這種內(nèi)存管理機制潦牛,可以提高讀寫速度
構(gòu)建memcached服務(wù)
- 安裝memcached軟件眶掌,并啟動服務(wù)
- 使用telnet測試memcached服務(wù)
- 對memcached進行增、刪巴碗、改朴爬、查等操作
memcached是高性能的分布式緩存服務(wù)器,用來集中緩存數(shù)據(jù)庫查詢結(jié)果橡淆,減少數(shù)據(jù)庫訪問次數(shù)召噩,以提高動態(tài)Web應(yīng)用的響應(yīng)速度。訪問拓撲如圖所示逸爵。
- 使用1臺RHEL7虛擬機作為memcached服務(wù)器(192.168.4.5)具滴。
- 在RHEL7系統(tǒng)光盤中包含有memcached,因此需要提前配置yum源师倔,即可直接使用yum安裝构韵,客戶端測試時需要提前安裝telnet遠程工具。
- 驗證時需要客戶端主機安裝telnet趋艘,遠程memcached來驗證服務(wù)器的功能:
- add name 0 180 10 //變量不存在則添加
- set name 0 180 10 //添加或替換變量
- replace name 0 180 10 //替換
- get name //讀取變量
- append name 0 180 10 //向變量中追加數(shù)據(jù)
- delete name //刪除變量
- stats //查看狀態(tài)
- flush_all //清空所有
提示:0表示不壓縮疲恢,180為數(shù)據(jù)緩存時間,10為需要存儲的數(shù)據(jù)字節(jié)數(shù)量致稀。
步驟
一:構(gòu)建memcached服務(wù)
(1)使用yum安裝軟件包memcached
[root@proxy ~]# yum -y install memcached
[root@proxy ~]# rpm -qa memcached
memcached-1.4.15-10.el7_3.1.x86_64
(2) memcached配置文件(查看即可冈闭,不需要修改)
[root@proxy ~]# vim /usr/lib/systemd/system/memcached.service
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
[root@proxy ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
(3)啟動服務(wù)并查看網(wǎng)絡(luò)連接狀態(tài)驗證是否開啟成功:
netstat命令可以查看系統(tǒng)中啟動的端口信息俱尼,該命令常用選項如下:
-a
顯示所有端口的信息
-n
以數(shù)字格式顯示端口號
-t
顯示TCP連接的端口
-u
顯示UDP連接的端口
-l
顯示服務(wù)正在監(jiān)聽的端口信息抖单,如httpd啟動后,會一直監(jiān)聽80端口
-p
顯示監(jiān)聽端口的服務(wù)名稱是什么(也就是程序名稱)
注意:在RHEL7系統(tǒng)中,使用ss命令可以替代netstat矛绘,功能與選項一樣耍休。
[root@proxy ~]# systemctl start memcached
[root@proxy ~]# systemctl status memcached
[root@proxy ~]# netstat -anptu | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 2839/memcached
tcp 0 0 :::11211 :::* LISTEN 2839/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 2839/memcached
udp 0 0 :::11211 :::* 2839/memcached
[root@proxy ~]# setenforce 0
[root@proxy ~]# firewall-cmd --set-default-zone=trusted
二:使用telnet訪問memcached服務(wù)器
(1)使用yum安裝telnet
[root@proxy ~]# yum -y install telnet
(2)使用telnet連接服務(wù)器測試memcached服務(wù)器功能,包括增货矮、刪羊精、改、查等操作囚玫。
[root@proxy ~]# telnet 192.168.4.5 11211
Trying 192.168.4.5...
……
##提示:0表示不壓縮喧锦,180為數(shù)據(jù)緩存時間,3為需要存儲的數(shù)據(jù)字節(jié)數(shù)量抓督。
set name 0 180 3 //定義變量燃少,變量名稱為name
plj //輸入變量的值,值為plj
STORED
get name //獲取變量的值
VALUE name 0 3 //輸出結(jié)果
plj
END
##提示:0表示不壓縮铃在,180為數(shù)據(jù)緩存時間阵具,3為需要存儲的數(shù)據(jù)字節(jié)數(shù)量。
add myname 0 180 10 //新建定铜,myname不存在則添加阳液,存在則報錯
set myname 0 180 10 //添加或替換變量
replace myname 0 180 10 //替換,如果myname不存在則報錯
get myname //讀取變量
append myname 0 180 10 //向變量中追加數(shù)據(jù)
delete myname //刪除變量
stats //查看狀態(tài)
flush_all //清空所有
quit //退出登錄
LNMP+memcached
L指Linux揣炕,N指Nginx帘皿,M一般指MySQL,也可以指MariaDB畸陡,P一般指PHP矮烹,也可以指Perl或Python 部署LNMP+memcached網(wǎng)站平臺,通過PHP頁面實現(xiàn)對memcached服務(wù)器的數(shù)據(jù)操作
- 部署LNMP實現(xiàn)PHP動態(tài)網(wǎng)站架構(gòu)
- 為PHP安裝memcache擴展
創(chuàng)建PHP頁面,并編寫PHP代碼罩锐,實現(xiàn)對memcached的數(shù)據(jù)操作
使用2臺RHEL7虛擬機奉狈,其中一臺作為memcached及LNMP服務(wù)器(192.168.4.5)、另外一臺作為測試用的Linux客戶機(192.168.4.10)涩惑,如圖所示仁期。
在這里插入圖片描述
在RHEL7系統(tǒng)光盤中包含有我們需要的MariaDB、PHP,我們需要使用源碼安裝Nginx,使用RPM包安裝FPM鞋拟。另外如果希望使用PHP來操作memcached雌续,注意必須要為PHP安裝memcache擴展(php-pecl-memcache),否則PHP無法解析連接memcached的指令陈轿。客戶端測試時需要提前安裝telnet遠程工具。
一:部署LNMP環(huán)境(如果環(huán)境中已經(jīng)存在LNMP環(huán)境本步驟可以忽略)
(1)使用yum安裝基礎(chǔ)依賴包
[root@web1 ~]# yum -y install gcc openssl-devel pcre-devel zlib-devel
.. ..
(2)源碼安裝Nginx
[root@web1 ~]# tar -xf nginx-1.12.2.tar.gz
[root@web1 ~]# cd nginx-1.12.2
[root@web1 nginx-1.12.2]# ./configure \
> --with-http_ssl_module
[root@web1 nginx-1.12.2]# make && make install
(3)安裝MariaDB數(shù)據(jù)庫
[root@web1 ~]# yum -y install mariadb mariadb-server mariadb-devel
(4)安裝PHP
[root@web1 ~]# yum -y install php php-mysql
[root@web1 ~]# yum -y install php-fpm-5.4.16-42.el7.x86_64.rpm
(5)修改Nginx配置文件
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
二:啟動服務(wù)(如果所有服務(wù)已經(jīng)啟動理逊,也可以忽略這一步驟)
(1)啟動Nginx服務(wù)
這里需要注意的是橡伞,如果服務(wù)器上已經(jīng)啟動了其他監(jiān)聽80端口的服務(wù)軟件(如httpd),則需要先關(guān)閉該服務(wù)晋被,否則會出現(xiàn)沖突兑徘。
[root@web1 ~]# systemctl stop httpd //如果該服務(wù)存在,則關(guān)閉該服務(wù)
[root@web1 ~]# /usr/local/nginx/sbin/nginx
[root@web1 ~]# netstat -utnlp | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 32428/nginx
(2)啟動MySQL服務(wù)
[root@web1 ~]# systemctl start mariadb
[root@web1 ~]# systemctl status mariadb
(3)啟動PHP-FPM服務(wù)
[root@web1 ~]# systemctl start php-fpm
[root@web1 ~]# systemctl status php-fpm
(4)關(guān)閉SELinux羡洛、防火墻
[root@web1 ~]# setenforce 0
[root@web1 ~]# firewall-cmd --set-default-zone=trusted
三:創(chuàng)建PHP頁面挂脑,使用PHP語言測試memcached服務(wù)
(1)部署測試頁面
創(chuàng)建PHP首頁文檔/usr/local/nginx/html/index.php,測試頁面可以參考lnmp_soft/php_scripts/mem.php欲侮。
注意:192.168.2.5是memcached數(shù)據(jù)庫崭闲。
[root@web1 ~]# vim /usr/local/nginx/html/test.php
<?php
$memcache=new Memcache; //創(chuàng)建memcache對象
$memcache->connect('192.168.2.5',11211) or die ('could not connect!!');
$memcache->set('key','test'); //定義變量
$get_values=$memcache->get('key'); //獲取變量值
echo $get_values;
?>
(2)客戶端測試(結(jié)果會失敗)
客戶端使用瀏覽器訪問服務(wù)器PHP首頁文檔威蕉,檢驗對memcached的操作是否成功:
[root@web1 ~]# firefox http://192.168.2.100/test.php
注意:這里因為沒有給PHP安裝擴展包镀脂,默認PHP無法連接memcached數(shù)據(jù)庫,需要給PHP安裝擴展模塊才可以連接memcached數(shù)據(jù)庫忘伞。
(3)為PHP添加memcache擴展
[root@web1 ~]# yum -y install php-pecl-memcache
[root@web1 ~]# systemctl restart php-fpm
(4)客戶端再次測試(結(jié)果會成功顯示數(shù)據(jù)結(jié)果)
[root@web1 ~]# firefox http://192.168.2.100/test.php
PHP的本地Session信息
通過Nginx調(diào)度器負載后端兩臺Web服務(wù)器薄翅,實現(xiàn)以下目標:
- 部署Nginx為前臺調(diào)度服務(wù)器
- 調(diào)度算法設(shè)置為輪詢
- 后端為兩臺LNMP服務(wù)器
- 部署測試頁面,查看PHP本地的Session信息
方案
使用4臺RHEL7虛擬機氓奈,其中一臺作為Nginx前端調(diào)度器服務(wù)器(eth0:192.168.4.5,eth1:192.168.2.5)翘魄、兩臺虛擬機部署為LNMP服務(wù)器,分別為Web1服務(wù)器(192.168.2.100)和Web2服務(wù)器(192.168.2.200)舀奶,另外一臺作為測試用的Linux客戶機(192.168.4.10)暑竟,拓撲如圖所示。
步驟
實現(xiàn)此案例需要按照如下步驟進行育勺。
一:部署后端LNMP服務(wù)器相關(guān)軟件(如果已經(jīng)安裝完成但荤,則忽略此步驟)
注意:以下部署LNMP服務(wù)器的操作,需要在兩臺后端服務(wù)器做相同的操作涧至,下面我們以一臺Web2服務(wù)器(192.168.2.200)為例腹躁,對Web1服務(wù)器執(zhí)行相同操作即可。
(1)使用yum安裝基礎(chǔ)依賴包
[root@web2 ~]# yum -y install gcc openssl-devel pcre-devel
.. ..
(2)源碼安裝Nginx
[root@web2 ~]# tar -xf nginx-1.12.2.tar.gz
[root@web2 ~]# cd nginx-1.12.2
[root@web2 nginx-1.12.2]# ./configure \
> --with-http_ssl_module
[root@web2 nginx-1.12.2]# make && make install
(3)安裝MariaDB數(shù)據(jù)庫
[root@web2 ~]# yum -y install mariadb mariadb-server mariadb-devel
(4)安裝PHP(php-fpm軟件包在lnmp_soft中有提供)
[root@web2 ~]# yum -y install php php-mysql
[root@web2 ~]# yum -y install php-fpm-5.4.16-42.el7.x86_64.rpm
(5)修改Nginx配置文件(修改默認首頁與動靜分離)
[root@web2 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
二:啟動LNMP服務(wù)器相關(guān)的服務(wù)
(1)啟動Nginx服務(wù)
這里需要注意的是南蓬,如果服務(wù)器上已經(jīng)啟動了其他監(jiān)聽80端口的服務(wù)軟件(如httpd)纺非,則需要先關(guān)閉該服務(wù),否則會出現(xiàn)沖突赘方。
[root@web2 ~]# systemctl stop httpd //如果該服務(wù)存在烧颖,則關(guān)閉該服務(wù)
[root@web2 ~]# /usr/local/nginx/sbin/nginx
[root@web2 ~]# netstat -utnlp | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 32428/nginx
(2)啟動MySQL服務(wù)
[root@web2 ~]# systemctl start mariadb
[root@web2 ~]# systemctl status mariadb
(3)啟動PHP-FPM服務(wù)
[root@web2 ~]# systemctl start php-fpm
[root@web2 ~]# systemctl status php-fpm
(4)關(guān)閉SELinux、防火墻
[root@web2 ~]# setenforce 0
[root@web2 ~]# firewall-cmd --set-default-zone=trusted
三:部署前端Nginx調(diào)度服務(wù)器
(1)使用源碼安裝nginx軟件(如果Nginx軟件包已存在可以忽略此步驟)
[root@proxy ~]# yum -y install gcc pcre-devel openssl-devel
[root@proxy ~]# tar -xf nginx-1.12.2.tar.gz
[root@proxy ~]# cd nginx-1.12.2
[root@proxy nginx-1.12.2]# ./configure
[root@proxy nginx-1.12.2]# make && make install
(2)修改Nginx配置文件
Nginx配置文件中窄陡,通過upstream定義后端服務(wù)器地址池炕淮,默認調(diào)度策略為輪詢,使用proxy_pass調(diào)用upstream定義的服務(wù)器地址池:
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
upstream webs {
server 192.168.2.100:80;
server 192.168.2.200:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://webs;
root html;
index index.php index.html index.htm;
}
}
(3)重新加載配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
請先確保nginx是啟動狀態(tài)跳夭,否則運行該命令會報錯,報錯信息如下:
[error] open() “/usr/local/nginx/logs/nginx.pid” failed (2: No such file or directory)
(4)關(guān)閉SELinux涂圆、防火墻
[root@proxy ~]# setenforce 0
[root@proxy ~]# firewall-cmd --set-default-zone=trusted
四:測試環(huán)境是否配置成功
(1)瀏覽器訪問測試頁面驗證们镜。
[root@client ~]# curl http://192.168.4.5/index.html //查看是否有數(shù)據(jù)
五:部署測試頁面
(1)部署測試頁面(Web1服務(wù)器)。
測試頁面可以參考lnmp_soft/php_scripts/php-memcached-demo.tar.gz乘综。
[root@web1 ~]# cd lnmp_soft/php_scripts/
[root@web1 php_scripts]# tar -xf php-memcached-demo.tar.gz
[root@web1 php_scripts]# cd php-memcached-demo
[root@web1 php-memcached-demo]# cp -a * /usr/local/nginx/html/
(2)瀏覽器直接訪問后端服務(wù)器的測試頁面(Web1服務(wù)器)。
[root@web1 ~]# firefox http://192.168.2.100 //填寫賬戶信息
[root@web1 ~]# cd /var/lib/php/session/ //查看服務(wù)器本地的Session信息
[root@web1 ~]# ls
sess_ahilcq9bguot0vqsjtd84k7244 //注意這里的ID是隨機的
[root@web1 ~]# cat sess_ahilcq9bguot0vqsjtd84k7244
注意:可用修改index.php和home.php兩個文件的內(nèi)容套硼,添加頁面顏色屬性卡辰,以區(qū)別后端兩臺不同的服務(wù)器:。
(3)部署測試頁面(Web2服務(wù)器)邪意。
測試頁面可以參考lnmp_soft/php_scripts/php-memcached-demo.tar.gz九妈。
[root@web2 ~]# cd lnmp_soft/php_scripts/
[root@web2 php_scripts]# tar -xf php-memcached-demo.tar.gz
[root@web2 php_scripts]# cd php-memcached-demo
[root@web2 php-memcached-demo]# cp -a * /usr/local/nginx/html/
(4)瀏覽器直接訪問后端服務(wù)器的測試頁面(Web2服務(wù)器)。
[root@web2 ~]# firefox http://192.168.2.100 //填寫賬戶信息
[root@web2 ~]# cd /var/lib/php/session/ //查看服務(wù)器本地的Session信息
[root@web2 ~]# ls
sess_qqek1tmel07br8f63d6v9ch401 //注意這里的ID是隨機的
[root@web2 ~]# cat sess_qqek1tmel07br8f63d6v9ch401
注意:可用修改index.php和home.php兩個文件的內(nèi)容雾鬼,添加頁面顏色屬性萌朱,以區(qū)別后端兩臺不同的服務(wù)器:。
(5)瀏覽器訪問前端調(diào)度器測試(不同后端服務(wù)器Session不一致)策菜。
推薦使用google瀏覽器測試晶疼。
[root@client ~]# google-chrome http://192.168.4.5
//填寫注冊信息后,刷新又憨,還需要再次注冊翠霍,說明兩臺計算機使用的是本地Session
//第二臺主機并不知道你再第一臺主機已經(jīng)登錄,第一臺主機的登錄信息也沒有傳遞給第二臺主機
PHP實現(xiàn)session共享
通過修改PHP-FPM配置文件蠢莺,實現(xiàn)session會話共享寒匙,本案例需要在練習(xí)三的基礎(chǔ)上實現(xiàn):
配置PHP使用memcached服務(wù)器共享Session信息
客戶端訪問兩臺不同的后端Web服務(wù)器時,Session 信息一致
在練習(xí)三拓撲的基礎(chǔ)上躏将,Nginx服務(wù)器除了承擔(dān)調(diào)度器外锄弱,還需要擔(dān)任memcached數(shù)據(jù)庫的角色,并在兩臺后端LNMP服務(wù)器上實現(xiàn)PHP的session會話共享祸憋。拓撲結(jié)構(gòu)如圖所示会宪。
一:構(gòu)建memcached服務(wù)
(1)安裝Memcached服務(wù)(如果192.168.4.5上已經(jīng)有本軟件包,此步驟可以忽略)
[root@proxy ~]# yum -y install memcached
(2)啟動服務(wù)并查看網(wǎng)絡(luò)連接狀態(tài)驗證是否開啟成功:
[root@proxy ~]# systemctl restart memcached
[root@proxy ~]# netstat -anptu | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 2839/memcached
tcp 0 0 :::11211 :::* LISTEN 2839/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 2839/memcached
udp 0 0 :::11211 :::* 2839/memcached
(3)關(guān)閉SELinux蚯窥、防火墻
[root@proxy ~]# setenforce 0
[root@proxy ~]# firewall-cmd --set-default-zone=trusted
二:在后端LNMP服務(wù)器上部署Session共享
注意:這些操作在兩臺后端Web服務(wù)器上均需要執(zhí)行狈谊,以下操作以Web1(192.168.2.100)服務(wù)器為例。
(1)為PHP添加memcache擴展
注意沟沙,因為后端兩臺web服務(wù)器(web1,web2)都需要連接memcached數(shù)據(jù)庫河劝,所以兩臺主機都需要安裝PHP擴展模塊(下面也web1為例)。
[root@web1 ~]# yum -y install php-pecl-memcache
(2)修改PHP-FPM配置文件矛紫,并重啟服務(wù)
注意赎瞎,因為后端兩臺web服務(wù)器(web1,web2)都需要修改配置文件(下面也web1為例)。
[root@web1 ~]# vim /etc/php-fpm.d/www.conf //修改該配置文件的兩個參數(shù)
//文件的最后2行
修改前效果如下:
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
//原始文件颊咬,默認定義Sessoin會話信息本地計算機(默認在/var/lib/php/session)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
修改后效果如下:
php_value[session.save_handler] = memcache
php_value[session.save_path] = "tcp://192.168.2.5:11211"
//定義Session信息存儲在公共的memcached服務(wù)器上务甥,主機參數(shù)中為memcache(沒有d)
//通過path參數(shù)定義公共的memcached服務(wù)器在哪(服務(wù)器的IP和端口)
[root@web1 ~]# systemctl restart php-fpm
三:客戶端測試
客戶端使用瀏覽器訪問兩臺不同的Web服務(wù)器牡辽。
操作步驟與練習(xí)三一致,最終可以獲得相關(guān)的Session ID信息敞临。
原文鏈接:https://blog.csdn.net/chen77716/article/details/5949166