文档章节

windows+nginx+memcached+tomcat做负载均衡

区杰
 区杰
发布于 2015/04/18 21:24
字数 1889
阅读 3642
收藏 60
点赞 3
评论 4

首先,我们明确目标,做Tomcat集群的目的是为了提供更高的负载能力,把访问均摊到不同的服务器上。

直观地来说,就是访问test.localhost.com时,nignx会随机将访问请求分发到tomcat1,tomcat2,为了保持session同步,使用memcached去管理session。

为此我们准备的配置清单是: windows x 1 nginx x 1 memcached x 1 tomcat x 2 mysql x 1

部署的架构图如下:

架构图

首先,我准备了一个Java Web项目、tomcat 6、jdk6。 ###Step1 配置tomcat### 先将项目部署到tomcat,因为要用到两个tomcat,当然地要把其中一个tomcat的端口修改一下。
###Step2 配置nginx### 下载安装nginx,http://kevinworthington.com/nginx-for-windows/

在host里准备一个测试域名。打开C:\Windows\System32\drivers\etc\host, 添加域名映射

    127.0.0.1    test.local.com

打开nginx的根目录,在conf里添加test.conf,内容大概如下。

    upstream  test.local.com  {  
                  server   127.0.0.1:8080 weight=1;  
                  server   127.0.0.1:8083 weight=1;  
        }
    server {
            listen       80;
     	server_name test.local.com;
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
    root /data/projects/ycp/bill;
    
        # - rewrite: if( path ~ "^/assets/(.*)" ) goto "/public/assets/$1"
    #    location ~ ^/static/assets/(.*)$
    #    {
    #alias /data/projects/payment/web/public/assets/$1;
    #      access_log off;
    #      #expires 3d;
    #    }
    
    location / {
                index  index.html index.htm  index.jsp;
            }
    
        location ~ .* {
    # proxy_pass_header Server;
     proxy_set_header Host $http_host;
    # proxy_redirect off;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Scheme $scheme;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    add_header Pragma "no-cache";
    proxy_pass http://test.local.com;
        }
    
    
        rewrite ^/admin/?$ /admin/login redirect;
    
        # for rewrite
        rewrite ^/(channel|admin|mobile|api|web)/(.*)$ /public/index.php/$2 last;
    
        #redirect to mobile wap
    #rewrite ^$ /m redirect;
    #rewrite ^/$ /mobile/user redirect;
    
    
    
    }

然后将test.conf引入到nginx.conf里面

    include ycp-test.conf;  

此时,我们可以启动nginx和tomcat,访问http://test.local.com,试试效果。
###Step3 配置和调试memcached### 上一步,我们配好了nginx集群,但是tomcat的session还没有集到一起。接下来我们会用memcached管理session。
下载安装memcached。http://blog.couchbase.com/memcached-windows-64-bit-pre-release-available
点击这里直接下载
ps: memcached官网
解压放某个盘下面,比如在c:\memcached
在CMD下输入 "c:\memcached\memcached.exe -d install" 安装。
再输入:"c:\memcached\memcached.exe -d start" 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。
如图:
memcached服务

启动时可添加其他参数
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助

另外,我们可以用telnet操作memcached
windows如果本来没有telnet命令的话,可以在控制面板-程序和功能-启动或关闭Windows功能里面勾选telnet客户端
telnet客户端

    telnet 127.0.0.1 11211  
    stats

