JSP(全称JavaServerPages)是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。Memcached通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)
MemCache是什么?
MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。 MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。
MemCache一次写缓存的流程:
1、应用程序输入需要写缓存的数据
2、API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号
3、由服务器编号得到MemCache及其的ip地址和端口号
4、API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作
读缓存和写缓存一样,只要使用相同的路由算法和服务器列表,只要应用程序查询的是相同的Key,MemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中。
这种MemCache集群的方式也是从分区容错性的方面考虑的,假如Node2宕机了,那么Node2上面存储的数据都不可用了,此时由于集群中Node0和Node1还存在,下一次请求Node2中存储的Key值的时候,肯定是没有命中的,这时先从数据库中拿到要缓存的数据,然后路由算法模块根据Key值在Node0和Node1中选取一个节点,把对应的数据放进去,这样下一次就又可以走缓存了,这种集群的做法很好,但是缺点是成本比较大。
MemCache实现原理
首先要说明一点,MemCache的数据存放在内存中,存放在内存中个人认为意味着几点:
1、访问数据的速度比传统的关系型数据库要快,因为Oracle、MySQL这些传统的关系型数据库为了保持数据的持久性,数据存放在硬盘中,IO操作速度慢
2、MemCache的数据存放在内存中同时意味着只要MemCache重启了,数据就会消失
3、既然MemCache的数据存放在内存中,那么势必受到机器位数的限制,这个之前的文章写过很多次了,32位机器最多只能使用2GB的内存空间,64位机器可以认为没有上限
然后我们来看一下MemCache的原理,MemCache最重要的莫不是内存分配的内容了,MemCache采用的内存分配方式是固定空间分配
client -> nginx:80(html) ->tomcat:8080(jsp) ->nginx:80 -> client
tomcat-memcached
server2 server3 jsp tomcat 的搭建平台
jsp的搭建
/root/ tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/ 打开jsp包到/usr/local
cd /usr/local/
ln -s jdk1.7.0_79/ java 创建软连接 java
vim /etc/profile
【
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
】 jsp 文件对应路径
source /etc/profile
【echo $JAVA_HOME
echo $CLASSPATH
echo $PATH】 检测配置文件写的路径对错
【
以下为检测jsp是否可以编译java
/root/ vim test.java
public class test {
public static void main(String[] args)
{ System.out.println("hello");
}
}
javac test.java 检测test.java语法是否正确#编译
java test 输出结果#运行
】
tomcat的搭建
tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/ 打开tomcat包到/usr/local
cd /usr/local/
ln -s apache-tomcat-7.0.37/ tomcat 创建软连接:tomcat
cd /usr/local/tomcat
bin/startup.sh 打开tomcat服务 端口 8080
【bin/shutdown.sh 关闭】
cd /usr/local/tomcat/webapps/ROOT/
vim test.isp
【
The time is: <%=new java.util.Date() %> #时间
】
打开浏览器: 172.25.9.2/3:8080/test.jsp
server2 全部做好 server3 :scp -r /usr/local/java/ /usr/local/tomcat/ 172.25.9.3:/usr/local/ 就可以了
cd /usr/local/tomcat
bin/startup.sh 打开tomcat服务 就好了
server1 作为server 2/3 的调度器
之前一搭建好 nginx
cd /usr/local/lnmp/nginx/conf/
vim nginx.conf 加入以下参数
【
http {
upstream java {
# sticky;
server 172.25.9.2:8080;
server 172.25.9.3:8080;
}
location ~ \.jsp$ {
proxy_pass http://java;
其他带有 proxy_pass http://。。。 的 server全部注释掉
】
nginx -t 检查语法错误
nginx 开启
nginx -s reload 刷新配置
打开浏览器: 172.25.9.1/test.jsp 就可以访问 server2/3 的jsp内容了
for i in $( seq 10); do curl 172.25.9.1/test.jsp;done 也可以访问
cookie参数 要重新编译nginx
/root/ tar zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz
cd nginx-1.10.1
make clean 要清除原文件
./configure --help | less 查看编译参数
./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d
make 生成
make install 安装
cd /usr/local/lnmp/nginx/conf/
vim nginx.conf
【
http {
upstream java {
sticky; 加这个参数就可以了
server 172.25.9.2:8080;
server 172.25.9.3:8080;
}
】
打开浏览器: 172.25.9.1/test.jsp 就可以访问 server2/3 的jsp内容了但是因为cookie,所以这个浏览器先缓存的server几就一直访问server几
【 因为以下命令是没有缓存的,所以它还是轮询的
for i in $( seq 10); do curl 172.25.9.1/test.jsp;done 】
下面为 memcached 搭建与测试 在server2/3上
yum install -y memcached 安装
/etc/init.d/memcached start 打开
yum install -y telnet 因为 memcached 数据保存都在内存里 、
telnet localhost 11211 需要telnet连接11211端口查看
stats 进入
cd /usr/local/tomcat/webapps/ROOT/
vim test.jsp
【
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
】
scp test.jsp 172.25.9.3:/usr/local/tomcat/webapps/ROOT/ 发送给server3
在浏览器里 : 172.25.9.1/test.jsp 出现相关页面
在server2/3
cd /usr/local/tomcat
bin/shutdown.sh 关闭tomcat服务
将 kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jar msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar spymemcached-2.7.3.jar
这些包放入server2/3 的 /usr/local/tomcat/lib/下
cd /usr/local/tomcat/conf/
vim context.xml
【
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.9.2:11211,n2:172.25.9.3:11211"
failoverNodes="n1" #在 server3 上此项设置为“n2”
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
】
scp context.xml 172.25.9.3:/usr/local/tomcat/conf/ 发送给server3
cd /usr/local/tomcat
bin/startup.sh 打开 server2/3 的 tomcat 服务
以下为memcached的测试:
打开 172.25.9.2:8080/test.jsp 输入数据 会出现在自己的日志里
cd /usr/local/tomcat
tail -f logs/catalina.out 查看时时日志
但 memcached 由于交叉存储,会存到 n2(server3的内存) 里,
telnet 172.25.9.3 11211
get ID 就可以查看 tomcat2 在 memcached3 里存的数据
打开 172.25.9.3:8080/test.jsp 同理即可
#如果关掉 memcached3 ,server2的tomcat2会存到自己的memcached里也就是 n1
#如果关掉 memcached3 ,同理