实验一:

负载均衡

负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题。
 Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;
 Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
Tomcat-1 (T1) 将 session 存储在 memcached-2 (T2)上。只有当 M2 不可用时,T1 才将 session 存储在 memcached-1 上(M1 是 T1 failoverNode)。使用这种配置的好处是,当 T1 和 M1 同时崩溃时也不会丢失 session 会话,避免单点故障。Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。
实验一:
以下步骤在 ip:20 与 ip:80 上实施:
jdk 安装
sh jdk-6u26-linux-x64.bin
mv jdk1.6.0_26/ /usr/local/jdk
vi /etc/profile
  1. export JAVA_HOME=/usr/local/jdk 
  2. export CLASSPATH=:$JAVA_HOME/lib 
  3. export PATH=$PATH:$JAVA_HOME/bin 
source /etc/profile
安装tomcat
lftp 192.168.0.254:/pub/docs/java> get apache-tomcat-7.0.8.tar.gz
tar zxf apache-tomcat-7.0.8.tar.gz -C /usr/local
mv /usr/local/apache-tomcat-7.0.8 /usr/local/tomcat
两台机子都得要安装java和tomcat。但是要作为nginx服务器的那个必须要安装nginx,而另一台不需要。假设nginx安装在:ip:20上。ip:80没有安装。
在安装了nginx 的机子上
IP:192.18.0.20
IP :192.168.0.80
此时如果只有一台机子承担负重,那么
(1)首先你需要添加用户 useradd www
(2)你需要编辑文件: vi /usr/local/nginx/conf/nginx.conf
 
  1.  user  www www;  
  2. worker_processes  4;  
  3. error_log  logs/error.log;  
  4. events {  
  5.     use epoll;  
  6.     worker_connections  1024;  
  7. }  
  8. http {  
  9.     include       mime.types;  
  10.     default_type  application/octet-stream;  
  11.     sendfile        on;  
  12.     tcp_nopush     on;  
  13.     keepalive_timeout  65;  
  14.     gzip  on;  
  15.     server {  
  16.         listen       80;  
  17.         server_name  localhost;  
  18.         location / {  
  19.             root   html;  
  20.             index  index.html index.htm;  
  21.         }  
  22.         error_page   500 502 503 504  /50x.html;  
  23.         location = /50x.html {  
  24.             root   html;  
  25.         }  
  26.         location ~ \.php$ {  
  27.             root           html;  
  28.             fastcgi_pass   127.0.0.1:9000;  
  29.             fastcgi_index  index.php;  
  30.             include        fastcgi.conf;  
  31.         }  
  32.     location /status {  
  33.     stub_status on;  
  34.     access_log  off;  
  35.     }  
  36.     location ~\.jsp$  
  37.     {  
  38.     proxy_pass http://192.168.0.20:8080;   //所有的jsp页面交给tomcat处理,动静分离,这样你访问的时候就不用亲自去输入8080端口了,因为nginx是访问的静态的,tomcat访问的是动态的页面。  
  39.     }       
  40.     }  
  41. }  

  //所有的jsp页面交给tomcat处理,动静分离,这样你访问的时候就不用亲自去输入8080端口了,因为nginx是访问的静态的,tomcat访问的是动态的页面。  

(3)配置完成后,
    nginx -t
    nginx (启动nginx)
/usr/local/tomcat/bin/startup.sh(在含有nginx开启服务shutdown是关闭服务)
    你可以测试啦:
 测试页面是vi    /usr/local/tomcat/webapps/ROOT/test.jsp
           The time on desktop 20 is:<%= new java.util.Date() %>
      http://192.168.0.20/test.jsp
       不断刷新会出现变化的时间,倘若你把tomcat关闭了,那么你 http://192.168.0.20则默认访问的是nginx 的访问页面,要是你将nginx关闭了,httpd是开着的话,那么你默认访问的是/var/www/html下的访问页面。
实验二:
(1)为了实现负载均衡,你需要用两台服务器做实验,
此时你在两台主机上配置了java和tomcat。
(2)    编辑文件: vi /usr/local/nginx/conf/nginx.conf

  此时,进行测试:注意两个主机上的文件应该是一致的。都得有test.jsp

  1. upstream tomcat { 
  2.       server 192.168.0.9:8080; 
  3.       server 192.168.0.85:8080; 
  4.    }(此处应该写在http下面并且在proxy_pass的上面的!) 
  5. location ~\.jsp$ { 
  6.               proxy_pass http://tomcat; 
  7. }//(此处应该在上面,在location的位置。否则报错的)   

   访问网页进行测试:  http://192.168.0.20/test.jsp

此时你刷新,会有不断的两个服务器建进行切换,当一台主机的tomcat关闭的时候,只会留在一台机子查询。
实验三:
    当一个客户端访问多个同一个网址时,怎么样避免一个客户访问一个网站的时候只在一个服务器上进行,不进行切换,节省资源。也就是说就像淘宝一天访问量数亿的,一个客户可能要访问好多页面,如何我这一个客户访问的只是一台服务器,不再进行服务器间的切换,避免资源浪费。此时你需要设置如下:
    首先你需要重新编译源码:nginx 因为之前编译的时候你没有加载sticky模块。