可得到描述Memcached服务器运行情况的参数。如下图:
stats参数
ps:网上给出的一些参数解释

  1. pid: memcached服务进程的进程ID
  1. uptime: memcached服务从启动到当前所经过的时间,单位是秒。
  2. time: memcached服务器所在主机当前系统的时间,单位是秒。
  3. version: memcached组件的版本。这里是我当前使用的1.2.6。
  4. pointer_size:服务器所在主机操作系统的指针大小,一般为32或64.
  5. curr_items:表示当前缓存中存放的所有缓存对象的数量。不包括目前已经从缓存中删除的对象。
  6. total_items:表示从memcached服务启动到当前时间,系统存储过的所有对象的数量,包括目前已经从缓存中删除的对象。
  7. bytes:表示系统存储缓存对象所使用的存储空间,单位为字节。
  8. curr_connections:表示当前系统打开的连接数。
  9. total_connections:表示从memcached服务启动到当前时间,系统打开过的连接的总数。
  10. connection_structures:表示从memcached服务启动到当前时间,被服务器分配的连接结构的数量,这个解释是协议文档给的,具体什么意思,我目前还没搞明白。
  11. cmd_get:累积获取数据的数量,这里是3,因为我测试过3次,第一次因为没有序列化对象,所以获取数据失败,是null,后边有2次是我用不同对象测试了2次。
  12. cmd_set:累积保存数据的树立数量,这里是2.虽然我存储了3次,但是第一次因为没有序列化,所以没有保存到缓存,也就没有记录。
  13. get_hits:表示获取数据成功的次数。
  14. get_misses:表示获取数据失败的次数。
  15. evictions:为了给新的数据项目释放空间,从缓存移除的缓存对象的数目。比如超过缓存大小时根据LRU算法移除的对象,以及过期的对象。
  16. bytes_read:memcached服务器从网络读取的总的字节数。
  17. bytes_written:memcached服务器发送到网络的总的字节数。
  18. limit_maxbytes:memcached服务缓存允许使用的最大字节数。这里为67108864字节,也就是是64M.与我们启动memcached服务设置的大小一致。
  19. threads:被请求的工作线程的总数量。

我们还可以用Java操作memcached
首先下载相关的jar包 Memcached-Java-Client
然后编写客户端OCSUtil.java

    package net.bill.commons.util;

    import org.springframework.stereotype.Component;
    import com.danga.MemCached.MemCachedClient;
    import com.danga.MemCached.SockIOPool;

    @Component
    public class OCSUtil {
    	
    	private static OCSUtil session;
    	
    	public static OCSUtil getSession() {
    		if (session == null) {
    			synchronized(OCSUtil.class){
                    if(session==null){
                    	session=new OCSUtil();
                    }
                }
    		}
    		return session;
    	}
        
        /**
         * memcached客户端
         */
        private MemCachedClient memcache = null;
        
        public OCSUtil(){
        	if (memcache == null) {
        		memcache =new MemCachedClient();  
                String [] addr ={"127.0.0.1:11211"};  
                Integer [] weights = {3};  
                SockIOPool pool = SockIOPool.getInstance();  
                pool.setServers(addr);  
                pool.setWeights(weights);  
                pool.setInitConn(5);  
                pool.setMinConn(5);  
                pool.setMaxConn(200);  
                pool.setMaxIdle(1000*30*30);  
                pool.setMaintSleep(30);  
                pool.setNagle(false);  
                pool.setSocketTO(30);  
                pool.setSocketConnectTO(0);  
                pool.initialize();  
    		}
        }
        
        public void setAttribute(String key, Object value){
        	memcache.set(key, value, 1000);
        }
        
        public  Object getAttribute(String key){
        	return memcache.get(key);
        }
        
        public void removeAttribute(String key){
        	memcache.delete(key);
        }
        
    }

再编写测试代码BaseTest.java和OCSTest.java

    package net.test.modules; 
    import org.junit.Before;
    import org.junit.runner.RunWith;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="/applicationContext.xml")
    public class BaseTest implements ApplicationContextAware{
    	public ApplicationContext ctxt;
    	
    	public void setApplicationContext(ApplicationContext arg0)
    			throws BeansException {
    		this.ctxt = arg0;
    	}
    
    	@Before
    	public void setUp() throws Exception {
    	}
    }  

    package net.test.modules;
    
    import net.bill.commons.util.OCSUtil;
    import net.bill.modules.pojo.User;
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class OCSTest extends BaseTest {
    	
    	@Autowired
    	OCSUtil session;
    	
    	/**
    	 * 通过spring注入获得客户端
    	 */
    	@Test
    	public void test1() {
    		session.setAttribute("user", new User("13355558888"));
    		System.out.println(session.getAttribute("user"));
    	}
    	
    	/**
    	 * 通过静态方法获得客户端(单例)
    	 */
    	@Test
    	public void test2() {
    		OCSUtil session = OCSUtil.getSession();
    		System.out.println(session.getAttribute("user"));
    	}
    }

要注意的是,User类必须实现Serializable接口,进行序列化。因为memcached的value类型是String。

接下来我要用memcached替换tomcat的session
在这之前,可以先看一下memcached-session-manager(google的),或中文翻译的memcached-session-manager配置
session的序列化方案官方推荐的有4种:

  • kryo-serializer
  • javolution-serializer
  • xstream-serializer
  • flexjson-serializer

