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的博客)

测试一台机器故障看是否实现高可用

发布了37 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/feili12138/article/details/105263059