在构建高效能Web应用时,使用Apache、Memcached-Session-Manager与Tomcat集群是一种常见的做法。然而,在实际部署过程中,可能会遇到一些挑战。例如,当所有组件(包括两个Tomcat节点、Apache和Memcached服务器)都部署在同一台虚拟机上时,无法准确地模拟真实的生产环境。此外,这样的设置也无法完全体现分布式环境的优势。

为了解决这些问题,我们对原有的物理架构进行了重新设计。新的设计保留了原有的配置方法,但将各组件分散部署到不同的主机上,以更接近真实的生产环境。

wKiom1eu4BOx0uY1AABh-HnKA04586.png

以下是具体的操作步骤:

  1. 将已配置好的Tomcat节点复制到两台不同的主机上。
    scp -r apache-tomcat-node1 root@hadoop2:/u01
    scp -r apache-tomcat-node2 root@hadoop3:/u01
  2. 编辑Apache的worker.properties文件,更新负载均衡器的配置。
    [root@hadoop1 /]# vi /etc/httpd/conf/workers.properties
    worker.list=loadbalancer
    worker.tomcat1.port=8009
    worker.tomcat1.host=192.168.163.156
    worker.tomcat1.type=ajp13
    worker.tomcat1.lbfactor=1
    worker.tomcat2.port=8019
    worker.tomcat2.host=192.168.163.166
    worker.tomcat2.type=ajp13
    worker.tomcat2.lbfactor=1
    worker.loadbalancer.type=lb
    worker.loadbalancer.balance_workers=tomcat1,tomcat2
    worker.loadbalancer.sticky_session=true
  3. 调整每个Tomcat节点上的MSM配置,确保它们指向正确的Memcached服务器。
  4. 使用ApacheBench工具进行吞吐量测试,评估系统性能。
    c:\Apache24\bin>ab -n 10000 -c 4 http://192.168.163.146/examples/testSession.jsp
    ...
    Requests per second: 968.84 [#/sec] (mean)
    ...
  5. 模拟一个节点故障的情况,再次进行性能测试,观察系统的恢复能力和性能表现。
    c:\Apache24\bin>ab -n 10000 -c 4 http://192.168.163.146/examples/testSession.jsp
    ...
    Requests per second: 1250.92 [#/sec] (mean)
    ...

测试结果显示,即使在一个节点故障的情况下,系统的吞吐量仍然能够达到1250.92次请求/秒,甚至超过了双节点正常运行时的表现。

最后,对于是否应使用Memcached来存储Session,存在一定的争议。虽然Memcached提供了快速的数据访问能力,但在某些场景下,如内存溢出或集群扩展时,可能会导致用户会话丢失等问题。因此,建议采用Memcached结合关系型数据库(或NoSQL数据库)的方式,以平衡性能和稳定性。具体实现策略包括:

  • 用户登录时,同时将Session写入Memcached和数据库;
  • 在Session中添加一个字段,记录最后一次写入数据库的时间;
  • 每次页面加载时,优先从Memcached读取Session,若未命中则从数据库读取;
  • 每隔一段时间或页面加载次数达到一定阈值后,将Session重新写入数据库,以防止数据丢失。

参考来源:InfoQ: 为什么不能用Memcached存储Session