Memcache數據庫緩存服務器
什麼是Memcache?
memcached是高性能的分佈式內存緩存服務器,爲了提高性能,memcached中的數據都保存在內存中,但是重啓操作系統都會導致緩存中的數據全部丟失
原理:數據都存儲在memcache內置的內存存儲空間中
爲什麼用Memcache?
MySQL:磁盤上的數據庫,數據寫入讀取相對較慢
Memcached:內存中的數據庫,數據讀寫都快,但是數據易丟失
memcached的內存算法
Memcached利用slab allocation機制來分配和管理內存,它按照預先規定的大小,將分配的內存分割成特定長度的內存塊,再把尺寸相同的內存塊分成組,數據在存放時,根據鍵值大小去匹配slab大小,找就近的slab存放,該方法可以有效解決內存碎片問題,但可能會存在空間浪費現象
Memcache的常用架構
Memcache搭建
注意:搭建環境是在CentOS7中搭建的,因爲memcache的版本兼容相當地嚴格,CentOS6搭建的話很容易出錯
memcache服務器:192.168.0.102(安裝libvent、memcached、mariadb和mysql)
web服務器(memcahe API客戶端):192.168.0.101(安裝nginx、php、libmemcached和memcached)
memcache服務器搭建(192.168.0.102)
1.編譯安裝 libevent
tar zxf libevent-1.4.14b-stable.tar.gz
cd libevent-1.4.14b-stable
./configure --prefix=/usr/local/libevent
make && make install
2.安裝memcached
tar zxf memcached-1.4.31.tar.gz
cd memcached-1.4.31
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
make && makeinstall
3.命令路徑優化
ln -s /usr/local/memcached/bin/* /usr/local/bin/
4.啓動服務
memcached -d -m 64 -u root -l 192.168.0.102 -p 11211 -c 1024 -P /usr/local/memcached/memcached.pid
-d:以守護進程daemon的方式運行Memcached服務;
-m:爲Memcached分配64MB的內存(可調整);
-u:指定運行的用戶賬號;
-p:指定TCP端口號,不設置默認爲11211;
-l:指定綁定IP地址,默認所有都允許,有安全隱患,若設置爲127.0.0.1則只能本機訪問;
-U:UDP監聽端口(默認11211.0時關閉);
-P:將PID號寫入文件,這樣可以使得後邊進行快速的進程終止,需要與-d一起使用
-c:最大併發連接數,默認1024
5.telnet遠程連接測試
telnet 192.168.0.102 11211
version:查看版本
Memcache數據庫操作
添加數據:set key flag expire bytes
key:鍵值 key-value 結構中的 key,用於查找緩存值。
flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。
exptime:在緩存中保存鍵值對的時間長度(以秒爲單位,0 表示永遠)
bytes:在緩存中存儲的字節數
查詢數據:get keyname
更新數據:set key(數據可以不存在)、替換數據(數據必須存在)
刪除數據:delete key
檢查更新:gets keyname
gets 命令的功能類似於基本的 get 命令。兩個命令之間的差異在於,gets 返回的信息稍微多一些:64 位的整型值非常像名稱/值對的 "版本" 標識符
gets keyname
VALUE keyname 0 8 3
asdfgh12
END
cas keyname 0 0 4 3
1234
STORED
追加數據:append key(原鍵值後追加)、prepend key (原鍵值前追加)
清除數據:flush_all
查詢統計:stats(命令用於返回統計信息例如 PID(進程號)、版本號、連接數等)
pid: memcache服務器進程ID
uptime:服務器已運行秒數
time:服務器當前Unix時間戳
version:memcache版本
pointer_size:操作系統指針大小
rusage_user:進程累計用戶時間
rusage_system:進程累計系統時間
curr_connections:當前連接數量
total_connections:Memcached運行以來連接總數
connection_structures:Memcached分配的連接結構數量
cmd_get:get命令請求次數
cmd_set:set命令請求次數
cmd_flush:flush命令請求次數
get_hits:get命令命中次數
get_misses:get命令未命中次數
delete_misses:delete命令未命中次數
delete_hits:delete命令命中次數
incr_misses:incr命令未命中次數
incr_hits:incr命令命中次數
decr_misses:decr命令未命中次數
decr_hits:decr命令命中次數
cas_misses:cas命令未命中次數
cas_hits:cas命令命中次數
cas_badval:使用擦拭次數
auth_cmds:認證命令處理的次數
auth_errors:認證失敗數目
bytes_read:讀取總字節數
bytes_written:發送總字節數
limit_maxbytes:分配的內存總大小(字節)
accepting_conns:服務器是否達到過最大連接(0/1)
listen_disabled_num:失效的監聽數
threads:當前線程數
conn_yields:連接操作主動放棄數目
bytes:當前存儲佔用的字節數
curr_items:當前存儲的數據總數
total_items:啓動以來存儲的數據總數
evictions:LRU釋放的對象數目
reclaimed:已過期的數據條目來存儲新數據的數目
Memcached stats slabs(命令用於顯示各個slab的信息,包括chunk的大小、數目、使用情況等)
補充:服務啓動腳本(記得加上可執行x權限)
#!/bin/bash
qd=`/usr/local/memcached/bin/memcached -d -m 128 -u root`
start()
{
$qd
}
stop()
{
killall memcached
}
ACTION=$1
case $ACTION in
start)
start;;
stop)
stop;;
restart)
stop
sleep 2
start;;
*)
echo "Usage:{start|stop|restart}"
esa
web服務器(memcahe API客戶端 192.168.0.101)
1.安裝nginx
依賴包安裝,創建用戶組
yum -y install pcre pcre-devel openssl openssl-devel zlib zlib-devel
groupadd nginx
useradd -g nginx -s /sbin/nologin nginx
編譯安裝nginx
tar zxf nginx-1.12.0.tar.gz
cd nginx-1.12.0
./configure --prefix=/usr/local/nginx --without-http_memcached_module --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
make && make install
修改屬主目錄
chown -R nginx:nginx /usr/local/nginx
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
安裝mcrypt(php裏面重要的加密支持擴展庫)
安裝之前需要先安裝libmcrypt和mhash包
tar zxf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure
make && make install
tar zxf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
./configure
make && make install
tar zxf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8
./configure
make && make install
解壓編譯安裝php
tar jxf php-5.6.31.tar.bz2
cd php-5.6.31
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --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
make &&make install
使用php.ini模板
cp php.ini-production /usr/local/php/etc/php.ini
ln -s /usr/local/php/etc/php.ini /etc/php.ini
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
sed -i 's|;pid = run/php-fpm.pid|pid = run/php-fpm.pid|g' /usr/local/php/etc/php-fpm.conf
sed -i 's|user = nobody|user = nginx|g' /usr/local/php/etc/php-fpm.conf
sed -i 's|group = nobody|group = nginx|g' /usr/local/php/etc/php-fpm.conf
修改nginx配置文件對接php
vim /usr/local/nginx/conf/nginx.conf
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;
}
啓動服務測試php
3.安裝libmemcached庫(Libmemcached 庫提供的 API 與 Memcached 服務端進行交互)
tar zxf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached --with-memcached
make && make install
4.安裝php的memcached擴展組件(php-memcached,3.0.0及以上版本針對php7.0及以上版本)
tar zxf memcached-2.2.0.tar.gz
cd 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
make && make install
5.安裝php-memcache
tar zxf memcache-2.2.7.tar.gz
cd memcache-2.2.7
/usr/local/php/bin/phpize
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config
make && make install
6.在php配置文件中啓動擴展包,然後重啓php-fpm和nginx
注意:查看下圖所示有沒有memcached.so和memcache.so兩個文件,沒有就說明安裝過程中出現了問題
vim /usr/local/php/etc/php.ini
[Intl]
extension = intl.so
[Memcached]
extension = memcached.so
[Memcache]
extension = memcache.so
7.測試memcached API功能和php測試頁面
使用php的phpinfo()方法檢查是否安裝成功,也可以使用/usr/local/php/bin/php -m命令檢查有沒有安裝這兩個插件成功
php連接memcached服務器測試
<?php
$memcache=new Memcache;
$memcache->connect('192.168.0.102',11211) or die("對不起,連接失敗!!!");
$memcache->set('key','恭喜你memcache連接測試成功!!!');
$get_value=$memcache->get('key');
echo $get_value;
?>
mysql與memcache
採用MySQL Memcached UDF(User Defined Functions)方法mysql memcached UDF
其實就是通過libmemcached來使用memcache的一系列函數,通過這些函數,你能 對memcache進行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我們通過mysql trigger來使用這些函數,那麼就能通過mysql更好的,更自動的管理memcache!
1.在memcache服務器上安裝musql或者mariadb
下載安裝mysql這個可以參考之前的LAMP和LNMP安裝的博客
安裝mariadb:
yum -y install mariadb mariadb-server mariadb-devel
2.安裝libmemcached(libmemcached-0.34與memcached_functions_mysql-1.1配對進行安裝)
tar zxf libmemcached-0.34.tar.gz
cd libmemcached-0.34
./configure --prefix=/usr/local/libmemcached --with-memcached
make && make install
3.安裝memcached_functions_mysql
tar zxf memcached_functions_mysql-1.1.tar.gz
cd memcached_functions_mysql-1.1
./configure --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached=/usr/local/libmemcached/
make && make install
注意:mariadb安裝了mariadb-devel纔會有mysql_config
4.拷貝lib文件中函數庫文件到 mysql的plugin目錄下,往MySQL中添加memcache UDF函數
cp /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql/lib/plugin/
啓動mariadb或者mysql,登陸進入mysql
mysql -uroot -p123456
5.數據庫中執行
mysql>source /root/memcached_functions_mysql-1.1/sql/ install_functions.sql
注意:執行的文件文件在memcached_functions_mysql-1.1源碼路徑
查詢函數:select *from mysql.func;
6.導入函數到數據庫中(在shell中執行,不在數據庫)
mysql -uroot -p123456 < /root/memcached_functions_mysql-1.1/sql/install_functions.sql
7.測試函數是否成功
建立連接:mysql> select memc_servers_set('192.168.0.102:11211');
查詢:mysql> select memc_server_count();
插入數據:mysql> select memc_set('m','abcdefg');
查詢數據:mysql> select memc_get('m');
8.測試客戶端遠程是否同步數據,能否查詢
mysql如何主動同步數據到memcache
觸發器的感念
1.登錄數據庫新建數據庫和表
mysql> create database test123;
mysql> create table tab1(id int not null, name varchar(32) not null, primary key(id));
2.連接memcache
mysql> select memc_servers_set('192.168.0.102:11211');
3..建立相關表的觸發器(插入數據的觸發器)
插入數據:
mysql> delimiter $
mysql> create trigger tab1_insert_memc
-> before insert on tab1
-> for each row begin
-> set @m=memc_set(NEW.id,NEW.name);
-> end$
更新數據:
mysql> create trigger tab1_update_memc
-> before update on tab1
-> for each row begin
-> set @m=memc_replace(OLD.id,NEW.name);
-> end$
刪除數據:
mysql> create trigger tab1_delete_memc
-> before delete on tab1
-> for each row begin
-> set @m=memc_delete(OLD.id);
-> end$
memcached實現主主複製高可用
memcached可以支持互相複製(雙向複製和主從複製都是可讀可寫的)使用keepalived進行故障檢測來實現高可用
注意:需要下載支持複製功能的memcached版本安裝包memcached-1.2.8-repcached-2.2.tar.gz
需要兩臺服務器步驟一致,只有keepalived配置不一樣
1.安裝支持包
yum -y install psmisc
Psmisc軟件包包含三個幫助管理/proc目錄的程序
user:顯示使用指定文件或者文件系統的進程的PID
killall:殺死某個名字的進程,它向運行指定命令的所有進程發出信號
pstree:樹型顯示當前運行的進程
2.安裝libevent以及memcached(這裏就省略跟上面筆記的安裝步驟一致,只有memcached版本不一樣)
編譯安裝memcached
./configure --prefix=/usr/local/memcached_replication --enable-replication --with-libevent=/usr/local/libevent
make && make install
安裝完成之後,需要將編譯安裝的libevent-1.4.so.2模塊複製到/usr/lib64目錄下,否則會報錯
ln -s /usr/local/libevent/lib/libevent-1.4.so.2 /usr/lib64/
3.啓動服務(兩臺-x選項後面的ip不同,是對方的ip)
./memcached -d -u root -m 64 -x 192.168.0.103
./memcached -d -u root -m 64 -x 192.168.0.104
如果沒有加載模塊,便會報一下錯誤:
./memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
4.測試查看是否實現主主複製
分別在兩臺服務器上添加鍵值查看是否同步
5.安裝keepalived(查看我keepalived的博客)
測試一臺機器故障看是否實現高可用