Linux系統架構----memcached理論+部署

前言:

  • memcached是一套分佈式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但被許多網站使用。這是一套開放源代碼軟件,以BSD license授權發佈。
  • memcached缺乏認證以及安全管制,這代表應該將memcached服務器放置在防火牆後。
  • memcached的API使用三十二比特的循環冗餘校驗(CRC-32)計算鍵值後,將數據分散在不同的機器上。當表格滿了以後,接下來新增的數據會以LRU機制替換掉。由於memcached通常只是當作緩存系統使用,所以使用memcached的應用程序在寫回較慢的系統時(像是後端的數據庫)需要額外的代碼更新memcached內的數據。
  • memcached官網:http://memcached.org/

一、Memcached簡介

1.1 Memcached 原理
  • memcached是一種緩存技術,在存儲在內存中(高性能分佈式內存緩存服務器).
  • 目的 : 提速
    • 傳統的都是把數據保存在關係型數據庫管理系統既RDBMS,客戶端請求時會從RDBS中 讀取數據並在瀏覽器中顯示,這樣當訪問量過大時或集中時,導致RSBMS負擔過重,數據庫響應惡化,瀏覽器中顯示延遲等嚴重問題,使用memcached減少數據庫查詢和訪問次數以 提供訪問速度,提供擴展性)
    • memcached爲key->value非關係型數據庫,key爲一般子串,值唯一.value除了php中的資源不能存,其它的數據都能存儲(字符串,數值,數組,對象,布爾值 ,null,二進制<圖片,視頻>)
1.2 Memcached特點
  • memcached本質上是一個內存key-value緩存,它通過減輕數據庫負載加速動態web應用。
  • memcached不支持數據的持久化,服務器關閉之後數據全部丟失。
  • memcached協議簡單,使用的是基於文本行的協議。
  • memcached是多線程工作,redis是單線程工作,各個memcached服務器之間互不通信,各自獨立存取數據,不共享任何信息
  • memcached服務器不具有分佈式功能,分佈式部署取決於memcache客戶端
  • memcached用lazy expiration(懶淘汰)實現key過期
  • memcached通過提前分配內存保證運行性能,很少出現內存碎片
  • memcached使用非阻塞IO服用網絡模型,目的是提高數據吞吐量
  • memecached使用listen/work的多線程模型,優點是能夠充分利用多核,但是會帶來一些鎖衝突
  • memecached不支持持久化:
    • 業務決定技術方案,memcached以“以服務的方式,而不是庫的方式管理KV內存”,爲設計目標,它與其他緩存數據庫不一樣的是KV內存管理組件庫,持久化和複雜數據結構並不是它的初衷
1.3 memecached作用及應用場景
1.3.1 memecached作用
  • 高性能分佈式緩存服務器(緩存數據庫查詢結果,減少數據庫訪問次數) 緩存讀取/寫入過程 : 首次訪問 : 從RDBMS中取得數據保存到memcached;第二次後 : 從memcached中取得數據顯示頁面
1.3.2 應用場景
  • 數據查詢緩存:將數據庫的數據加載到memcached,提供程序的訪問速度
  • 計數器的場景:通過incr/decr命令實現評論數量、點擊數統計、操作次數等場景
  • 樂觀鎖實現:例如計劃任務多實例部署的場景,通過CAS實現不重複執行
  • 防重複處理命令:CAS命令
  • 集羣和分佈式的區別
    • 集羣:可以在單機或者多臺機子上部署多個相同配置的服務;
    • 分佈式:在多臺機子上部署多個不同服務
  • 適用場景示例
    • ① 訪問頻繁的字典數據
    • ② 大量的hot數據(熱門數據緩存)
    • ③ 頁面緩存(web站常用)
    • ④ 搜索的查詢條件和結果(熱門搜索的內存緩存起來)
    • ⑤ 臨時處理數據(不需要入庫,排重)

二、 memecached工作原理

2.1 memecached工作原理

  • ① memcached的工作就是在專門的機器的內存裏維護一張巨大的hash表,來存儲經常被讀寫的一些數組與文件,從而極大的提高網站的運行效率。
  • ② 採用的是C/S模式,在server端啓動服務進程,在啓動時可以指定監聽的ip,自己的端口號,所使用的內存大小等幾個關鍵參數.採用了單進程,單線程,異步I/O,基於事件(event_based) 的服務方式。
  • ③ 使用libevent作爲事件通知實現,每個Server只是對自己的數據進行管理,Client端通過指定Server端的ip地址(通過域名應該也可以)。以key->value形式,key 的值通過hash進行轉換,然後確定對那臺server存儲/獲取數據。