我使用的是最简单的一种,就是 java serialization。这个只要Java中存入session的对象实现Serializable就可以了。 然后下载以下jar包,并放在tomcat\lib\里

  1. memcached-session-manager-1.8.3.jar
  2. memcached-session-manager-tc6-1.8.3.jar
  3. spymemcached-2.11.1.jar

在tomcat\conf\context.xml,<Context>里加上以下配置:

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
    	    memcachedNodes="n1:127.0.0.1:11211"
    	    username="root"
        	password=""  
    	    sticky="false"  
    	    sessionBackupAsync="false"  
    	    lockingMode="uriPattern:/path1|/path2"  
    	    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
    	    />

启动tomcat,可以看见日志输出以下信息:

    信息: --------  
    - MemcachedSessionService finished initialization:  
    - sticky: false  
    - operation timeout: 1000  
    - node ids: [n1]  
    - failover node ids: []  
    - storage key prefix: null  
    --------  

###Step4 整体测试### 现在可以测一下是否成功。

  1. 启动tomcat1
  2. 访问test.local.com,并登录
  3. 启动tomcat2,关闭tomcat1
  4. 查看登录信息是否还在

测试通过的话,就基本上没问题了。

© 著作权归作者所有

共有 人打赏支持
区杰
粉丝 2
博文 6
码字总数 3142
作品 0
广州
程序员
加载中

评论(4)

区杰
区杰

引用来自“leo_soul”的评论

你好,问一下 ,我的是非粘性配置的msm,在nginx中跟你的基本一样 都是默认轮询方式。两台tomcat,1和2,两个memcache,n1,n2两个节点,测试程序只有一个jsp,里边有session.getId(),session.getAttrubite("hi"),session.setAttrubite("hi","hi")这三行输出。目前有这样的现象:每次访问到tomcat1的时候,服务器强制修改了jsessionid,刷新页面后访问的是tomcat2中的相同内容jsp,session能够保持。请问这是什么情况?
是不是因为有n1、n2两个节点?
leo_soul
leo_soul
求救
leo_soul
leo_soul
你好,问一下 ,我的是非粘性配置的msm,在nginx中跟你的基本一样 都是默认轮询方式。两台tomcat,1和2,两个memcache,n1,n2两个节点,测试程序只有一个jsp,里边有session.getId(),session.getAttrubite("hi"),session.setAttrubite("hi","hi")这三行输出。目前有这样的现象:每次访问到tomcat1的时候,服务器强制修改了jsessionid,刷新页面后访问的是tomcat2中的相同内容jsp,session能够保持。请问这是什么情况?
Josean_Luo
Josean_Luo
可以的很
四层负载均衡转发模式

负载均衡又分为四层负载均衡和七层负载均衡。四层负载均衡工作在OSI模型的传输层,主要工作是转发,它在接收到客户端的流量以后通过修改数据包的地址信息将流量转发到应用服务器。 image 七层...

高广超
01/01
0
0
流量负载均衡的分层

关于网络的负载均衡也是分层次的,曾经想过使用linux的bonding功能来做OpenVPN的tun网卡的负载均衡,在主机上启动多个OpenVPN实例从而得到多个tun网卡,然后将多个tun网卡bond到一个bonding...

晨曦之光
2012/04/10
158
0
详解分布式集群的负载均衡

漫谈分布式集群的负载均衡 1 什么是分布式集群 为了理解分布式集群这个概念,我们先说说这两个概念:“集群”和“分布式”。艺术来源于生活,计算机科学亦是如此。我们先通过例子,来了解一下...

caoye126
2017/05/16
0
0
WSFC2016 VM负载均衡

在2012时代中,智能放置功能得到了更新,当我们执行手动移动至最佳节点,故障转移,维护模式时,默认如果没有任何设置,例如首选所有者,可能所有者,反相关性等,群集先会根据内存智能放置功...

老收藏家
2017/09/06
0
0
全栈必备:负载均衡

来源:伯乐在线专栏作者 - abel_cao 链接:http://blog.jobbole.com/106851/ 点击 → 了解如何加入专栏作者 一个了不起的创意会产生一个很棒的产品,如果它一炮走红,你发现手中的是下一个f...

