1. Tomcat负载均衡集群搭建
关于代理服务器
- 代理服务器自身并不负责处理请求,而是把请求转发给真正的服务器,真正的服务器处理完之后,返回给它,它再去做一个响应,这叫反向代理服务器。
Nginx就是一个反向代理服务器,日后它可以接收大规模的请求,接收完成之后它可以把我们的请求均分到所有的集群结点之中。也就是说,日后可以通过Ngnix去管理服务器集群中的众多节点。日后所有的请求经过Ngnix时,Ngnix就可以帮助我们解决负载均衡,Ngnix的核心就是去完成负载均衡。Ngnix不仅可以作为方向代理服务器,它还可以作为(正向代理)服务器去解决跨域问题和动静分离问题。
还有一点,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安装目录
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
mv apache-tomcat-8.5.78 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
至此,服务器的负载均衡搭建就完成了
|