大型網站架構與自動化運維——高性能內存對象緩存Memcached

                                            高性能內存對象緩存Memcached

一、Memcached簡介
        Memcached是一套開源的高性能分佈式內存對象緩存系統,它將所有的數據都存儲在內存中,因爲在內存中會統一維護一張巨大的Hash表,所以支持任意存儲類型的數據
        它是經典的C/S架構,因此需要安裝Memcached服務端與MemcachedAPI客戶端。
1、存儲方式與數據過期方式
(1)存儲方式:Slab Allocation
        按組分配內存,每次先分配一個Slab,相當於一個大小爲1MB的頁,然後在1MB的空間裏根據數據劃分大小相同的chunk該方法可有效解決內存碎片問題,但可能會對內存空間有所浪費
(2)數據過期方式:LRU、Laxzy Expiration
LRU是指追加的數據空間不足時,會根據LRU的情況淘汰最近最少使用的記錄
Laxz Expriation即惰性過期,是指使用get查看記錄時間從而檢查記錄是否已經過期

2、緩存機制
        緩存是常駐在內存的數據,能夠快速進行讀取。而Memcached就是一款緩存軟件,當程序寫入緩存數據請求時,Memcached的API接口將Key輸入路由算法模塊路由到集羣中一臺服務器,之後由API接口與服務器進行通信,完成一次分佈式緩存寫入。

3、分佈式
        主要依賴於客戶端來實現分佈式,多個Memcached服務器是獨立的。分佈式數據如何存儲是由路由算法決定

4、路由算法
(1)求餘數hash算法
        先用key做hash運算得到一個整數,再去做hash算法,根據餘數進行路由。這種算法適合大多數需求,但是不適合用在動態變化的環境中,比如有機器需要添加或刪除時,會導致大量對象的存儲位置失效
(2)一致性hash算法
        適合在動態變化的環境中使用。原理是按照hash算法把對應的key通過一定的hash算法處理後,映射形成一個首尾相連的閉合循環,然後通過使用與對象存儲一樣的hash算法將機器也映射到環中,按順時針方向將所有對象存儲到離最近的機器中
二、安裝Memcached
1、安裝Memcached服務器
(1)安裝libevent
./configure --prefix=/usr/local/libevent
(2)安裝Memcached
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
(3)設置Memcached服務腳本
①啓動:/usr/local/memcached/bin/memcached
②關閉:killall memchced

[Unit]
Description=service of memcached

[Service]
Type=simple
ExecStart=/usr/local/memcached/bin/memcached -d -m 128 -u root
ExecStop=/usr/bin/killall memcached
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

2、Memcached API客戶端
(1)安裝nginx1.12.0
①創建用戶
useradd -M -s /sbin/nologin www
②安裝依賴包
yum install pcre pcre-devel openssl openssl-devel zlib zlib-devel -y
③編譯安裝
./configure --prefix=/usr/local/nginx --without-http_memcached_module --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
④權限修改及優化
chown -R www:www /usr/local/nginx
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
(2)安裝php
①依賴包
yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libpng libpng-devel libxml2 libxml2-devel zlib zlib-devel xml2 xml2-devel openssl openssl-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl libcurl-devel gdbm-devel db4-devel libXpm libXpm-devel libX11 libX11-devel gd-devel gmp-devel readline-devel libxslt-devel expat-devel xmlrpc-c xmlrpc-c-devel
http://nchc.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
./configure
②php安裝
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql --with-pdo-mysql --with-mysqli --with-openssl --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-mhash --with-mcrypt --with-bz2 --enable-zip --with-curl --with-gettext --with-iconv --with-xmlrpc --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --enable-pdo --enable-libxml --enable-xml --enable-soap --enable-session --enable-ctype --enable-ftp --enable-bcmath --enable-shmop --enable-inline-optimization --enable-opcache --enable-mbregex --enable-pcntl --enable-cgi --enable-wddx
③優化
cp /root/php-5.6.31/php.ini-production /usr/local/php/etc/php.ini
ln -s /usr/local/php/etc/php.ini /etc/php.ini
④php-fpm設置
#php-fpm.conf文件,取消”;pid = run/php-fpm.pid”的註釋,同時修改運行賬號通nginx服務的運行賬號一致
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
ln -s /usr/local/php/etc/php-fpm.conf /etc/php-fpm.conf
pid = run/php-fpm.pid
user = www
group = www
niginx設置

