Memcache緩存資料庫以及lnmp+memcache實現session共享

一、傳統Web架構的問題:許多Web應用的數據存放在RDBMS(關係型數據庫)中,應用服務器從中讀取數據並在瀏覽器中顯示,隨著數據量的增大,訪問的集中,就會出現RDBMS的負擔加重、數據庫響應惡化、網站顯示延遲等重大影響。

mysql sqlserver oracle

數據庫,數據表,數據列。表和表關係--關係型數據庫

缺點:數據存在硬盤裡,讀寫較慢

NOSQL緩存數據庫(比上面的快300倍)

KV數據庫:key=value;key=value;i=33;j=55相互之間沒關係,關係簡單,沒有複雜的表以及結構

優點:數據存在內存裡,讀取快,關係簡單

缺點:無法保存。重啟就沒有了

目前做法:在傳統數據庫前加緩存數據庫,若客戶請求的數據能在緩存數據庫中找到則直接返回,若找不到,從傳統數據庫中查找並記錄在緩存數據庫中

Ps:手機常用數據褲:sqlite,迷你數據庫

數據存儲位置對比:

性能:CPU緩存>內存>硬盤>數據庫

數據庫優點:無與倫比的查詢能力,因此數據庫裡只存放字符內容

可將文件,視頻,音樂等文件用關鍵詞描述組成數據庫的方便查找

二、memcached緩存服務器

用途:用來集中緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態web應用的相應數度。

Ps: /usr/lib/systemd/system/下有xxx.service文件才有systemctl 指令,一般rpm源碼包安裝都沒有,可手動在目錄下複製類似的文件進行修改。

構建memcached服務

1.yum安裝軟件包memcached

2.Memcache配置文件(無需修改,瞭解)

/usr/lib/systemd/system/memcached.service

ExexStart=/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS //systemctl啟動命令

/etc/sysconfig/memcached//存放啟動的變量內容

Ps:用戶上傳視頻-------》優庫 上傳完往往無法立刻搜索到,本身已有緩存,還沒過期,過會再搜索。緩存過期,重新從數據庫搜索到內容

人搜索------緩存20個----數據庫

用戶上傳視頻-------》優庫

人搜索,從緩存中搜索------緩存還是20個----無法找到上傳視頻

過會,緩存過期

人搜索------緩存21.22.23個----重新查找數據庫--耗時比之前慢了一點,用於重新緩存

3.啟動服務並查看網絡連接狀態驗證是否開啟成功,並關閉防火牆和selinux

Systemctl start memcached

Systemctl status memcached

Netstat -anptu | grep memcached

netstat命令可以查看系統中啟動的端口信息,該命令常用選項如下:

-a顯示所有端口的信息

-n以數字格式顯示端口號

-t顯示TCP連接的端口

-u顯示UDP連接的端口

-l顯示服務正在監聽的端口信息,如httpd啟動後,會一直監聽80端口

-p顯示監聽端口的服務名稱是什麼(也就是程序名稱)

注意:在RHEL7系統中,使用ss命令可以替代netstat,功能與選項一樣。

4.安裝並使用telnet訪問memcached服務器來測試memcached服務器功能,包括增刪改查等操作(沒有mysql之類的連接工具)

Telnet 192.168.4.5 11211

add myname 0 180 10 //新建,myname不存在則添加,存在則報錯,防止數據覆蓋;

replace myname 0 180 10 //覆蓋替換,如果myname不存在則報錯

set myname 0 180 10 //添加或替換變量,add與replace結合

get myname //讀取變量

append myname 0 180 10 //向變量中追加10個數據,加上原來的一共20

delete myname //刪除變量

stats //查看狀態

flush_all //清空所有

quit //退出登錄

0表示不壓縮,180為數據緩存時間,10為需要存儲的數據字節數量。

三、由於telnet使用麻煩,工作中使用不方便,需要用php連接數據庫比較方便,而php連接前提得有LNMP,最終實現LNMP+memchched

構建:

1.搭建好lnmp

2.安裝php連接memcache數據庫的擴展包並重啟php

