单台主机反代用户请求到后端tomcat主机,有三种方式
nginx 基于http链接器到tomcat
httpd 基于http连接器到tomcat
httpd基于ajp连接器到tomcat 8009端口
都可以把后端主机扩展为多个,从而能够实现反代时做负载均衡
nginx用的是http-upstream module
httpd则使用的是http-prolenm-proxy-modlue协议
还有用ajpconnector、
要用到负载均衡,使用n3称为tomcat主机,连接器刚才设定的网络上
先同步n3时间 ntpdate 172.16.0.1
两组程序包给装上,配置地址
把n2的目录复制到n3上
在n3主机上一样创建应用
也可以把n2的网页复制过来
修改n3的网页
启动服务
测试能否访问
现在就可以在反代主机上 配置反代应用了,先调整为nginx反代
在对应的httpd上下文中,使用一个upstream模块
编辑con.d/ilinux。conf
无论静态内容和动态内容都代理到后端主机,分别分离代理
刷新就会红绿切换
可以用curl命令测试
说明是轮询的,后端主机如果是动态应用的话,就不能轮询,只能维持会话,有三种方式
(1) session sticky
source_ip 基于源地址绑定(比较粗糙,nginx使用iphash算法)
nginx: ip_hash(或者可以hash $request_url)
haproxy: 使用source 调度算法
lvs:使用 sh 调度算法
cookie: 基于cookie绑定 (需要在7层代理上实现)
nginx:使用 hash cookie
haproxy: cookie、
绑定地址有很多问题,所以有下面的方式
(2) session cluster:delta session manager (把两个tomcat主机定义成一个会话集群)
(3) session server:redis(store), memcached(cache)
把两个tomcat主机定义成一个会话集群,依然可以负载均衡调度,sessionn不会变,红绿来回切换
还有一个方式叫session server
还可以再加一台主机作为会话保存的主机,比如memcached
现在第一步用nginx实现负载均衡已经搞定了
采用一致性hash算法,来完成服务器选取的
使用nginx -s reload
现在访问试试,就都是A了
继续编辑应用
此时hash下cookie,能否实现绑定
** nginx -s reload
这一次是基于cookie绑定,刚才定义的应用程序会定义成cookie的**
把调度算法注释了
、再次使用reload
轮询访问没有问题,说明之前确实是绑定了
接下来使用httpd
这里必须要的模块是balance,才能完成基于httpd的负载均衡的
这个模块实现的功能跟upstream功能类似,先把服务器定义成组,然后定义负载均衡算法
这个balance负载均衡算法有三种
by traffic 根据后端服务器的流量来检查,谁带宽占的少就调度
by request 根据请求调度,相当于给wrr做加权轮询 支持权重
by business 看谁忙,谁闲就接受请求
request这种方式就跟轮询一样
balance 需要把被代的服务器定义成组,
定义成组的方式定义使用proxy。用balancer://(固定字符串不能改变,表示调用balacer模块命名组建,相当于upstream后面加个组名是一样的)来定义后面
tcsrvs才是名字,组名
balancermember来定义它的成员
设定代理功能的某个属性,比如lbmethod调用方法是byrequests
然后后面配置虚拟主机的时候,里面定义其代理方式的,不再代理到主机,而是代理到balancer://tcsrvs
对于httpd来讲斜线必须存在,用来做映的
不像nginx在location 跟当中的定义
现在来编辑httpd的配置
需要在virtual host之外先定义组
proxy balancer tcsrvs
balancermember 定义调度成员
proxy set 定义lbmethod属性 byrequests
下面的proxy set 就不再是proxy pass了应该是 balancer 😕/tcsrvs/
检查语法,启动服务
httpd -t && systemctl start httpd.service
现在刷新是不会变化的
对于使用反代的功能的时候,也有很多属性也可以在balance lbmethod中进行定义,比如权重之类的
前端主机上安装manual,查看文档中的内容,也可以访问互联网
httpd定义链接的方法也很简单,只需要定义proxy组就可以了,反代的时候反代到组上,整体运用方式并没有和nginx有什么显著的区别
现在配置下ajp连接器,无非也是组,反代成后端主机是ajp接口的
可以换个名字不然与tcsrvs冲突
检查语法,启动服务
httpd -t && systemctl restart httpd.service,
测试访问没有问题
这是使用8009端口,ajp连接器的
这是两种后端使用两种不同协议模块的定义,调度到后端去的负载均衡算法
查看反向代理设置指南的
loadfactor 叫调度离子,或者叫负载因子 (定义权重
timeout=1 超时时间间隔为1s中
甚至可以定义最后的status,加个status用来设置当前主机所处的状态
这些balancermember选项上都可以用
这个是可以定义很多key=value
balance 语法
BalancerMember:
BalancerMember [balancerurl] url [key=value [key=value …]]
proxy能用的value,这边都能用
status:(诸多状态
D: Worker is disabled and will not accept any requests.(nginx,down,表示禁用了
S: Worker is administratively stopped. 管理中止,也相当于人为的软中止(在haproxy中有很多模式,管理,维护模式,软中止模式
I: Worker is in ignore-errors mode and will always be considered available.关闭健康状态,检查功能
经常用到的status=H
H: Worker is in hot-standby mode and will only be used if no other viable workers are available.
(在nginx上配置主机可以等于backup,等于sorry server,叫做hot-standly)
E: Worker is in an error state. 一直处于不健康状态,手动设置于不健康状态
N: Worker is in drain mode and will only accept existing sticky sessions destined for itself and
ignore all other requests.一旦属于n模式,只有此前曾经保持链接时,把粘性功能启动时,分配到此前主机中,其他的都不接受了,通常这种方式,等会没有链接请求,就可以下线了
loadfactor:
负载因子,即权重;(不能在反代用,(多台主机才叫负载均衡)只能在负载均衡时用
最大并发链接数
设置负载均衡调度方法,只有在balancer时才可以使用
lbmethod:可用值有三种,(bytraffic,bybusyness,byrequests)
Balancer load-balance method. Select the load-balancing scheduler method to use.
Either byrequests, to perform weighted request counting; @1bytraffic,
to perform weighted traffic byte count balancing; or @2bybusyness,
to perform pending request balancing. The default is @3byrequests.
默认不写也表示轮询的意思
stickysession 会话粘性 2.4.4之后的版本才能支持
需要借助其他的配置参数才能配置的
Balancer sticky session name. The value is usually set to something like JSESSIONID or
PHPSESSIONID, and it depends on the backend application server that support sessions.
If the backend application server uses different name for cookies and url encoded id
(like servlet containers) use | to separate them.
The first part is for the cookie the second for the path.
Available in Apache HTTP Server 2.4.4 and later.
在客户端请求时,加上 ROUTID={balancer_worker_route}e等于替换了这个首部的值,并应用这个站点的/,而后才能实现基于cookie的会话粘性
这个时候在session sticky,真正意义上生效起来,
ProxySet stickysession=ROUTEID(在已有的cookie中加入一个名称叫routid。应该是服务器自己的rout符号(tomcatA,tomcatB,在haproxy中也可以使用cookie来给后端主机加上名称
所以客户端再次请求时会强行,在它的cookie中,注入一个routid,如果这次访问是挑选的第一个主机,那么它的值就成了tomcatA,所以以后再来访问时,在cookie中就可以加上,routid的tomcatA,每一次httpd就能判断是谁了
基于这种方式就是基于cookie的会话粘性
现在试一下
、proxy set表示这个设定对所有主机都有效
等于在每个主机后加一个stickysession=routeid
重启服务
httpd -t && systemctl restart httpd
curl命令如果基于cookie做粘性的话,默认是不带cookie的
所以用浏览器进行访问
所以就能实现会话粘性,这个会话粘性跟你使用的连接器没有关系,ajp也可以这么实现
会话粘性的实现方法:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://tcsrvs>
BalancerMember http://172.18.100.67:8080 route=TomcatA (每个主机的唯一标识符)loadfactor=1
BalancerMember http://172.18.100.68:8080 route=TomcatB loadfactor=2
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID
</Proxy>
<VirtualHost *:80>
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
</VirtualHost>
以后要经常看文档
对于balancer而言,还可以设定内部启用的状态页,这个状态业类似haproxy的web-gui,能够实现一些软管理功能,可以实现在这个接口下去实现我们的服务器哪个上线,哪个下线
balancer模块有个内建的状态页接口,想起用,就跟启用http接口一样,首先定义location,并设定内建的处理器balancer-manager
定义哪些人能够访问
proxypass 不反代为后端主机,由自己的httpd处理
在对应的virtualhost内部加一个location
proxypass 不向后端反代
httpd -t && systemctl restart httpd 重启
就能够访问了
ajp和http两组都显示出来了
点一下,下部分会出现设置
hot-standby=sorryserver
ignore errors 无视错误
点一下submit,这个主机就变成standby模式了
如果把tomcatB宕机了
健康状态监测应该是失败的
现在处于error状态
现在tomcatA就能使用了
如果tomcatB在重新上线,就又上线了
现在就ok了
curl本身没有cookie的,做了会话粘性也没有用
这个不能让别人随意访问,应该设定内网主机或者仅管理口
启用管理接口:
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require all granted
基于会话做tomcat集群也是可以的
反而会话粘性不常用
Tomcat Cluster
(1) httpd + tomcat cluster
httpd: mod_proxy, mod_proxy_http, mod_proxy_balancer
tomcat cluster:http connector
(2) httpd + tomcat cluster
httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer
tomcat cluster:ajp connector
(3) httpd + tomcat cluster
httpd: mod_jk
tomcat cluster:ajp connector
(4) nginx + tomcat cluster
所以实现把会话保存在memcached,冗余
使用session server功能还是非常重要的