首頁 運維干貨memcached 緩存數據庫應用實踐

memcached 緩存數據庫應用實踐

運維派隸屬馬哥教育旗下專業運維社區,是國內成立最早的IT運維技術社區,歡迎關注公眾號:yunweipai
領取學習更多免費Linux云計算、Python、Docker、K8s教程關注公眾號:馬哥linux運維

緩存: 將數據存儲到內存中,只有當磁盤勝任不了的時候,才會啟用緩存

      缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是為了應付大并發的業務。

數據庫: 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的意思。

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取數據返回給用戶。

 優點:

 ?、?nbsp;   對于用戶來講,用戶訪問網站更快了,體驗更好了。#

 ?、?nbsp;  對網站來說,數據庫壓力降低了。只有當內存沒有數據時才會去請求數據庫。第一次寫入的數據 也會請求數據庫。一般公司沒有預熱,只有,用戶讀取過數據庫才會放到Memcached中。

 ?、?nbsp;  提升了網站的并發訪問,減少服務器數最。

原理圖

1.4 Memcached分布式緩存集群

  memcached天生不支持分布式集群,需要通過程序支持分布式存儲

1.4.1 Memcached分布式緩存集群的特點

     1. 所有MC服務器內存的內容都是不一樣的。這些服務器內容加起來接近數據庫的容量。比如1T的數據庫,一臺緩存數據庫的內存沒有那么大,因此分成10臺緩存服務器。

     2. 通過在客戶端(Web)程序或者MC的負載均衡器上用HASH算法,讓同一內容都分配到一個MC服務器。

     3. 普通的HASH算法對于節點宕機會帶來大量的數據流動(失效),可能會引起雪崩效應。

     4. 一致性HASH可以讓節點宕機對節點的數據流動(失效)降到最低。

普通的hash算法

memcached 緩存數據庫應用實踐插圖

 首先將key處理為一個32位字符串,取前8位,在經過hash計算處理成整數并返回,然后映射到其中一臺服務器這樣得到其中一臺服務器的配置,利用這個配置完成分布式部署。在服務器數量不發生變化的情況下,普通hash分布可以很好的運作,當服務器的數量發生變化,問題就來了。試想,增加一臺服務器,同一個key經過hash之后,與服務器取模的結果和沒增加之前的結果肯定不一樣,這就導致了,之前保存的數據丟失。

一致性hash算法

memcached 緩存數據庫應用實踐插圖1

一致性哈希算法

  優點:在分布式的cache緩存中,其中一臺宕機,遷移key效率最高

  將服務器列表進行排序,根據mHash($key) 匹配相鄰服務器

一致性hash算法  將數據流動降到最低

參考資料

http://blog.csdn.net/cywosp/article/details/23397179http://blog.csdn.net/zhangskd/article/details/50256111

第2章 memcached使用

2.1 安裝memcached

2.1.1 環境說明

[root@cache01 ~]# cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core) [root@cache01 ~]# uname -r3.10.0-693.el7.x86_64[root@cache01 ~]# getenforceDisabled[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 -I10.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.serviceAfter=network.target
[Service]Type=simpleEnvironmentFile=-/etc/sysconfig/memcachedExecStart=/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位數據,其長度由前面的命令行中的<b

2.2.2 數據庫使用

寫入讀取數據

[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211STORED[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211VALUE key008 0 10oldboy0987END

寫入數據長度不符合,定義過大

[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 11211END

寫入數據長度不符合,定義過小

[root@cache01 ~]# printf "set key010 0 0 9\r\noldboy0987\r\n"|nc 10.0.0.21 11211CLIENT_ERROR bad data chunkERROR[root@cache01 ~]# printf "get key010\r\n"|nc 10.0.0.21 11211END

時效性

[root@cache01 ~]# printf "set key011 0 10 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211STORED[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211VALUE key011 0 10oldboy0987END[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211END
刪除數據[root@cache01 ~]# printf "delete key008\r\n"|nc 10.0.0.21 11211DELETED[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211END

2.3 memcache php版本客戶端安裝使用

命令集

#編譯進去php_memtar zxvf memcache-2.2.5.tgzcd memcache-2.2.5/application/php/bin/phpize./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dirmakemake install# 激活php_memcachedsed -i '$a extension=memcache.so' /application/php/lib/php.inipkill php/application/php/sbin/php-fpm -t/application/php/sbin/php-fpm/application/php/bin/php -m|grep memcache

檢查當前環境

查看php的模塊

memcached 緩存數據庫應用實踐插圖2

執行過程

編譯安裝

[root@web06 memcache-2.2.5]# make installInstalling 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 memcachememcache

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;?>

瀏覽器訪問

memcached 緩存數據庫應用實踐插圖3

數據庫讀取測試

[root@cache01 ~]# printf "get key20171117 \r\n"|nc 10.0.0.21 11211 VALUE key20171117 0 11hello,worldEND

memcached 緩存數據庫應用實踐插圖42.4 web管理memcached

  默認用戶名密碼為admin

memcached 緩存數據庫應用實踐插圖5

   添加一個新的memcached服務器

memcached 緩存數據庫應用實踐插圖6

memcached 緩存數據庫應用實踐插圖7

   web界面管理全中文,較為簡單

memcached 緩存數據庫應用實踐插圖8

2.5 memcached數據緩存

通過程序實現

2.5.1 blog站點實現memcached存儲

[root@web06 ~]# cat /application/nginx/html/blog/wp-content/object-cache.php
memcached 緩存數據庫應用實踐插圖9




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函數

鏈接:https://www.cnblogs.com/clsn/p/7999510.html

                                                             (版權歸原作者所有,侵刪)

本文鏈接:http://www.royaladd.com/45323.html

網友評論comments

發表回復

您的電子郵箱地址不會被公開。

暫無評論

Copyright ? 2012-2022 YUNWEIPAI.COM - 運維派 京ICP備16064699號-6
掃二維碼
掃二維碼
返回頂部
欧美激情视频一区二区|国产精品毛片va一区二区|999国内精品永久免费|国产无码sm视频在线观看