location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param    SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    include    fastcgi_params;
}

(3)安裝libmemcached(API與Memcached對接)
./configure --prefix=/usr/local/libmemcached --with-memcached
(4)安裝php的memcached擴展組件(memcached-2.2.0)
/usr/local/php/bin/phpize
./configure --enable-memcached --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl
(5)安裝php的memcache2.2.7
/usr/local/php/bin/phpize
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config
(6)安裝intl-3.0.0
wget http://pecl.php.net/get/intl-3.0.0.tgz
yum -y install libicu-devel
./configure --enable-intl --with-php-config=/usr/local/php/bin/php-config
(7)在PHP配置文件中啓動擴展庫

[Intl]
extension = intl.so
[Memcached]
extension = memcached.so
[Memcache]
extension = memcache.so

(8)php測試頁面

<?php
$memcache=new Memcache;    #創建一個memcache對象
$memcache->connect('192.168.100.11',11211) or die("Could not connect");
$memcache->set('key','memcache-testaaaaaaaa');
$get_value=$memcache->get('key');
echo $get_value;
?>


三、Memcached數據庫操作與管理
1、常見操作
(1)添加鍵值數據
add username 0 0 7
鍵值名:username
自定義信息:0
過期時間:0
字節數:7
(2)查詢鍵值數據
get username
gets username
(3)更新鍵值數據
set username 0 0 10,之後輸入值
replace username 0 0 7,之後輸入值
(4)清除一條緩存數據
delete username
(5)檢查後更新
gets username
cas username 0 0 7 1
(6)追加數據
append key:原鍵值後追加
prepend key:原鍵值前追加
(7)清除數據
flush_all
(8)查詢統計
stats
Memcached stats 命令用於返回統計信息例如 PID(進程號)、版本號、連接數等
stats items:返回所有鍵值對的統計信息
stats cachedump 1 0:返回指定存儲空間的鍵值對
stats slabs:顯示各個slab的信息,包括chunk大小、數目、使用情況等
stats sizes:輸出所有item的大小和個數
stats reset:清空統計數據
 

四、mysql與memcached對接
1、maridb或mysql安裝
    yum -y install maridb maridb-server maridb-devel

2、安裝libmemcachedlibmemcached-0.34與memcached_functions_mysql-1.1配對進行安裝
    ./configure --prefix=/usr/local/libmemcached --with-memcached

3、安裝擴展函數庫memcached_functions_mysql
    ./configure --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached=/usr/local/libmemcached/

4、往MySQL中添加memcache UDF函數
(1)在mysql裏邊執行
source /root/packages/memcatch/mysql/memcached_functions_mysql-1.1/sql/install_functions.sql
(2)在shell環境執行導入命令
mysql -uroot -p111111 < /root/packages/memcatch/mysql/memcached_functions_mysql-1.1/sql/install_functions.sql
(3)導入報錯找不到libmemcached_functions_mysql.so
cp /root/packages/memcatch/mysql/memcached_functions_mysql-1.1/src/.libs/libmemcached_functions_mysql.so.0.0.0 /usr/local/mysql/lib/plugin/libmemcached_functions_mysql.so

5、測試
    select memc_servers_set('192.168.11.31:11211');
    select memc_server_count();
    select memc_set('m','llppppp');
    select memc_get('m');

