1.1 資料庫對比 緩存: 將數據存儲到記憶體中,只有當磁碟勝任不了的時候,才會啟用緩存 缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是為了應付大併發的業務。 資料庫: mysql(關係型資料庫,能夠保證數據一致性,保證數據不丟失,當因為功能太多,導致性能不高) 數據參考 緩存資料庫: memc ...
1.1 資料庫對比
緩存: 將數據存儲到記憶體中,只有當磁碟勝任不了的時候,才會啟用緩存
缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是為了應付大併發的業務。
資料庫: mysql(關係型資料庫,能夠保證數據一致性,保證數據不丟失,當因為功能太多,導致性能不高) ===數據參考
緩存資料庫: memcache redis(非關係型資料庫,性能極高,但不保證數據完整性) === 業務的數據提供者
memcachedb 會將記憶體的數據寫入到磁碟中
redis 主要工作場所是記憶體中,但是定期備份記憶體數據到硬碟
1.1.1 資料庫的選擇
數據存儲,數據倉庫選擇mysql這種磁碟的資料庫
高併發,業務大的應用選擇memcache這種記憶體資料庫
1.1.2 資料庫分類
關係型資料庫 mysql
非關係型資料庫(NOSQL) memcached redis MongoDB
1.2 memcached介紹
Memcached是一款開源的、高性能的純記憶體緩存服務軟體。Mem是記憶體的意思,cache是緩存的意思,d是daemon的意思。
memcache 是項目名稱,也是一款軟體,其架構是C/S架構。
memcached官網:http://memcached.org/
1.2.1 memcache優點
① 對於用戶來講,用戶訪問網站更快了,體驗更好了。
②對網站來說,資料庫壓力降低了。只有當記憶體沒有數據時才會去請求資料庫。第一次寫入的數據也會請求資料庫。一般公司沒有預熱,只有當用戶讀取過資料庫才會放到Memcached中。
② 提升了網站的併發訪問,減少伺服器數量。
1.3 Memcached在企業中使用場景
1.3.1 作為資料庫的前端緩存應用
當資料庫(mysql)承受不了大併發的請求時,可以將數據緩存到記憶體中(緩存資料庫),然後就可以解決
作為資料庫的前端緩存最大目的:減少資料庫被大量訪問的壓力
1.3.2 作為集群後端的session會話保持
session存儲在文件,資料庫,memcache,或記憶體等的服務端上,
cookie 存放在客戶端瀏覽器上。
session是一個存在伺服器上的類似於一個散列表格的文件。裡面存有我們需要的信息,在我們需要用的時候可以從裡面取出來。
session依賴cookie存在,請求客戶端到達服務端後,服務端會隨機生成一個字元串,作為該用戶的標識,該字元串通過cookie返回給客戶端,客戶端瀏覽器會以該字元串為key放到session id裡面,隨機字元串的key裡面可以先沒有值。如果用戶再次提交,請求信息中的用戶名密碼等用戶信息保存在隨機字元串的value中,請求到達服務端,用戶名密碼正確,隨機字元串會被授權,提一個標記給到sessionid中的隨機字元串的value中,證明該用戶已經是登錄狀態,客戶端再次帶著該隨機字元串訪問服務端,服務端會知道該用戶已經登錄不需驗證,直接返回請求的信息。
session和cookie區別
1、cookie數據存放在用戶的瀏覽器上,session數據存儲在伺服器上
2、cookie在本地的瀏覽器中,可以被提取分析,安全性差。為了安全,登錄賬戶等信息可以緩存在session中。
3、session會在一定時間內保存在伺服器上,訪問量增大會給伺服器帶來壓力,可以使用緩存工具,如memcache等
1.3.3 網站開發如何判斷用戶信息
最開始的技術方法:伺服器在你的瀏覽器中寫一個cookies,這個cookies就包含了你的用戶名及登錄信息。因為cookies是存儲在本地瀏覽器中,所以第三方工具很容易盜取cookies信息。
最開始:
cookies cookies名字:內容(用戶名,登錄信息)
改進後:
本地瀏覽器存放:
cookies cookies名字:內容(session id 編號)
伺服器存放:
session session id:內容(用戶名,登錄信息)
主流使用場景:cookies + session
1.3.4 session共用的不同解決方案
1、session文件提供NFS共用
2、session文件提供rsync scp共用
3、將session的內容存放在資料庫(mysql)中,所有的機器都可以通過ip:port讀取
4、將session的內容存放在緩存資料庫中,所有的機器都可以通過ip:port讀取
好處:利用斷電、重啟丟失數據的特性。定時清理數據;提高併發
1.3.5 memcache原理優點
啟動Memcached吋,根據指定的記憶體大小參數,會被分配一個記憶體個間。當我們讀取資料庫的各類業務數據後,數據會同吋放入Memcached緩存中,,下一次用戶請求同樣的數據,程式直接去Memcached取數據返回給用戶。
優點:
① 對於用戶來講,用戶訪問網站更快了,體驗更好了。#
② 對網站來說,資料庫壓力降低了。只有當記憶體沒有數據時才會去請求資料庫。第一次寫入的數據 也會請求資料庫。一般公司沒有預熱,只有,用戶讀取過資料庫才會放到Memcached中。
③ 提升了網站的併發訪問,減少伺服器數最。
原理圖
1.4 Memcached分散式緩存集群
memcached天生不支持分散式集群,需要通過程式支持分散式存儲
1.4.1 Memcached分散式緩存集群的特點
1. 所有MC伺服器記憶體的內容都是不一樣的。這些伺服器內容加起來接近資料庫的容量。比如1T的資料庫,一臺緩存資料庫的記憶體沒有那麼大,因此分成10台緩存伺服器。
2. 通過在客戶端(Web)程式或者MC的負載均衡器上用HASH演算法,讓同一內容都分配到一個MC伺服器。
3. 普通的HASH演算法對於節點宕機會帶來大量的數據流動(失效),可能會引起雪崩效應。
4. 一致性HASH可以讓節點宕機對節點的數據流動(失效)降到最低。
普通的hash演算法
首先將key處理為一個32位字元串,取前8位,在經過hash計算處理成整數並返回,然後映射到其中一臺伺服器這樣得到其中一臺伺服器的配置,利用這個配置完成分散式部署。在伺服器數量不發生變化的情況下,普通hash分佈可以很好的運作,當伺服器的數量發生變化,問題就來了。試想,增加一臺伺服器,同一個key經過hash之後,與伺服器取模的結果和沒增加之前的結果肯定不一樣,這就導致了,之前保存的數據丟失。
一致性hash演算法
一致性哈希演算法
優點:在分散式的cache緩存中,其中一臺宕機,遷移key效率最高
將伺服器列表進行排序,根據mHash($key) 匹配相鄰伺服器
一致性hash演算法 將數據流動降到最低
參考資料
http://blog.csdn.net/cywosp/article/details/23397179 http://blog.csdn.net/zhangskd/article/details/50256111
第2章 memcached使用
2.1 安裝memcached
2.1.1 環境說明
[root@cache01 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@cache01 ~]# uname -r 3.10.0-693.el7.x86_64 [root@cache01 ~]# getenforce Disabled [root@cache01 ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) [root@cache01 ~]# hostname -I 10.0.0.21 172.16.1.21
2.1.2 安裝memcached
[root@cache01 ~]# yum -y install memcached
2.1.3 查看配置
[root@cache01 ~]# cat /etc/sysconfig/memcached PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS=""
2.1.4 查看啟動腳本
[root@cache01 ~]# cat /usr/lib/systemd/system/memcached.service [Unit] Description=Memcached Before=httpd.service After=network.target [Service] Type=simple EnvironmentFile=-/etc/sysconfig/memcached ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS [Install] WantedBy=multi-user.target
2.1.5 啟動服務
[root@cache01 ~]# systemctl start memcached.service
2.2 管理memcached
2.2.1 memcached資料庫語法格式
set key 0 0 10 <command name> <key> <flags> <exptime> <bytes>\r\n
\n 換行且游標移至行首
\r 游標移至行首,但不換行
參數 |
說明 |
<flags> |
是在取回內容時,與數據和發送塊一同保存伺服器上的任意16位無符號整形(用十進位來書寫)。客戶端可以用它作為“位域”來存儲一些特定的信息;它對伺服器是不透明的。 |
<exptime> |
是終止時間。如果為0,該項永不過期(雖然它可能被刪除,以便為其他緩存項目騰出位置)。如果非0(Unix時間戳或當前時刻的秒偏移),到達終止時間後,客戶端無法再獲得這項內容 |
<bytes> |
是隨後的數據區塊的位元組長度,不包括用於分頁的“\r\n”。它可以是0(這時後面跟隨一個空的數據區塊)。 |
<data block>\r\n |
<data block> 是大段的8位數據,其長度由前面的命令行中的<bytes>指定。 |
2.2.2 資料庫使用
寫入讀取數據
[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 "set key009 0 0 11\r\noldboy0987\r\n"|nc 10.0.0.21 11211 [root@cache01 ~]# printf "get key009\r\n"|nc 10.0.0.21 11211 END
寫入數據長度不符合,定義過小
[root@cache01 ~]# printf "set key010 0 0 9\r\noldboy0987\r\n"|nc 10.0.0.21 11211 CLIENT_ERROR bad data chunk ERROR [root@cache01 ~]# printf "get key010\r\n"|nc 10.0.0.21 11211 END
時效性
[root@cache01 ~]# printf "set key011 0 10 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211 STORED [root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211 VALUE key011 0 10 oldboy0987 END [root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211 END
刪除數據
[root@cache01 ~]# printf "delete key008\r\n"|nc 10.0.0.21 11211 DELETED [root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211 END
2.3 memcache php版本客戶端安裝使用
命令集
#編譯進去php_mem tar zxvf memcache-2.2.5.tgz cd memcache-2.2.5 /application/php/bin/phpize ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir make make install # 激活php_memcached sed -i '$a extension=memcache.so' /application/php/lib/php.ini pkill php /application/php/sbin/php-fpm -t /application/php/sbin/php-fpm /application/php/bin/php -m|grep memcache
檢查當前環境
查看php的模塊
1 查看php的模塊 2 [root@web06 ~]# /application/php/bin/php -m 3 [PHP Modules] 4 bcmath 5 Core 6 ctype 7 curl 8 date 9 dom 10 ereg 11 fileinfo 12 filter 13 ftp 14 gd 15 hash 16 iconv 17 json 18 libxml 19 mbstring 20 mcrypt 21 mhash 22 mysql 23 mysqlnd 24 openssl 25 pcntl 26 pcre 27 PDO 28 pdo_mysql 29 pdo_sqlite 30 Phar 31 posix 32 Reflection 33 session 34 shmop 35 SimpleXML 36 soap 37 sockets 38 SPL 39 sqlite3 40 standard 41 sysvsem 42 tokenizer 43 xml 44 xmlreader 45 xmlrpc 46 xmlwriter 47 xsl 48 zlib 49 50 [Zend Modules]View Code 查看php的模塊
執行過程
編譯安裝
[root@web06 memcache-2.2.5]# make install Installing shared extensions: /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/ [root@web06 memcache-2.2.5]# ls /application/php/lib/php/extensions/no-debug-non-zts-20121212/ memcache.so [root@web06 memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini [root@web06 memcache-2.2.5]# pkill php [root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm -t [17-Nov-2017 11:39:13] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful [root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm [root@web06 memcache-2.2.5]# /application/php/bin/php -m|grep memcache memcache
2.3.1 編寫測試文件
[root@web01 blog]# 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('key20171117', 'hello,world'); $get_value = $memcache->get('key20171117'); echo $get_value; ?>
瀏覽器訪問
資料庫讀取測試
[root@cache01 ~]# printf "get key20171117 \r\n"|nc 10.0.0.21 11211 VALUE key20171117 0 11 hello,world END
2.4 web管理memcached
使用的軟體memadmin
官網:http://www.junopen.com/memadmin/
將程式包放如站點目錄,瀏覽器進行訪問即可
[root@web06 tools]# tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/
預設用戶名密碼為admin
添加一個新的memcached伺服器
web界面管理全中文,較為簡單
2.5 memcached數據緩存
通過程式實現
2.5.1 blog站點實現memcached存儲
[root@web06 ~]# cat /application/nginx/html/blog/wp-content/object-cache.php
2.6 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函數
本文出自“慘綠少年”,歡迎轉載,轉載請註明出處!http://blog.znix.top