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

1. Tomcat负载均衡集群搭建

Linux环境下Tomcat负载均衡集群的搭建_第1张图片

关于代理服务器

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

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安装目录
	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.   ---关闭端口

		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集群中每个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;
    }

Linux环境下Tomcat负载均衡集群的搭建_第2张图片

Linux环境下Tomcat负载均衡集群的搭建_第3张图片

Linux环境下Tomcat负载均衡集群的搭建_第4张图片

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

	把下面的内容复制到配置文件的
	标签的里面

    

启动顺序: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.1
make && 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 			 #将名称改为tomcat1
cp -r tomcat1/ tomcat2								 #复制一份
cp -r tomcat1/ tomcat3                #复制一份

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

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

# 修改tomcat1端口号:(伪分布式)
	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.

这里演示一个

Linux环境下Tomcat负载均衡集群的搭建_第5张图片

Linux环境下Tomcat负载均衡集群的搭建_第6张图片

Linux环境下Tomcat负载均衡集群的搭建_第7张图片

将多个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;
}

Linux环境下Tomcat负载均衡集群的搭建_第8张图片

Linux环境下Tomcat负载均衡集群的搭建_第9张图片

  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和端口

Linux环境下Tomcat负载均衡集群的搭建_第10张图片

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

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

你可能感兴趣的:(Linux,linux,服务器,运维,后端,nginx)