6、mysql觸發器
(1)新建數據庫表
create database test123;
create table tab1(id int not null, name varchar(32) not null, primary key (id));
(2)建立觸發器(插入)
delimiter $
create trigger tab1_insert_memc
>before insert on tab1
>for each row begin
>set @m=memc_set(NEW.id,NEW.value);
>end$
(3)更新及刪除
create trigger tab1_update_memc
before update on tab1
create trigger tab1_delete_memc
before delete on tab1
(4)測試:測試前先連接memcache

五、主主複製和高可用架構
1、主主複製
(1)使用memcached複製架構,需安裝支持複製功能的memcached安裝包
memcached-1.2.8-repcached-2.2.tar.gz
(2)編譯安裝(先安裝libevent)
./configure --prefix=/usr/local/memcached_replication --enable-replication --with-libevent=/usr/local/libevent
(3)libevent模塊複製
ln -s /usr/local/libevent/lib/libevent-1.4.so.2 /usr/lib64/
(4)啓動
/usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.11.31 -X 18000
/usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.11.34 -X 18000


2、keepalive高可用架構
(1)安裝keepalived
yum keepalived
(2)配置主keepalived

global_defs {
   router_id LVS_1                !本路由器(服務器)名稱
}
vrrp_instance VI_1 {            !定義熱備實例
    state MASTER                !熱備份狀態,MASTER爲主服務器
    interface ens33                !承載VIP的物理接口
    virtual_router_id 51        !虛擬路由器的ID號,每個熱備組保持一致
    priority 100                !優先級,越大優先級越高
advert_int 1                !通告間隔描述
nopreempt                !不主動搶佔資源,只在master或高優先級上設置
    authentication {            !認證信息,同組保持一致
        auth_type PASS        !認證類型
        auth_pass 123456        !密碼
    }
    virtual_ipaddress {            !指定飄逸地址(VIP),可以有多個
        192.168.11.210
    }
}

virtual_server 192.168.11.210 11211 {            !VIP及端口
    delay_loop 6                        !健康檢查時間
    persistence_timeout 50                !保持連接時間
    protocol TCP                        !協議
      sorry_server 192.168.11.34 11211            !對機

    real_server 192.168.11.31 11211 {            !本機
        weight 1                        !權重
        notify_down /root/memcached.sh        !宕機時停止keepalived服務
          TCP_CHECK {                !健康檢查方式
                  connect_port 11211        !端口
                  connetc_timeout 3    !超時時間
                  nb_get_retry 3        !重試次數
                  delay_before_retry 3    !重試間隔
                  }
    }
}

(3)配置從keepalived

global_defs {
   router_id LVS_1                !本路由器(服務器)名稱
}
vrrp_instance VI_1 {            !定義熱備實例
    state MASTER                !熱備份狀態,MASTER爲主服務器
    interface ens33                !承載VIP的物理接口
    virtual_router_id 51        !虛擬路由器的ID號,每個熱備組保持一致
    priority 90                !優先級,越大優先級越高
advert_int 1                !通告間隔描述
!去掉nopreempt選項
    authentication {            !認證信息,同組保持一致
        auth_type PASS        !認證類型
        auth_pass 123456        !密碼
    }
    virtual_ipaddress {            !指定飄逸地址(VIP),可以有多個
        192.168.11.210
    }
}

virtual_server 192.168.11.210 11211 {            !VIP及端口
    delay_loop 6                        !健康檢查時間
    persistence_timeout 50                !保持連接時間
    protocol TCP                        !協議
   sorry_server 192.168.11.31 11211            !對機

    real_server 192.168.11.34 11211 {            !本機
        weight 3                        !權重
        notify_down /root/memcached.sh        !宕機時停止keepalived服務
          TCP_CHECK {                !健康檢查方式
                  connect_port 11211        !端口
                  connetc_timeout 3    !超時時間
                  nb_get_retry 3        !重試次數
                  delay_before_retry 3    !重試間隔
                  }
    }
}

(4)服務停止腳本memcached.sh
echo “/usr/bin/systemctl stop keepalived” >/root/memcached.sh
chmod +x /root/memcached.sh

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章