标签归档 memcached

通过清心醉

实战LANMP负载均衡部署2-NGINX结合MEMCACHE提供SESSION会话保留

接上文,上文作者写了实战LANMP负载均衡部署1-实现NGINX反向APACHE服务器集群,居然NGINX反向给了APACHE服务器的集群之后,我们就要考虑SESSION丢失的问题了

实战LANMP负载均衡部署2-NGINX结合MEMCACHE提供SESSION会话保留

首先我们需要给210的NGINX服务器添加MEMCACHE服务,用于存储缓存信息,
而220/230的服务器只需要添加PHP的MEMCACHE扩展,调用210服务器上的MEMCACHE

由于yum源要找过PHP5.3.3的memcache
所以作者编译过环境为PHP7
可以参考
php7添加memcache扩展

在这要特别说下:

memcache是一个服务

memcached是PHP的扩展支持

pecl-memcache-php7 安装在APACHE集群的220/230的服务器的PHP上

重启HTTPD,打印phpinfo查看是否已经启用了memcachee
然后切换会210的NGINX服务器

安装memcached-1.4.25 (记得yum install -y libevent-devel)

安装完成后启用:
/usr/local/bin/memcached -d -m 256 -l 192.168.0.210 -p 7788 -u root

IP必须为内网IP 127.0.0.1的话就只允许本机了
修改220/230的php.ini
session.save_handler = memcache;
session.save_path = “tcp://192.168.0.210:7788”;

不过建议在执行的PHP上动态修改:
ini_set(‘session.save_handler’, ‘memcache’);
ini_set(‘session.save_path’, ‘ tcp://192.168.0.210:7788’);

先来做个测试,看看SESSION是否可以共享:
修改220/230服务器的index.php内容为:

<?php
header(“Content-Type: text/html; charset=UTF-8”);
echo “当前反向请求的服务器IP为:”.$_SERVER[“SERVER_ADDR”].”<br>”;
ini_set(‘session.save_handler’, ‘memcache’); #修改SESSION的保存方式
ini_set(‘session.save_path’, ‘ tcp://192.168.0.210:7788’); #SESSION保存路径
session_start();

#unset($_SESSION[‘time’]); die();
#如果设置错误先把数据删除
$time=time(); #获取当前时间
if(!isset($_SESSION[‘time’])){ #如果不存在SESSION的时间
$_SESSION[‘time’]=$time; #赋值
}
echo “共享的SESSION[‘time’]的值=”.$_SESSION[‘time’].”<br>”;
#输出共享的SESSION[‘time’]
echo “现在的时间=”.time();
#输出当前的时间
?>

可以看到结果:

1

2

到现在为止,负载均衡的SESSION共享就算完成了,当然也包括数据缓存共享;

为了您的服务器敏感信息不泄漏,建议MEMCACHE只开启内网IP段

即/usr/local/bin/memcached -d -m 256 -l 192.168.0.210 -p 7788 -u root

如果是实际服务器,切记别使用:

/usr/local/bin/memcached -d -m 256 -l 外网IP -p 7788 -u root

 

因为缓存的数据很容易就被黑客抓取,所以如果不是使用服务器集群的话,建议别开启MEMCACHE

 

作者在说说,MEMCACHE是如何减轻数据库的瓶颈的,代码就不写了,思路写了自己琢磨下就懂了:

对SQL的操作,莫过“增删改查”

首先,每次SELECT的时候,先判断MEMCACHE里是否存在对应的KEY,存在提取值,这些值是怎么来的呢?

假设MEMCACHE内没有所需的值

数据库中提取,可以为数组也可以为字符串,然后Memcached::set(‘key’,’value’)写入KEY名称和对应的值,值可以为数组

那么下次再访问的时候,就先不直接读取数据库了

而是if(Memcached::get(‘key’,’value’))就可以判断是否存在,存在直接return即可。

 

比如说有留言什么的,就进行更新,更新之后同样更新下key的value即可

更多可以参考Memcached类

通过清心醉

什么环境我们才应该使用memcache

一直都有看到有提到memcache可以提高网站速度,事实真是如此?

就作者的博客来说,使用memcache把数据缓存,的确是可以减少了数据库的使用率,可是,就加载到内存的缓存数据,测试了下,打开响应时间起码慢了2秒以上,作者用的还是PHP7+Opcache,使用了memcache之后性能下降的可怕,于是不使用了memcache。

就包括现在很多的网络公司都说要熟悉memcache缓存技术,事实上真的用的上吗?

memcache最大的好处是单一网站的分布式的存储,如果日访问量过百万级别的网站,一般都会有做负载均衡来减少服务器的压力,做了负载均衡,memcache就能很好的发挥本该有的效果。数据写入内存,虽然响应一样会慢点,但起码不会导致服务器宏机。

其次,memcache配合负载均衡用来保持会话的SESSION,我们就可以用一台服务器来保存SESSION会话信息,其他的用于动静态文件的均衡处理,可以保证用户的每一次访问,SESSION会话都是在保持连接状态。

这里就还会有一个疑问,虽然作者未曾测试过:

比如自行开发的后台,使用的是SESSION的判断,假设用户登录成功之后存在$_SESSION[‘admin_user’];

如果把该信息写入memcache的话,如果一个服务器内有多个站点,都是需要该值的。

这时候访问A站生成的SESSION会话,访问B网站如果也从memcache来读取会话信息,如此一来,B站提取了合法的SESSION,就能跨站访问了;

当然,该疑问可以当作是PHP开发时的一个安全顾虑

如果只是一个服务器跑多个类型的网站,用户群体不一样,memcache不能发挥它的最大性能,更可能让你的服务器针对SESSION会话及缓存效果减少。

如果是服务器集群,一个用户登录之后可以访问服务器内的所有站点数据,那么,memcache是很理想的!