memcached简介
memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。
这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
Memcached 的守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
Memcached由Danga Interactive开发,其最新版本发布于2010年,作者为Anatoly Vorobey和Brad Fitzpatrick。用于提升LiveJournal . com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。
官方网站
Memcached的特性
- 协议简单
- 支持epoll/kqueue异步I/O模型,使用libevent作为事件处理通知机制。
- key/value键值数据类型
- 全内存缓存,效率高(全部的数据都存放于Memcached服务事先分配好的内存中,无持久化存储的设计,和系统的物理内存一样,当重启系统或Memcached服务时,Memcached内存中的数据会丢失。若希望重启后,数据依然能保留,那么就可以采用redis这样的持久性内存缓存系统)
- 当内存中缓存的数据容量达到服务启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据。也可以在存放数据时对存储的数据设置过期时间,这样过期后数据就自动被清除,Memcached服务本身不会监控数据过期,而是在访问的时候查看key的时间戳判断是否过期。
构建memcached服务
在RHEL7系统光盘中包含有memcached,因此需要提前配置yum源,即可直接使用yum安装,客户端测试时需要提前安装telnet远程工具。验证时需要客户端主机安装telnet,远程memcached来验证服务器的功能:
- add name 0 180 10 //变量不存在则添加
- set name 0 180 10 //添加或替换变量
- replace name 0 180 10 //替换
- get name //读取变量
- append name 0 180 10 //向变量中追加数据
- delete name //删除变量
- flush_all //清空所有
- 提示:0表示不压缩,180为数据缓存时间,10为需要存储的数据字节数量。
步骤一:构建memcached服务
1)使用yum安装软件包memcached
[root@proxy ~]# yum -y install memcached telnet
[root@proxy ~]# rpm -qa memcached
memcached-1.4.15-10.el7_3.1.x86_64
- memcached配置文件(查看即可,不需要修改)
[root@proxy ~]# vim /usr/lib/systemd/system/memcached.service
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
[root@proxy ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
步骤二:使用telnet访问memcached服务器
1)使用telnet连接服务器测试memcached服务器功能,包括增、删、改、查等操作。
[root@proxy ~]# telnet 192.168.4.5 11211
Trying 192.168.4.5...
……
##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
set name 0 180 3 //定义变量,变量名称为name
plj //输入变量的值,值为plj
STORED
get name //获取变量的值
VALUE name 0 3 //输出结果
plj
END
##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
add myname 0 180 10 //新建,myname不存在则添加,存在则报错
set myname 0 180 10 //添加或替换变量
replace myname 0 180 10 //替换,如果myname不存在则报错
get myname //读取变量
append myname 0 180 10 //向变量中追加数据
delete myname //删除变量
flush_all //清空所有
quit //退出登录
LNMP+memcached
如果希望使用PHP来操作memcached,注意必须要为PHP安装memcache扩展(php-pecl-memcache),否则PHP无法解析连接memcached的指令。客户端测试时需要提前安装telnet远程工具。
步骤一:创建PHP页面,使用PHP语言测试memcached服务
1)部署测试页面
创建PHP首页文档/usr/local/nginx/html/mem.php 注意:192.168.2.5是memcached数据库。
[root@web1 ~]# vim /usr/local/nginx/html/mem.php
<?php
$memcache=new Memcache; //创建memcache对象
$memcache->connect('192.168.2.5',11211) or die ('could not connect!!');
$memcache->set('key','test'); //定义变量
$get_values=$memcache->get('key'); //获取变量值
echo $get_values;
?>
2)客户端测试(结果会失败)
客户端使用浏览器访问服务器PHP首页文档,检验对memcached的操作是否成功:
[root@web1 ~]# firefox http://192.168.2.100/mem.php
注意:这里因为没有给PHP安装扩展包,默认PHP无法连接memcached数据库,需要给PHP安装扩展模块才可以连接memcached数据库。
3)为web1主机的PHP添加memcache扩展
[root@web1 ~]# yum -y install php-pecl-memcache
[root@web1 ~]# systemctl restart php-fpm
4)客户端再次测试(结果会成功显示数据结果)
[root@web1 ~]# firefox http://192.168.2.100/mem.php
5)为web2主机的PHP添加memcache扩展
[root@web2 ~]# yum -y install php-pecl-memcache
[root@web2 ~]# systemctl restart php-fpm
PHP实现session共享
在上面拓扑的基础上 , Nginx服务器除了承担调度器外,还需要担任memcached数据库的角色,并在两台后端LNMP服务器上实现PHP的session会话共享。拓扑结构如图所示。
步骤一:在后端LNMP服务器上部署Session共享
注意:这些操作在两台后端Web服务器上均需要执行,以下操作以Web1(192.168.2.100)服务器为例。
1)修改PHP-FPM配置文件,并重启服务
注意,因为后端两台web服务器(web1,web2)都需要修改配置文件(下面也web1为例)。
[root@web1 ~]# vim /etc/php-fpm.d/www.conf //修改该配置文件的两个参数
//文件的最后2行
修改前效果如下:
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
//原始文件,默认定义Sessoin会话信息本地计算机(默认在/var/lib/php/session)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
修改后效果如下:
php_value[session.save_handler] = memcache
php_value[session.save_path] = "tcp://192.168.2.5:11211"
//定义Session信息存储在公共的memcached服务器上,主机参数中为memcache(没有d)
//通过path参数定义公共的memcached服务器在哪(服务器的IP和端口)
[root@web1 ~]# systemctl restart php-fpm
步骤二:客户端测试
客户端使用浏览器访问两台不同的Web服务器。