Oscarfff
2016/11/04
70
0
集群、分布式的区别

1、Linux集群主要分成三大类( 高可用集群, 负载均衡集群,科学计算集群)(下面只介绍负载均衡集群) 负载均衡集群(Load Balance Cluster) 负载均衡系统:集群中所有的节点都处于活动状态,它...

Sheamus
2015/09/11
165
0
集群、分布式、负载均衡区别与联系

1、Linux集群主要分成三大类( 高可用集群, 负载均衡集群,科学计算集群)(下面只介绍负载均衡集群) 负载均衡集群(Load Balance Cluster) 负载均衡系统:集群中所有的节点都处于活动状态,它...

天下杰论
2014/09/17
0
0
负载均衡001_基础概述

1,概述 负载均衡(Load Balance)意思是服务器的负载压力均衡到多个服务器上;在网络世界中所有的信息传递都是通过IO来实现,只要有信息传输的地方就会有IO;网络就是信息传递所支起来的一个...

天呀鲁哇
2016/10/13
9
0
MASQUERADE target在负载均衡中引出的问题

linux中如何配置路由负载均衡是一个古老的问题,可是至今仍然没有什么好的解决方案,我指的解决方案是配置意义上的,如果可以触动内核源代码的话,补丁倒是有好几个,不过很多的linux服务器是...

晨曦之光
2012/04/10
109
0
mysql数据库数据同步问题

请教大家个问题,最近被一些概念搞蒙了,负载均衡、集群...,我是先了解到Nginx是做反向代理负载均衡的,我的理解:比如web服务器访问量很大的时候,可以搞一台代理服务器,相同的web项目部署...

樱木花道VS康
2017/11/15
95
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

rabbitmq学习记录(六)交换机Exchange-direct

实现功能:一条消息发送给多个消费者 交换机模式:direct 相比于之前的fanout模式,可以进一步的筛选获取消息的消费者。 fanout模式下,只要消费者监听的队列,已经与接收生产者消息的交换机...

人觉非常君
17分钟前
0
0
Java 之 枚举

Java 中声明的枚举类,均是 java.lang.Enum 类的子类,Enun 类中的常用方法有: name() 返回枚举对象名称 ordinal() 返回枚举对象下标 valueOf(Class enumType, String name) 转换枚举对象 ...

绝世武神
26分钟前
0
0
使用爬虫实现代理IP池之放弃篇

啥叫代理IP以及代理IP池 概念上的东西网上搜索一下就好了,这里简单科普一下(大部分会读这篇文章的人,基本是不需要我来科普的),白话说就是能联网并提供代理访问互联网的服务器,它提供的...

一别丶经年
41分钟前
0
0
sqoop导入数据到Base并同步hive与impala

使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 基础环境 Sqool和Hive、HBase简介 Sqoop Hive HBase 测试Sqoop 使用Sqoop从MySQL导入数据到Hive 使用复杂SQL 调整Hive数据类型 不断更新 ...

hblt-j
今天
0
0
Dart 服务端开发 文件上传

clent端使用angular组件 upload_component.html form id="myForm" method="POST" enctype="multipart/form-data"> <input type="file" name="fileData"> <!-- file field --></form>......

scooplol
今天
0
0
apache和tomcat同时开启,乱码问题

tomcat和apache同时开启,会走apache的转发,执行的是AJP/1.3协议。所以在tomcat的配置文件server中, <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" useBodyEncodingForU......

Kefy
今天
0
0
使用ssh-keygen和ssh-copy-id三步实现SSH无密码登录 和ssh常用命令

ssh-keygen 产生公钥与私钥对. ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利 第一步...

xtof
今天
0
0
orcale 查询表结构

SELECT t.table_name, t.colUMN_NAME, t.DATA_TYPE || '(' || t.DATA_LENGTH || ')', t1.COMMENTS FROM User_Tab_Cols t, User_Col_Comments t1WHERE t.table_name......

wertwang
今天
0
0
华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大

华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps、超级...

华为终端开放实验室
今天
0
0
多 SSH Key 实现同一台服务器部署多 Git 仓库

本文以以下需求为背景,介绍详细的做法: 需在同一台服务器同时部署两个不同的 Github 仓库(对 Bitbucket 等 git 服务同样适用) root 用户可在远程登录 SSH 后附上预期的 SSH Key 进行 gi...

yeahlife
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部