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

首先,我们明确目标,做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的端口修改一下。

Step2

下载安装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

上一步,我们配好了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的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
如图:

启动时可添加其他参数
-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 127.0.0.1 11211
    stats

可得到描述Memcached服务器运行情况的参数。如下图:

ps:网上给出的一些参数解释

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

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

    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);
        }

    }

再编写测试代码

    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,或中文翻译的memcached-session-manager配置
session的序列化方案官方推荐的有4种

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

我使用的是最简单的一种,就是javolution-serializer。这个只要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, 里加上以下配置:

    <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. 查看登录信息是否还在

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

时间: 2024-10-06 07:25:28

windows+nginx+memcached+tomcat做负载均衡的相关文章

nginx tomcat做负载均衡

之前使用nginx做过web反向代理,没有做过负载均衡,今天有个同学需要做tomcat的负载均衡,我也研究下. 一共是2个机器,一个物理机(win7)上面部署2个tomcat,使用不同的端口启动.vm中的虚拟机放(centos)nginx,给tomcat做负载均衡. inux ip: 192.168.37.129 win ip: 192.168.37.1 首先保证两个主机可以互ping,响应的端口开放. nginx上使用80 tomcat1 使用8081 tomcat2使用8080 nginx,

[Linux]nginx tomcat做负载均衡

之前使用nginx做过web反向代理,没有做过负载均衡,今天有个同学需要做tomcat的负载均衡,我也研究下. 一共是2个机器,一个物理机(win7)上面部署2个tomcat,使用不同的端口启动.vm中的虚拟机放(centos)nginx,给tomcat做负载均衡. inux ip: 192.168.37.129 win ip: 192.168.37.1 首先保证两个主机可以互ping,响应的端口开放. nginx上使用80 tomcat1 使用8081 tomcat2使用8080 nginx,

Nginx 服务器 之Nginx与tomcat实现负载均衡

  本文讲解我们如何使用Nginx做反向带服务器,实现nginx与tomcat服务器集群做负载均衡. 一.nginx与tomcat实现负载均衡 1.在/usr/local/ngnix/conf  创建文件 nginx-tomcat.conf 文件内容: user  nobody; worker_processes  2; events {        worker_connections  1024;     } http{    # upstream 配置一组后端服务器,     # 请求转

Nginx+tomcat 做负载均衡

架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomcat) 优点:实现了可弹性化的架构,在压力增大的时候可以临时添加tomcat服务器添加到这个架构里面去 一,配置nginx 1,  下载包 Wget http://sysoev.ru/nginx/nginx-0.6.32.tar.gz ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre

Tomcat(五):nginx/httpd + tomcat及负载均衡tomcat

*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-template_comment, .diff .hljs-header, .hljs-javadoc { color: #998; font-style: italic; } .hljs-keyword, .css .rule .hljs-keyword, .h

nginx+keepalived+tomcat+memcache负载均衡搭建小集群

最近一段时间一直在研究高可用高并发负载均衡分布式集群等技术,先前发布了lvs基于网络第四次协议搭建的小集群,现在用空刚好搭建了一个基于nginx搭建的小集群. 我准备了四台机器,情况如下 机器名称 机器IP 安装软件 角色 虚拟ip 描述 vmm01 192.168.252.11 Nginx.keepalived Nginx主机 192.168.252.200 反向代理到tomcat1和tomcat2 vmm04 192.168.252.14 Nginx.keepalived Nginx备机 主

LNMT架构部署:Linux+Nginx+Mysql+Tomcat(负载均衡,动静分离)

环境描述:虚拟机准备两台,一台作为nginx服务器+mysql服务器,IP为:192.168.55.129:另外一台作为2台Tomcat服务器,IP为:192.168.55.130.客户端发来请求,首先由nginx处理,如果为静态内容直接由nginx响应,将结果直接给客户端:如果为动态内容,则由nginx反代至后端的Tomcat服务器. 在IP为192.168.55.129的服务器上安装和配置nginx关闭防火墙和selinux [[email protected] ~]# systemctl

Nginx+Keepalived+Tomcat+MySQL负载均衡&amp; 通过nginx调度器访问Tom

目录第一部分 环境准备第二部分 部署调度器-搭建Nginx+Keepalived(双机热备)第三部分 部署服务器池-搭建Tomcat第四部分 搭建Mysql数据库第五部分 案例应用 第一部分 环境准备 一:Nginx+keepalived服务器两台(调度器,双机热备)系统:Linux-CentOS7.4IP地址:192.168.40.15192.168.40.16软件需求:nginx安装包(nginx-1.13.9.tar.gz)Keepalived安装包(keepalived-1.4.2.ta

nginx 配置tomcat 实现负载均衡

环境:准备三台机械: 两台安装tomcat 一台安装nginx;安装步骤省略:tomcat一台的IP:http://192.168.195.132:8080另一台tomcat一台的IP:http://192.168.195.133:8080nginxIP:http://192.168.195.134主要:nginx的配置文件nginx.conf:#user  nobody;worker_processes  1; #error_log  logs/error.log;#error_log  lo