2.2 memcached內存算法
  • 使用的是slab allocation機制分配和管理內存,按照預先規定的大小,將分配的內存分割成特定長度的內存塊,再把尺寸相同的內存塊分成組,數據在存放時,根據鍵值大小去 匹配slab大小,找就近的slab存放,所以存在空間浪費現象。
2.3 memcached緩存策略
  • memcached緩存策略是LRU(最近最少使用)加上到期失效策略,當你在memcached內存儲數據項時,你有可能會指定它在緩存的失效時間,默認爲永久。當memcached服務器用完分配的內存時,失效的數據被首先替換,然後也是最近使用的數據。
  • 在LRU中,memcached使用的是一種Lazy Expiration策略,自己不會監控存入的key/value對是否過期,而是在獲取key值時查看記錄 的時間戳,檢查key/value對空間是否過期,這樣可減輕服務器的負載。
2.4 memcached失效策略
  • Lazy expiration + LRU Lazy expiration作用 : 假如我們所存儲的數據項相對多的時候,在這時候進行監控的話,話費的代價是相當大的,所以memcached不會在過期監視上耗費風度哦的CPU時間, 從而在性能方法也起到一定的優化作用。
  • LRU : memcached會優先使用已超時的空間,但是還是會有追加信息時空間不足的狀態,這時候會使用Least Recently Used(LRU)機制來分配空間,就從最近未被使用的記錄 中搜索,並將其空間分配給新的記錄
2.5 memcached分佈式算法
  • 當向memcached集羣存入/取出Key/value時,memcached客戶端會根據一定算法計算存入那臺服務器第一步 : 選擇服務器,第二步 : 存取數據)

    • 餘數算法 :

      ① 先求得鍵的整數散列值

      ② 再除以服務器數量

      ③ 最後根據餘數選取存儲哪臺服務器

      特點 : 簡單,高效.但是擴展性差服務器數量變更時,幾乎所有的緩存都會失效)

    • 散列算法 :

      ① 計算memcached的散列值,並將其發佈在0-2^32的圓上

      ② 用同樣的方法算出存儲數據鍵的散列值並映射至圓上

      ③ 最後從數據映射到的位置開始順時針查找, 將數據保存在查找到的第一臺服務器

      如果超過2^32還是找不到,則將數據保存在第一臺memcached服務器上。如果添加一臺memcached服務器,則只在圓上添加的逆時針方向的第一臺服務器上的鍵會受到影響。

2.6 memcached與redis對比
  • memcached : 支持多核,內存利用率高,無持久性,數據結構簡單.
  • redis : 單核,內存利用率低(採用壓縮會比memcached高),有(硬盤存儲,主從同步),數據結構複雜.
  • 散列值 : 將值從一個大的(可能很大)定義域映射到一個較小值域的(數學)函數.散列函數是把該函數應用到大的定義域中的若干值得(大)集合的結果可以均勻地(和隨機地) 被分佈在該範圍上.

三、memcached部署

3.1 實驗拓撲圖
在這裏插入圖片描述

  • memcached服務器提供緩存數據庫,在LAMP架構主機上安裝memcache,memcache提供API接口,在LAMP上的php上調用這個接口,把數據緩存在memcached
3.2 實驗環境
  • 兩臺centos服務器

  • memcached服務器 IP地址:192.168.226.128

    準備軟件包

    • libevent-2.1.8-stable.tar.gz
    • memcached-1.5.6.tar.gz‘
  • LAMP服務器 IP地址:192.168.226.132

    準備軟件包

    • memcached-1.5.6.tar.gz
    • httpd-2.4.29.tar.bz2 包含工具包(apr-1.6.2.tar.gz和apr-util-1.6.0.tar.gz)
    • mysql-5.6.26.tar.gz
    • php-5.6.11.tar.bz2
3.3 部署memcached服務器
  • ① 因爲memcached的安裝是依賴於事件庫(libevent:開源高性能事件通知庫)的,所以需要先安裝事件庫
