一.php+memcache的部署
memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用来减轻数据库负载。它通过在内存中缓存数据去减少读取数据库的次数,从而提高动态网站的访问速度。目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分明显。Memcache通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括视频,文件以及数据库检索的结果等,将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。
1.memcache的安装部署(php在上节已经部署成功)
(1)把php的命令路径添加到环境变量的配置文件中
(2)创建在php中memcache的预编译环境
(3)源码包的编译安装(memcache的源码包:memcache-2.2.5.tgz )
/usr/local/lnmp/php/lib/php/extensions/no-debug-non-zts-20131226/ ##memcache模块的路径
(4)在php的配置文件中添加memcache.so的模块
vim /usr/local/lamp/php/etc/php.ini ##php的配置文件
php -m ###查看php支持的模块
(5)memcache由socket进行通信,memcached提供后台服务(端口11211)
/etc/init.d/memcached start ##开启memcached服务
2.设置memcache的测试页
(1)源码包提供了测试页面,复制到nginx的发布目录下
(2)memcache的可视化页面
vim memcache.php ##memcache可视化页面的配置文件
memcache有用户名和密码的设定,更安全,可以直观的查看缓存命中情况
不断刷新memcache的测试页面example.php
memcache的缓存命中率在上升
3.memcache的压力测试
物理机测试
ab -c 10 -n 5000 http://172.25.78.2index.html ###静态页面最快,每一秒达到5982的请求
ab -c 10 -n 5000 http://172.25.78.2/example.php ###memcache的测试页面走的memcache,比较快
ab -c 10 -n 5000 http://172.25.78.2/index.php ###普通的测试页面没有走memcache,慢
-c ##每秒10个并发访问,共访问5000个
显然memcache的测试页面要快太多,是普通测试页面速度的3倍左右
php-memcache的流程:
client--nginx:80--fastcgi_pass--php-fpm:9000:--php-memcache--memcache:11211
二.nginx+memcache的部署、
客户端访问的请求,不通过php的传接,直接访问memcache:11211,速度会更快
client--nginx:80--memcache:11211
因为memc和srcache模块是第三方模块,openresty提供了这些模块,要进行openresty的编译安装
OpenResty: 是一个基于nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。通过汇聚各种设计精良的 nginx 模块,从而将nginx有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动nginx支持的各种 C 以及 Lua模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。目标是让你的Web服务直接跑在nginx服务内部,充分利用 nginx的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
openresty的中文官网:http://openresty.org/cn/
因为Nginx并不支持模块动态加载,所以要安装新的模块,必须重新编译Nginx。
1.openresty的源码编译安装(源码包:openresty-1.13.6.1.tar.gz)
(1)编译安装
(2)openresty的路径在/usr/local/下(关闭原来的nginx的端口,在openresty的目录下会有新的nginx)
./nginx -s reload ##否则当openresty下的nginx配置完更新时,会报错,端口冲突了
nginx: [error] invalid PID number "" in "/usr/local/openresty/nginx/logs/nginx.pid" ###原来的nginx的端口冲突
把example.php的memcache的测试页面,复制到新的nginx的目录下,方便测试
(3)nginx的配置文件的设置
vim /usr/local/openresty/nginx/conf/nginx.conf
先需要定义memcache的upstream,定义一个缓存器memcache,端口为本机的11211
给memc-nginx-module配置location,下面配置的location是/memc,所有请求都通过请求这个location请求memcache
##nginx直接去了memcache的11211端口
(4)更新配置文件
2.在物理机上进行压力测试
ab -c 10 -n 5000 http://172.25.15.1/example.php ##比前面的php的memcache更快一点,直接去访问memcache的11211端口
三.tomcat+memcache的部署
Tomcat:技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,是目前比较流行的Web应用服务器,Tomcat很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载均衡与邮件服务等开发应用系统常用的功能,是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
1.tomcat的安装部署
(1)java压缩包和和tomcat压缩包解压就直接能使用
java包:jdk-7u79-linux-x64.tar.gz
tomcat包:apache-tomcat-7.0.37.tar.gz
做一个链接方便调用
(2)添加java的命令的环境路径
(3)测试环境
写一个java代码测试以下
环境正常
测试:http://172.25.78.2:8080
开启tomcat,tomcat的端口是8080
(4)测试
/usr/local/tomcat/webapps/ROOT/ ##tomcat的发布目录,把要发布的文件放在此目录下即可
2.nginx的tomcat的负载均衡
server2:172.25.78.2:8080
server3:172.25.78.3:8080
定义一个tomcat负载均衡器,当以.jsp结尾的访问,去匹配jsp的location的模块
更新nginx的配置信息
定义server3的发布文件
测试:curl 172.25.78.2/test.jsp
3.nginx的扩展模块nginx-sticky-module
nginx-sticky-module 为 nginx 的第三方模块,使 nginx 支持 sticky 模式,所谓 sticky 模式就是指同一个用户的访问请求都被发送到同一个 tomcat 实例上处理,nginx以前对session保持支持不太好,主要采用ip_hash把同一来源的客户(同一C段的IP)固定指向后端的同一台机器,ip_hash有个缺点是不能实现很好的负载均衡;直到nginx的扩展模块nginx-sticky-module的出现,解决了session sticky的问题。从同一个客户端来的访问一直指向刚开始分配的后端服务器,不然负载均衡之后,客户端请求又被分配到另一个后端服务器,客户又要再次登陆。
(1)重新编译nginx来添加nginx-sticky-module(nginx包:nginx-1.10.1.tar.gz)
(nginx-sticky-module源码包:nginx-sticky-module-ng.tar.gz)
把之前openresty下的nginx直接复制过来使用
(2)nginx对sticky模块的配置(因为1.10版本不支持memcache,要删除之前对memcache的配置)
直接把sticky添加到负载均衡部分,即可配合使用
(3)设置session会话的测试页面(server2和server3都设置)
vim /usr/local/tomcat/webapps/ROOT/test.jsp ##session的测试文件
开启server2和server3的tomcat,nginx -s reload 更新nginx的配置文件
测试:
分配到的后端服务器为server2,在/usr/local/tomcat/catalina.out,可以看见session的记录,一旦分配到server2,进行多次操作依旧在server2中,
server3中/usr/local/tomcat/catalina.out没有session的记录
如果关掉server2的tomcat,访问指向server3作为后端服务器,
session的记录在server3中
4.session的共享存储
memcached-session-manager的工作原理
所有的tomcat节点需要安装memcached-session-manager,每一个tomcat会有自己的本地session,当一个请求执行完毕之后,如果对应的session之前不存在(也就是说这是某个用户的第一次请求),则将该session拷贝一份副本至memcached缓存,当该session的下一个请求到达时,会使用tomcat的本地session,请求处理结束之后,session的变化会同步更新到memcached缓存中对应的session里,从而确保本地session和缓存中的session始终保持一致。如果当前结点失效,下一个请求会被路由给另外一个tomcat处理,这个tomcat发现请求所属的session并不存在,于是它将查询memcached缓存,并将查询到的session恢复到本地,这样就完成了容错处理,memcached-session-manager也支持non-sticky session。
tomcat采用交叉共享存储session
Tomcat1 将 session 存储在 memcached2 上。只有当 M2 不可用时,T1 才将 session 存
储在 memcached1 上(M1 是 T1 failoverNode)。使用这种配置的好处是,当 T1 和 M1 同时崩
溃时也不会丢失 session 会话,避免单点故障。
(1)session共享存储的部署
在server2和server3都安装memcached服务,并启动(server2之前已经配置过了)
(2)配置session共享存储所需的jar包
把jar包复制到/sur/local/tomcat/lib
(3)设置tomcat的配置文件,使其支持session共享存储
vim /usr/local/tomcat/conf/context.xml ##tomcat的配置文件
server2:
server3:
失效节点:failoverNodes=n2 ##当server3的session交叉存储点srever2上的memcache挂掉,就把session存储在本地server3上
(4)开启server2和server3的tomcat
(5)测试:
开启tomcat后,可见memcachedsessionservice开始初始化,读取设置的memcache的两个节点
可见172.25.78.2的session存储在server3,实现了交叉存储
n2:172.25.78.3
n1:172.25.78.2
关闭server3的memcache,也就是关闭n2节点,server2的session就存储在n1
在server2创建信息
当后端服务指定到server3上,session也会同步过来