Memcache數據庫緩存服務器

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.somemcache.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文件中函數庫文件到 mysqlplugin目錄下,往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的博客)

測試一臺機器故障看是否實現高可用

 

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