[root@localhost ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7: 
[root@localhost ~]# cd /mnt
[root@localhost mnt]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt
.....省略部分內容
[root@localhost mnt]# cd /opt/libevent-2.1.8-stable/
[root@localhost libevent-2.1.8-stable]# yum install -y gcc gcc-c++ make

#配置、編譯
[root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent
[root@localhost libevent-2.1.8-stable]# make && make install 
.....省略部分內容
  • ② 安裝memcached
[root@localhost libevent-2.1.8-stable]# cd /mnt
[root@localhost mnt]# tar zxvf memcached-1.5.6.tar.gz -C /opt
[root@localhost mnt]# cd /opt/memcached-1.5.6/
[root@localhost memcached-1.5.6]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
[root@localhost memcached-1.5.6]# make && make install
......省略部分內容
  • ③ 創建軟鏈接便於系統管理
[root@localhost memcached-1.5.6]# ln -s /usr/local/memcached/bin/* /usr/local/bin/
  • ④ 開啓服務
#開啓服務
#-d 守護進程 -m指定緩存大小 -p指定端口 -u指定管理的用戶
[root@localhost memcached-1.5.6]# memcached -d -m 32m -p 11211 -u root

[root@localhost memcached-1.5.6]# netstat -natp | grep 11211
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      5868/memcached      
tcp6       0      0 :::11211                :::*                    LISTEN      5868/memcached   
  • 關閉防火牆、連接數據庫
[root@localhost memcached-1.5.6]# systemctl stop firewalld.service 
[root@localhost memcached-1.5.6]# setenforce 0
    
    
#檢查是否存在telnet功能,沒有的話直接yum 安裝
rpm -qc telnet
yum install telnet -y

#連接數據庫
[root@localhost memcached-1.5.6]# telnet 192.168.226.128 11211
Trying 192.168.226.128...
Connected to 192.168.226.128.
Escape character is '^]'.
  • ⑤ memcached緩存數據庫操作命令
    在這裏插入圖片描述
四、配置LAMP和memcache
  • 修改主機名
[root@localhost ~]# hostnamectl set-hostname lamp
  • 搭建LAMP架構(手工編譯),部署過程可以訪問我之前的博客:LAMP架構:Discuz論壇手工編譯安裝,訪問php頁面出現以下內容則搭建完成
    在這裏插入圖片描述

  • 配置memcache

    手工編譯memcache2.2.7

[root@lamp ~]# cd /mnt

[root@lamp mnt]#  tar zxvf memcache-2.2.7.tgz -C /opt
....省略部分內容

#增加PHP模塊後在對memcache進行配置,使用phpize生成memcache的腳本,生成configure(以便執行配置)
[root@lamp memcache-2.2.7]# /usr/local/php5/bin/phpize 

[root@lamp mnt]# cd /opt/memcache-2.2.7/
[root@lamp mnt]# ./configure \
--enable-memcache \
--with-php-config=/usr/local/php5/bin/php-config
[root@lamp memcache-2.2.7]# make && make install
  • 修改memcache配置文件
#先確認/usr/local/php5/lib/php/extensions目錄下有no-debug-zts-20131226這個文件
[root@lamp memcache-2.2.7]# cd /usr/local/php5/lib/php/extensions/
[root@lamp extensions]# ls
no-debug-zts-20131226

#複製以上路徑(包括no-debug-zts-20131226)

#修改memcache主配置文件
[root@lamp memcache-2.2.7]# vim /usr/local/php5/php.ini 
#在extension_dir模板附近添加以下內容(736行)
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20131226/"
#指向memcache模塊
extension = memcache.so
  • 編輯php測試頁面(連接服務器)
[root@lamp extensions]# vim /usr/local/httpd/htdocs/index.php 
<?php
$memcache = new Memcache();
$memcache->connect('192.168.226.128',11211);
$memcache->set('key','Memcache test Successful',0,60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>
----->wq
  • 重啓httpd服務
[root@lamp extensions]# service httpd stop
[root@lamp extensions]# service httpd start
[root@lamp extensions]# netstat -natp | grep httpd
tcp        0      0 192.168.226.132:80      0.0.0.0:*               LISTEN      19816/httpd  

五、訪問驗證

  • 訪問lamp服務器地址
[root@lamp extensions]# service httpd stop
[root@lamp extensions]# service httpd start
[root@lamp extensions]# netstat -natp | grep httpd
tcp        0      0 192.168.226.132:80      0.0.0.0:*               LISTEN      19816/httpd  

五、訪問驗證

  • 訪問lamp服務器地址
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章