高性能內存對象緩存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、安裝libmemcached(libmemcached-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