> 文档中心 > Linux环境下Tomcat负载均衡集群的搭建

Linux环境下Tomcat负载均衡集群的搭建


1. Tomcat负载均衡集群搭建

在这里插入图片描述

关于代理服务器

  • 代理服务器自身并不负责处理请求,而是把请求转发给真正的服务器,真正的服务器处理完之后,返回给它,它再去做一个响应,这叫反向代理服务器。

Nginx就是一个反向代理服务器,日后它可以接收大规模的请求,接收完成之后它可以把我们的请求均分到所有的集群结点之中。也就是说,日后可以通过Ngnix去管理服务器集群中的众多节点。日后所有的请求经过Ngnix时,Ngnix就可以帮助我们解决负载均衡,Ngnix的核心就是去完成负载均衡。Ngnix不仅可以作为方向代理服务器,它还可以作为(正向代理)服务器去解决跨域问题和动静分离问题。

  • 跨域比方说就是自己的电脑去访问 www.baidu.com 这是跨域名

  • 动静分离解决的是项目中的动态资源和静态资源的分离处理,比如说 jsp 不依托于服务器没法使用,jsp属于动态资源,所以日后还是把jsp放到应用服务器上。把项目中静态资源相关的直接部署到Ngnix上,如果请求中一半请求是静态资源的话,无需经过后端的应用服务器,直接由Nginx响应。

还有一点,Ngnix必须实现Session共享,为什么呢?

首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题。

注:关于Session共享的分析引自 简书

session共享的解决方案有两种:

第一种是tomcat之间session同步

比如有一个请求在tomc1上创建了session,那tom2、tom3······要跟着去同步,这样根据负载均衡的原理,无论到tom2还是tom3上都能找到对应的session,

第二种是使用redis或cachedb实现session共享,当然第二种方式是现在主流的方式

第二种方式是在整个系统架构的后面构建一个redis集群或者Memcachedb集群,它们叫做分布式的缓存服务器,然后由分布式缓存服务器统一的去管理应用服务器的session数据,当然为了避免单节点的并发压力问题,分布式缓存服务器也要做集群处理。分布式缓存服务器核心解决的就是session共享问题,它是怎么解决的呢?用户登录之后会有一个用户信息,我们可以将用户信息放到 redis 或者  cachedb 里面,日后根据负载均衡的原理,会对应到tom2上,然后统一去redis中复制一下用户信息到本机的session中,这样的话我们就可以实现session共享了。

接下来是关于tomcat负载均衡集群的搭建

分为两步,第一步是搭建tomcat集群,第二步是实现session管理,这里我们使用的是memcached来完成Session之间的共享。

首先我们来搭建一下 Nginx管理Tomcat集群实现负载均衡,

这里我们搭建一下伪分布式,所谓伪分布式就是在一台机器上启动三个tomcat,但是这三个tomcat服务的端口不同。在一台机器上搭建Nginx,在另一台机器上启动三个tomca服务。

要搭建负载均衡集群那就要提前安装好Nginx

小知识:在Linux中执行 halt 指令Linux会关机

1.1 安装Nginx

1.1.1 Nginx的引言

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:京东、新浪、网易、腾讯、淘宝等。

Nginx是由c语言写的,所以我们需要去编译安装

1.1.2 Nginx的安装