注: nginx-sticky-module 为 nginx 的第三方模块,使 nginx 支持 sticky 模式,所谓sticky 模式就是指同一个用户的访问请求都被发送到同一个 tomcat 实例上处理。
    (1)lftp 192.168.0.254:/pub/docs/java> get nginx-sticky-module-1.0.tar.gz
    cd ~
    下载nginx-sticky-module-1.0.tar.gz
        tar zxf nginx-sticky-module-1.0.tar.gz   
        cd nginx-1.0.6
              make clean重新编译
        ./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_ssl_module --add-module=/root/nginx-sticky-module-1.0/
  make && make install
     (2)编辑文件: vi /usr/local/nginx/conf/nginx.conf
  
  1. upstream tomcat   
  2. {       sticky;   
  3.     server 192.168.0.20:8080;   
  4.     server 192.168.0.80:8080;      
  5.  }      
  6. location ~\.jsp$   
  7.  {   
  8.     proxy_pass http://tomcat;   
  9. }//(此处应该在上面,在location的位置。否则报错的)   
      (3)
    测试: nginx -t
        nginx
     访问网页进行测试:  http://192.168.0.20/test.jsp
    假设此时两台主机的tomcat都是开着的。那么访问不管你如何刷新都会自定位在一台服务器上,假设定位到ip:20时,你关掉20上的tomcat,此时会自动切换到80上面去的。
实验四:假设你在访问一台服务器时,突然一台服务器崩溃了,客户可不会理解你。你丢了别人的数据后果很严重的,所以,假设你在一台服务器上访问的数据,突然崩了另一台应该接管着
步骤一:在IP :20上做
    cd /usr/local/tomcat/lib
    lftp 192.168.0.254
    cd /pub/docs/java/jar
    mget *
    yum install memcached
    /etc/init.d/memcached start  
    在IP:80上也应改那么做
    cd /usr/local/tomcat/lib
    lftp 192.168.0.254
    cd /pub/docs/java/jar
    mget *
    yum install memcached
    /etc/init.d/memcached start
    netstat    -antlp | grep :11211(memcache的端口)
(2)    在ip:20
       
  1.    vi /usr/local/tomcat/conf/context.xml  
  2.     <Context> 
  3.     ......  
  4.     <Manager                 className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
  5.     memcachedNodes="n1:192.168.0.20:11211,n2:192.168.0.80:11211" 
  6.     failoverNodes="n1" 
  7.     #在 node2 上此项设置为“n2”  
  8.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 
  9.  transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
  10. /> 
  11. </Context> 
    在ip:80
    
  1.    vi /usr/local/tomcat/conf/context.xml  
  2.     <Context> 
  3.     ......  
  4.     <Manager                 className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
  5.     memcachedNodes="n1:192.168.0.20:11211,n2:192.168.0.80:11211" 
  6.     failoverNodes="n2" 
  7.     #在 node2 上此项设置为“n2”  
  8.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 
  9.  transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
  10. /> 
  11. </Context> 

 分别在两台机子上启动tomcat

/usr/local/tomcat/bin/startup.sh
启动 tomcat
(/usr/local/tomcat/bin/shutdown.sh 关闭 tomcat)
(3)在两台主机上均要编辑文件:
    /usr/local/tomcat/webapps/ROOT/test.jsp
 
  1. <%@ page contentType="text/html; charset=GBK" %> 
  2. <%@ page import="java.util.*" %> 
  3. <html><head><title>Cluster App Test</title></head> 
  4. <body> 
  5. Server Info:  
  6. <%  
  7. out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%> 
  8. <%  
  9. out.println("<br> ID " + session.getId()+"<br>");  
  10. String dataName = request.getParameter("dataName");  
  11. if (dataName != null && dataName.length() > 0) {  
  12. String dataValue = request.getParameter("dataValue")  
  13. session.setAttribute(dataName, dataValue);  
  14. }  
  15. out.print("<b>Session list</b>");  
  16. Enumeration e = session.getAttributeNames();  
  17. while (e.hasMoreElements()) {  
  18. String name = (String)e.nextElement();  
  19. String value = session.getAttribute(name).toString();  
  20. out.println( name + " = " + value+"<br>");  
  21. System.out.println( name + " = " + value);  
  22. }  
  23. %> 
  24. <form action="test.jsp" method="POST"> 
  25. name:<input type=text size=20 name="dataName"> 
  26. <br> 
  27. key:<input type=text size=20 name="dataValue"> 
  28. <br> 
  29. <input type=submit> 
  30. </form> 
  31. </body> 
  32. </html> 

 测试:访问 http://192.168.0.20/test.jsp,不同的主机访问时会调度到不同的 tomcat 实例上处理来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down 掉当前正在响应的 tomcat 实

例,nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉.
假如你刚开始访问的是20,你添加用户name:sushan,key:sushan,那么此时你在cat /usr/local/tomcat/logs/catalina.out就可以看到你新添加用户了,当你将ip:20上的tomcat服务down掉,那么自动转换到ip:80上去,此时你在ip:80上会看到cat /usr/local/tomcat/logs/catalina.out里面含有你刚才添加的用户。