搭建Memcache緩存數據庫
為什麽用緩存數據庫
MySQL:磁盤上的數據庫,數據寫入讀取相對較慢
Memcached:內存中的數據庫,數據讀寫都快,但是數據易丟失
數據存儲,數據倉庫選擇MySQL這種磁盤的數據庫
高並發,業務大的應用選擇Memcached這種內存數據庫
工作中,MySQL+Memcached搭配使用
Memcached介紹
Memcached是一款開源的、高性能的純內存緩存服務軟件。Mem是內存的意
思,cache是緩存的意思,d是daemon的意思。
http://memcached.org/
Memcached在企業中使用場景一
優點:
① 對於用戶來講,用戶訪問網站更快了,體驗更好了。
② 對網站來說,數據庫壓力降低了。只有當內存沒有數據時才會去請求數據庫。第一次寫入的數據也會請求數據庫。一般公司沒有預熱,只有當用戶讀取過數據庫才會放到Memcached中。
③ 提升了網站的並發訪問,減少服務器數量。
作為數據庫的前段緩存應用,減少數據庫被大量訪問的壓力。
Memcached在企業中使用場景二
作為集群後端的session會話保持
Cookies和Session
網站程序判斷用戶登陸信息,最開始的技術方法:服務器在你的瀏覽器中寫一個cookies,這個cookies
就包含了你的用戶名及登錄信息。因為cookies是存儲在本地瀏覽器中,所以第三方工具很容易盜取 cookies中的隱私信息。
最開始:
cookies cookies名字:內容(用戶名,登錄信息)
改進:
本地瀏覽器:
cookies cookies名字:內容(session id 編號)
服務器:
session session id:內容(用戶名,登錄信息)
主流使用場景:cookies + session
Memcached分布式緩存集群
Memcached天生不支持分布式集群,只能通過程序支持分布式存儲
Memcached分布式緩存集群的特點:
所有MC服務器內存的內容都是不一樣的。這些服務器內容加起來接近數據
庫的容量。比如1T的數據庫,一臺緩存數據庫的內存沒有那麽大,因此分
成10臺緩存服務器。
普通哈希算法
通過在客戶端(Web)程序或者MC的負載均衡器上用HASH算法,讓同一內容都分配到一個
普通的HASH算法對於節點宕機會帶來大量的數據流動(失效),可能會引起雪崩效應。
一致性哈希算法
1.首先求出memcached服務器(節點)的哈希值,並將其配置到0~232的圓(continuum)上。
2.然後采用同樣的方法求出存儲數據的鍵的哈希值,並映射 到相同的圓上。
3.然後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。如果超過232仍然找不到服務器,就會保存到第一臺memcached服務器上。
服務端部署
環境裝備
從CentOS7模板機全新克隆一臺新主機
IP規劃為10.0.0.21/172.16.1.21,主機名為cache01
其次,準備一臺能夠打開wordpress的web01機器(CentOS6),仿真企業真
實環境,多系統混合使用
安裝memcached
[root@cache01 ~]# yum -y install memcached
查看配置文件
[root@cache01 ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
啟動memcached
[root@cache01 ~]# systemctl start memcached.service
[root@cache01 ~]# systemctl status memcached.service
[root@cache01 ~]# netstat -tunlp|grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 1491/memcached
tcp6 0 0 :::11211 :::* LISTEN 1491/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 1491/memcached
udp6 0 0 :::11211 :::* 1491/memcached
練習memcached命令語法
增刪改查
[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n" 寫
set key008 0 0 10
oldboy0987
[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211 保存
STORED
[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211 查看
VALUE key008 0 10
oldboy0987
END
[root@cache01 ~]# printf "delete key008\r\n"|nc 10.0.0.21 11211 刪除
DELETED
終止時間設置
[root@cache01 ~]# printf "set key008 0 6 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211 增加6秒終止時間
STORED
[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211
VALUE key008 0 10
oldboy0987
END
[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211
END
語法說明
set key 0 0 10 \r\n oldboy0987 \r\n
<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
<flags> | 是在取回內容時,與數據和發送塊一同保存服務器上的任意16位無符號整形(用十進制來書寫)。客戶端可以用它作為“位域”來存儲一些特定的信息;它對服務器是不透明的。 |
<exptime> | 是終止時間。如果為0,該項永不過期(雖然它可能被刪除,以便為其他緩存項目騰出位置)。如果非0 (Unix時間戳或當前時刻的秒偏移),到達終止時間後,客戶端無法再獲得這項內容。 |
<bytes> | 是隨後的數據區塊的字節長度,不包括用於分頁的“\r\n”。它可以是0(這時後面跟隨一個空的數據區塊)。 |
<data block> | 是大段的8位數據,其長度由前面的命令行中的<bytes>指定。 |
\n 換行且光標移至行首 \r 光標移至行首,但不換行 |
客戶端部署
安裝包:https://pan.baidu.com/s/1qZPLmkk
[root@web tools]# tar zxf memcache-2.2.5.tgz
[root@web tools]# cd memcache-2.2.5
重新編譯php添加memcache模塊
[root@web memcache-2.2.5]# /application/php/bin/phpize
[root@web memcache-2.2.5]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
[root@web memcache-2.2.5]# make && make install
[root@web memcache-2.2.5]# ls /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
memcache.so
[root@web memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini
[root@web memcache-2.2.5]# pkill php
[root@web memcache-2.2.5]# /application/php/sbin/php-fpm -t
[11-Jan-2018 07:44:56] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful
[root@web memcache-2.2.5]# /application/php/sbin/php-fpm
[root@web memcache-2.2.5]# /application/php/bin/php -m|grep memcache
memcache
php代碼測試
[root@web memcache-2.2.5]# cat >> /application/nginx/html/blog/mc.php<<'EOF'
> <?php
> $memcache = new Memcache;
> $memcache->connect('10.0.0.21', 11211) or die ("Could not connect");
> $memcache->set('key20180111', 'hello,world');
> $get_value = $memcache->get('key20180111');
> echo $get_value;
> ?>
> EOF
[root@web memcache-2.2.5]# cat /application/nginx/html/blog/mc.php
<?php
$memcache = new Memcache;
$memcache->connect('10.0.0.21', 11211) or die ("Could not connect");
$memcache->set('key20180111', 'hello,world');
$get_value = $memcache->get('key20180111');
echo $get_value;
?>
服務端查看
[root@cache01 ~]# printf "get key20180111\r\n"|nc 10.0.0.21 11211
VALUE key20180111 0 11
hello,world
END
Web界面管理memcached
有敏感信息發不了,哈哈哈
[root@web tools]# tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/
Memcache數據緩存
使用memcached緩存wordpress博文數據
[root@web tools]# cd /application/nginx/html/blog/wp-content/
腳本:https://pan.baidu.com/s/1o9bKt2U
[root@web wp-content]# rz -E
rz waiting to receive.
[root@web wp-content]# sed -i 's#127.0.0.1#10.0.0.21#' object-cache.php
寫一篇博文
Memcached Session共享
方法1:通過程序實現,web01只需要往memcahce寫session,web02從memcahce讀session,
當作普通數據讀寫(更具有通用性)
方法2:通過php的配置文件,php默認將session存儲在文件中,修改為存儲在memcached
中
sed -i 's#session.save_handler = files#session.save_handler = memcache#;$a
session.save_path = "tcp://10.0.0.21:11211"' /application/php/lib/php.ini
使用這個功能,需要使用php的session函數
搭建Memcache緩存數據庫