# 0.安装c语言环境以及必要依赖Ngnix是由c语言写的,之后安装Ngnix要对其进行编译安装,所以我们这里要安装c语言环境yum install -y gcc pcre-devel zlib-devel# 1.下载Nginx从官网下载下来的是一个源码包,我们要对它进行编译安装http://nginx.org/en/download.html# 2.将Nginx上传到linux中,并解压缩 tar -zxvf nginx-1.11.1.tar.gz# 3.查看Nginx安装目录lsauto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src其中有一个configure文件是用来生成编译文件的# 4.生成编译文件并检查是否缺少相关依赖并制定编译文件编译的位置  在Nginx安装目录中执行如下命令:(指定安装位置)执行下面命令后会生成一个Makefile编译文件,还会检测是否缺少相关依赖,缺少依赖会报错,另外还指定了编译出来的Ngnix应用的安装位置。cd nginx-1.11.1./configure --prefix=/usr/nginx# 5.执行编译文件安装Ngnix在Nginx的源码包目录中执行如下命令进行编译安装执行如下命令编译之后并将它安装到 /usr 目录下cd nginx-1.11.1make && make install# 6.编译完成后进入编译安装目录/usr/nginx目录中查看:编译安装之后 /root 下的源码包 nginx-1.11.1.tar.gz 其实就可以删除了ls -ldrwxr-xr-x. 2 root root 4096 10月 14 21:17 confdrwxr-xr-x. 2 root root   40 10月 14 21:17 htmldrwxr-xr-x. 2 root root    6 10月 14 21:17 logsdrwxr-xr-x. 2 root root   19 10月 14 21:17 sbin其中conf配置目录,html是Nginx的家目录,logs是日志目录,sbin中是启动Nginx的脚本文件conf目录中其中的一个配置文件nginx.conf可以用来修改Nginx的相关配置html目录中有两个html文件index.html、50x.html ,其中 index.html 是它的主页,50x.html是报相关错误时显示的页面。logs中是一些日志文件sbin中有一个nginx文件,是用来启动Nginx的# 7.启动nginx,进入nginx安装目录的sbin目录中执行:nginx的端口是80端口,我们知道不加任何参数默认就是80端口,所以启动Nginx非常简单,在 /usr/nginx/sbin/ 目录下直接执行 ./nginx 运行Nginx即可cd /usr/nginx/sbin/./nginx   执行nginx文件之后可以使用下面指令查看Nginx是否启动成功ps -aux|grep redisnginx在启动时会有两个进程,一个是master,一个是worker,在关闭时只需要关闭master,worker就会跟着关闭了# 8.在windows中浏览器访问,可以看到nginx欢迎页面:http://192.168.72.132/这是Nginx的服务器功能,但是在负载均衡集群这里我们使用的是Nginx的反向代理功能去管理tomcat集群注意:关闭网络防火墙# 9.关闭nginx,进入nginx安装目录的sbin目录中执行:cd /usr/nginx/sbin/./nginx -s stop# 10.nginx配置文件在nginx安装目录的conf目录中:cd /usr/nginx/conf其中有一个nginx.conf配置文件注意:nginx.conf为nginx的配置文件,可以在nginx.conf修改nginx默认配置

1.2 启动多个tomcat

启动多个tomcat的话就需要将tomcat压缩包解压三份# 0.准备多个tomcat tar -zxvf apache-tomcat-8.5.78.tar.gz #解压缩一个新的tomcat安装包 mv apache-tomcat-8.5.78 tomcat1  #将名称改为tomcat1 cp -r tomcat1/ tomcat2 #复制一份 cp -r tomcat1/ tomcat3  #复制一份# 1.此时当前目录中有三个服务器,如下:[root@localhost ~]# ls -l总用量 12248-rwxrwxrwx. 1 root root  11623939 10月 13 12:25 apache-tomcat-8.5.78.tar.gzdrwxr-xr-x. 9 root root220 10月 14 21:28 tomcat1drwxr-xr-x. 9 root root220 10月 14 21:38 tomcat2drwxr-xr-x. 9 root root220 10月 14 21:38 tomcat3# 2.修改tomcat1端口号:(伪分布式)vim tomcat1/conf/server.xml每个服务器关闭时所占用的端口号、http协议端口、AJP协议端口都不能一样所以为了使得三个tomcat可以在一台机器上运行我们要修改端口号vim tomcat1/conf/server.xml命令修改如下内容:a.   ---关闭端口b.   c. ---AJP协议端口# 3.修改tomcat2端口号:(伪分布式)vim tomcat2/conf/server.xml命令修改如下内容:  a.b.   c.# 4.修改tomcat3端口号:(伪分布式)vim tomcat3/conf/server.xml命令修改如下内容:  a.b.   c.# 5.将多个tomcat启动:tomcat1/bin/startup.sh tomcat2/bin/startup.sh tomcat3/bin/startup.sh# 6.查看tomcat是否启动成功ps -aux|grep tomcat最后可以使用如下命令查看日志    tail -f tomcat1/logs/catalina.out    tail -f tomcat2/logs/catalina.out    tail -f tomcat3/logs/catalina.out# 7.在windows中分别访问tomcat,都看到主页代表启动成功:http://192.168.72.135:8989/http://192.168.72.135:8990/http://192.168.72.135:8991/注意:这步一定要关闭网路防火墙# 8.将多个tomcat配置到nginx的配置文件中:vim /usr/nginx/conf/nginx.conf配置它管理的tomcat集群中每个tomc1).在server标签的上面加入如下配置:    upstream tomcat-servers {      server 192.168.72.135:8989;      server 192.168.72.135:8990;      server 192.168.72.135:8991;    }2).将配置文件中 location /替换为如下配置:使用了Nginx之后,Nginx将请求转给tomcat,然后tomcat返回给Nginx,那么访问Nginx看到的应该是某个tomcat的画面location / { proxy_pass http://tomcat-servers; proxy_redirect    off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_next_upstream http_502 http_504 error timeout invalid_header;   }# 9.进入nginx安装目录sbin目录启动nginx加载配置文件启动cd /usr/nginx/sbin/./nginx -c /usr/nginx/conf/nginx.conf上面加载配置文件启动时必须是绝对路径# 10.访问nginx,看到其中一个tomcat画面:http://192.168.72.132/ 因为我们使用的是一台机器启动三个tomcat服务,所以我们可以修改一下三个tomcat文件中的首页以便于我们在访问Nginx时可以证明它的确起到了负载均衡的作用vim tomcat1/webapps/ROOT/index.jsp vim tomcat2/webapps/ROOT/index.jsp vim tomcat3/webapps/ROOT/index.jsp 