Yum list | grep memcache ----> php-pecl-memcache

3.修改nginx配置文件,設置動靜分離,使得客戶端可訪問動態php頁面

4.訪問測試文件(mem.php),驗證是否連接成功

四、session,cookie

Session:存儲在服務器端,保存用戶名、密碼等信息

Cllkies:由服務端下發給客戶端,保存在客戶端的一個文件裡,保存的內容主要包括:SessionID,賬號名,過期時間,路徑和域

例子:

人---------------------》超市(登記信息辦卡)

卡(id號)-----------001.txt【存信息文件】

用戶(瀏覽器)------------------->web服務器

Cookie=001(卡號)

請求頭信息內有cookie說明不是第一次訪問

存在問題:用戶訪問代理服務器,服務器輪詢到不同的web服務器,每次訪問到達不同的服務器,需要多個session和cookie

解決:使用另一臺服務器存儲session信息並返回cookie給客戶端,web服務器從此服務器讀取session信息,實驗中調度器兼存儲服務器使用

項目:通過Nginx調度器負載後端兩臺Web服務器,實現以下目標:

1.部署Nginx為前臺調度服務器

2.調度算法設置為輪詢

3.後端為兩臺LNMP服務器

4.部署測試頁面,查看PHP本地的Session信息

方案:使用4臺虛擬機,其中一臺作為Nginx前端調度器服務器,兩臺虛擬機部署為LNMP

服務器Web1,Web2,還有一臺測試訪問的客戶機。

實施方法:

1.部署後端LNMP服務器相關軟件

--gcc openssl-devel pcre-devel zlib-devel

--源碼包nginx

--mariadb mariadb-server mariadb-devel

--php php-mysql php-fpm(壓縮包內,yum裡沒有)

2.修改Nginx配置文件(默認首頁添加php,動靜分離實現動態網頁的訪問)

3.啟動LNMP相關服務,關閉防火牆和selinux

--nginx mariadb php-fpm

Systemctl status 服務名 //確認服務開啟

4.部署前端Nginx調度服務器

A.源碼包安裝nginx

B.修改nginx配置文件(只做輪詢,無需不提供web服務)

通過upstream定義後端服務器地址池,默認調度策略為輪詢,使用proxy_pass調用upstream定義的服務器地址池:

http下:

Upstream webs{

Server 192.168.2.100:80;

Server 192.168.2.200:80;

}

Server{

Location / {

Proxy_pass http://webs;

}

}

C.重新加載nginx並通過瀏覽器訪問測試頁面(curl 192.168.4.5看是否輪詢)

5.在web1和web2上將測試頁面替換成目標頁面(將目標頁面的相關文件複製到網頁根目錄下)

6.目前完成的效果為客戶端訪問前端調度器,進入登陸頁面,填寫信息後刷新。還需要再次註冊,說明兩臺計算機使用的是本地的Session,造成問題的原因出現在第二臺主機並不知道用戶已經在第一臺主機登陸,第一臺主機的登陸信息也沒有傳遞給第二臺主機。

7.完善:PHP實現session共享,通過修改php-fpm配置文件,事項session會話共享,本例使用memcached服務器共享session,為節省虛擬機數量,前端服務器作為作為共享服務器使用。

A.搭建memcache服務

B.啟動服務,關防火牆,selinux

C.在web1和web2上安裝連接memcache數據庫的php擴展模塊--php-pecl-memcache

D.修改/etc/php-fpm.d/www.conf配置文件最後兩行

Php_value[session.save_handler]=files-->memcache

//定義session信息從本地修改為存儲在公共的memcache服務器上,主機參數中為memcache,沒有d,d為服務,在服務器上開啟

Php_value[session.save_path]=/var/lib/php/session-->”tcp://192.168.4.5:11211”//通過path參數定義公共的memcached服務器在哪(通過tcp協議尋找ip以及提供memcached服務的端口)

E.重啟php-fpm服務,並在客戶端訪問,效果應為登陸一次後,在不同的web服務器上均顯示後續內容,無需重複登陸。


分享到:


相關文章: