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还是tom三上都能找到对应的session,
二是使用redis或cachedb实现session当然,第二种方式是主流的方式
第二种方法是在整个系统架构的背面建造一个redis集群或者Memcachedb它们叫集群 分布式缓存服务器由分布式缓存服务器管理session数据, 当然,为了避免单节点的并发压力,分布式缓存服务器也应进行集群处理。 分布式缓存服务器的核心解决方案是session如何解决共享问题? 用户登录后会有用户信息,我们可以将用户信息放入 redis 或者 cachedb 里面, 根据未来负载平衡的原理,将相应tom二、统一去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安装目录 ls auto 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.1 make && make install # 6.编译完成后,进入编译安装目录/usr/nginx查看目录: 编译安装后 /root 下的源码包 nginx-1.11.1.tar.gz 其实可以删除 ls -l drwxr-xr-x. 2 root root 4096 10月 14 21:17 conf drwxr-xr-x. 2 root root 40 10月 14 21:17 html drwxr-xr-x. 2 root root 6 10月 14 21:17 logs drwxr-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 redis nginx启动时会有两个过程,一个是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.gz drwxr-xr-x. 9 root root 220 10月 14 21:28 tomcat1 drwxr-xr-x. 9 root root 220 10月 14 21:38 tomcat2 drwxr-xr-x. 9 root root 220 10月 14 21:38 tomcat3 # 2.修改tomcat1端口号:(伪分布式) vim tomcat1/conf/server.xml 每个服务器关闭时所占用的端口号、http协议端口、AJP协议端口都不能一样 所以为了使得三个tomcat可以在一台机器上运行我们要修改端口号 vim tomcat1/conf/server.xml 命令修改如下内容: a.<Server port="8003" shutdown="SHUTDOWN"> ---关闭端口 b.<Connector port="8989" protocol="HTTP/1.1" ---http协议端口 connectionTimeout="20000" redirectPort="8443" /> c.<Connector port="10010" protocol="AJP/1.3" redirectPort="8443" /> ---AJP协议端口 # 3.修改tomcat2端口号:(伪分布式) vim tomcat2/conf/server.xml 命令修改如下内容: a.<Server port="8004" shutdown="SHUTDOWN"> b.<Connector port="8990" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> c.<Connector port="10011" protocol="AJP/1.3" redirectPort="8443" /> # 4.修改tomcat3端口号:(伪分布式) vim tomcat3/conf/server.xml 命令修改如下内容: a.<Server port="8005" shutdown="SHUTDOWN"> b.<Connector port="8991" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> c.<Connector port="10012" protocol="AJP/1.3" redirectPort="8443" /> # 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集群中每个tomc 1).在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.conf
vim /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.启动memcached
memcached一安装完成之后会直接在系统中形成一个memcached的服务,我们可以直接使用memcached指令去启动
memcached
memcached -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
把下面的内容复制到配置文件的
<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"
/>
启动顺序:memcached --> tomcat --> nginx
关闭顺序;nginx --> tomcat --> memcached
接下来我们来实际操作一下:
在本次搭建Tomcat负载集群中,我使用了三个虚拟机,
一个其中安装的是Ngnix,第二个中安装了三个Tomcat,第三个安装memcached
- 安装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.1
make && make install
启动nginx
cd /usr/nginx/sbin/
./nginx
补充:关闭Nginx
cd /usr/nginx/sbin/
./nginx -s stop
- 启动多个Tomcat
准备多个tomcat,将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 #复制一份
为了使的这三个tomcat可以在一台机器上运行,我们还需要配置这三个tomcat包中的配置文件
修改三个tomcat端口号:(伪分布式)
# 修改tomcat1端口号:(伪分布式)
vim tomcat1/conf/server.xml
a.<Server port="8003" shutdown="SHUTDOWN"> ---关闭端口
b.<Connector port="8989" protocol="HTTP/1.1" ---http协议端口
connectionTimeout="20000"
redirectPort="8443" />
c.<Connector port="10010" protocol="AJP/1.3" redirectPort="8443" /> ---AJP协议端口
# 3.修改tomcat2端口号:(伪分布式)
vim tomcat2/conf/server.xml
a.<Server port="8004" shutdown="SHUTDOWN">
b.<Connector port="8990" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
c.<Connector port="10011" protocol="AJP/1.3" redirectPort="8443" />
# 4.修改tomcat3端口号:(伪分布式)
vim tomcat3/conf/server.xml
a.<Server port="8005" shutdown="SHUTDOWN">
b.<Connector port="8991" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
c.<Connector port="10012" protocol="AJP/1.3" redirectPort="8443" />
这里演示一个
将多个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;
}
- 配置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
至此,服务器的负载均衡搭建就完成了