1.3 Nginx负载均衡策略

./nginx -s stop./nginx -c /usr/nginx/conf/nginx.confvim /usr/nginx/conf/nginx.conf# 1.轮询按照顺序循环,轮询是由请求的先后顺序组成的 说明: 默认策略,每个请求会按时间顺序逐一分配到不同的后端服务器 Nginx还可以做到动态剔除,当某个tomcat宕机,之后Nginx不会再将请求转向它 当宕机的tomcat重新启动服务时,Nginx会瞬间将其加入管理之中# 2.weight 权重vim /usr/nginx/conf/nginx.conf说明: weight参数用于指定轮询几率,weight的默认值为1,;weight的数值与访问比率成正比     upstream tomcat-servers { server localhost:8989   weight=10;   server localhost:8990   weight=3;   server localhost:8991   backup;      }    注意:1.权重越高分配到需要处理的请求越多。2.此策略可以与least_conn和ip_hash结合使用主要用于后端服务器性能不均    主要用于后端服务器性能不均这种情况# 3.ip_hash  4%3=1 对客户端ip取哈希,取哈希结果之后去与服务器可用的节点数做一个模运行,这种方式可以保证客户端始终在一个固定节点上(前提是客户端ip不变) 说明:指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器, 可以解决session不能跨服务器的问题。(前提是这个服务器不宕机) upstream tomcat-servers { ip_hash;    #保证每个访客固定访问一个后端服务器 server localhost:8080; ......    }# 4.least_conn说明: 把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。upstream tomcat-servers{ least_conn;    #把请求转发给连接数较少的后端服务器 server localhost:8080;    }

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.4 MSM配置

Memcached Session Manager基于memcache缓存的session共享.即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cacheDB中查找,如果找到则复制到本机,这样实现session共享和高可用。

memcached是缓存服务器,不是web服务器,不具备web功能,所以我们不能通过在浏览器中输入memcached所在的服务器的ip地址去访问memcached

# 0.准备一个memcache服务# 1.安装memcached yum install -y memcached# 2.启动memcachedmemcached一安装完成之后会直接在系统中形成一个memcached的服务,我们可以直接使用memcached指令去启动memcachedmemcached -p 11211 -vvv -u root其中 -p 是指定memcached的端口,memcached默认的端口是 11211-vvv 是显示memcached的启动日志,-u代表作为root用户启动memcached是内存级产品,是不允许让其他用户启动的,因为它会占用生产上一定的内存,根据Linux权限的设计,在占用大内存时需要root用户,在启动时需要明确加一个 -u root 参数# 3.tomcat安装的lib目录中放入与memcache整合jar包在tomcat中配置一些tomcat的信息然后让tomcat自动的把session数据交给memcached管理就可以了配置tomcat去连接到memcached,memcached是用c语言写的,而tomcat是用java写的,通过java操作memcached需要去引入tomcat与memcached的整合的一些依赖jar包不同版本的tomcat使用的依赖jar包是不一样的,这里我使用的tomcat8版本的依赖jar包将这些jar包放入tomcat目录中的lib目录中cp tom8-msm/*.jar tomcat1/lib/cp tom8-msm/*.jar tomcat2/lib/cp tom8-msm/*.jar tomcat3/lib/# 4.配置tomcat目录中conf目录中context.xml(所有tomcat均需要配置)日后tomcat还需要知道它应该把session信息放到哪个memcached节点上,所以还需要在tomcat中配置memcached所在的服务器ip以及端口(每个tomcat都需要配置)加入的下面的语句就是整个session管理的配置,其中指明了使用哪个类把session数据备份到memcached中,下面的 n1 是memcached结点的名字,名字起什么都可以有多个的话中间用逗号隔开,写另外机器的ip和端口memcachedNodes="n1:192.168.72.136:11211,nq:192."vim tomcat1/conf/context.xml把下面的内容复制到配置文件的标签的里面    启动顺序:memcached --> tomcat --> nginx关闭顺序;nginx --> tomcat --> memcached

接下来我们来实际操作一下:

在本次搭建Tomcat负载集群中,我使用了三个虚拟机,

一个其中安装的是Ngnix,第二个中安装了三个Tomcat,第三个安装memcached

在这里插入图片描述

  1. 安装Ngnix

Ngnix是由c语言写的,之后安装Ngnix要对其进行编译安装,所以我们这里要安装c语言环境

yum install -y gcc pcre-devel zlib-devel

从官网下载下来的是一个源码包,我们要对它进行编译安装

http://nginx.org/en/download.html

将Nginx上传到linux中,并解压缩

tar -zxvf nginx-1.11.1.tar.gz

生成编译文件并检查是否缺少相关依赖并制定编译文件编译的位置

cd nginx-1.11.1./configure --prefix=/usr/nginx

执行编译文件安装Ngnix

cd nginx-1.11.1make && make install

启动nginx

cd /usr/nginx/sbin/./nginx   

补充:关闭Nginx

cd /usr/nginx/sbin/./nginx -s stop
  1. 启动多个Tomcat

准备多个tomcat,将tomcat压缩包解压三份

tar -zxvf apache-tomcat-8.5.78.tar.gz   #解压缩一个新的tomcat安装包mv apache-tomcat-8.5.78 tomcat1  #将名称改为tomcat1cp -r tomcat1/ tomcat2 #复制一份cp -r tomcat1/ tomcat3  #复制一份

为了使的这三个tomcat可以在一台机器上运行,我们还需要配置这三个tomcat包中的配置文件

修改三个tomcat端口号:(伪分布式)

# 修改tomcat1端口号:(伪分布式)vim tomcat1/conf/server.xmla.   ---关闭端口b.  c. ---AJP协议端口  # 3.修改tomcat2端口号:(伪分布式)vim tomcat2/conf/server.xml  a.b.   c.# 4.修改tomcat3端口号:(伪分布式)vim tomcat3/conf/server.xml  a.b.   c.

这里演示一个

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

将多个tomcat启动

tomcat1/bin/startup.sh tomcat2/bin/startup.sh tomcat3/bin/startup.sh

将多个tomcat配置到nginx的配置文件中

vim /usr/nginx/conf/nginx.conf 在server标签的上面加入如下配置:   upstream tomcat-servers {  server 192.168.72.135:8989;  server 192.168.72.135:8990;  server 192.168.72.135:8991;  }  location / {proxy_pass http://tomcat-servers;proxy_redirect    off;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Host $http_host;proxy_next_upstream http_502 http_504 error timeout invalid_header;}

在这里插入图片描述

在这里插入图片描述

  1. 配置MSM

安装memcached

yum install -y memcached

启动memcached

memcached -p 11211 -vvv -u root

在 tomcat安装的lib目录中放入与memcache整合jar包(上传)

cp tom8-msm/*.jar tomcat1/lib/cp tom8-msm/*.jar tomcat2/lib/cp tom8-msm/*.jar tomcat3/lib/

配置tomcat目录中conf目录中context.xml(所有tomcat均需要配置)

vim tomcat1/conf/context.xml将下面内容放到<Context></Context>标签的里面<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes="n1:192.168.72.136:11211"sticky="false"  sessionBackupAsync="false"  requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>其中n1是memcached节点的名字,后面写memcached结点的ip和端口

在这里插入图片描述

启动顺序:memcached --> tomcat --> nginx关闭顺序;nginx --> tomcat --> memcached

至此,服务器的负载均衡搭建就完成了