keepalived实现haparxy高可用
文章目录
- keepalived实现haparxy高可用
- HAProxy简介
- HAProxy特点和优点:
- HAProxy保持会话的三种解决方法
- HAProxy 主要工作模式
- keepalived实现haparxy高可用
- keepalived安装
- haproxy安装
- keepalived配置
- 正向代理
- 透明代理
- 反向代理
HAProxy简介
HAProxy 是法国人Willy Tarreau开发的一个开源软件,是一款应对客户端10000以上的同时连接的高性能的TCP和
HTTP负载均衡器。其功能是用来提供基于cookie的持久性, 基于内容的交换,过载保护的高级流量管制,自动故障切换
,以正则表达式为基础的标题控制运行时间,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。
HAProxy 提供高可用性、负载均衡以及基于TCP和HTTP的应用代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。
HAProxy特点和优点:
- 支持原声SSL,同时支持客户端和服务器的SSL.
- 支持IPv6和UNIX套字节(sockets)
- 支持HTTP Keep-Alive
- 支持HTTP/1.1压缩,节省宽带
- 支持优化健康检测机制(SSL、scripted TCP、check agent…)
- 支持7层负载均衡。
- 可靠性和稳定性非常好。
- 并发连接 40000-50000个,单位时间处理最大请求 20000个,最大数据处理10Gbps.
- 支持8种负载均衡算法,同时支持session保持。
- 支持虚拟主机。
- 支持连接拒绝、全透明代理。
- 拥有服务器状态监控页面。
- 支持ACL。
HAProxy保持会话的三种解决方法
HAProxy为了让同一客户端访问服务器可以保持会话。有三种解决方法:客户端IP、Cookie以及Session。
- 通过
客户端IP
进行Hash计算并保存,以此确保当相同IP访问代理服务器可以转发给固定的真实服务器。 - 依靠真实服务器发送客户端的
Cookie信息
进行会话保持。 - 将保存真实服务器的
Session 以及服务器标识
,实现会话保持。
(HAProxy只要求后端服务器能够在网络联通,也没有像LVS那样繁琐的ARP配置)
HAProxy 主要工作模式
- tcp模式:在客户端和服务器之间将建立一个全双工的连接,且不会对7层的报文做任何处理的简单模式。
通常用于SSL、SSH、SMTP等应用层。 - http模式(一般使用):客户端请求在转发给后端服务器之前会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。
keepalived实现haparxy高可用
环境说明
系统信息 | 主机名 | IP |
centos8 | master | 192.168.205.144 |
centos8 | slave | 192.168.205.147 |
centos8 | web1 | 192.168.205.152 |
centos8 | web2 | 192.168.205.155 |
关闭所以虚拟机的防火墙和selinux
keepalived安装
配置主keepalived
//配置网络源
[root@master ~]# dnf -y install epel-release
[root@master ~]# ls /etc/yum.repos.d/
CentOS-Stream-AppStream.repo CentOS-Stream-RealTime.repo
CentOS-Stream-BaseOS.repo epel-modular.repo
CentOS-Stream-Debuginfo.repo epel-playground.repo
CentOS-Stream-Extras.repo epel-testing-modular.repo
CentOS-Stream-HighAvailability.repo epel-testing.repo
CentOS-Stream-Media.repo epel.repo
CentOS-Stream-PowerTools.repo
//安装keepalived
[root@master ~]# dnf -y install keepalived
用同样的方法在备服务器上安装keepalived
//配置网络源
[root@slave ~]# dnf -y install epel-release
[root@slave ~]# ls /etc/yum.repos.d/
CentOS-Stream-AppStream.repo CentOS-Stream-RealTime.repo
CentOS-Stream-BaseOS.repo epel-modular.repo
CentOS-Stream-Debuginfo.repo epel-playground.repo
CentOS-Stream-Extras.repo epel-testing-modular.repo
CentOS-Stream-HighAvailability.repo epel-testing.repo
CentOS-Stream-Media.repo epel.repo
CentOS-Stream-PowerTools.repo
//安装keepalived
[root@slave ~]# dnf -y install keepalived
haproxy安装
配置主haproxy
//安装haproxy
[root@master ~]# dnf -y install haproxy
[root@master ~]# vim /etc/haproxy/haproxy.cfg
......................
frontend main
bind *:80
......................
backend app
balance roundrobin
server web1 192.168.205.152:80 check
server web2 192.168.205.155:80 check
[root@master ~]# systemctl restart haproxy
[root@master ~]# systemctl enable haproxy
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
用同样的方法在备服务器上安装haproxy
//安装haproxy
[root@slave ~]# dnf -y install haproxy
[root@slave ~]# vim /etc/haproxy/haproxy.cfg
......................
frontend main
bind *:80
......................
backend app
balance roundrobin
server web1 192.168.205.152:80 check
server web2 192.168.205.155:80 check
[root@slave ~]# systemctl restart haproxy
keepalived配置
配置主keepalived
[root@master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass lijiang
}
virtual_ipaddress {
192.168.205.250
}
}
virtual_server 192.168.205.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.205.144 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.205.147 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@master ~]# systemctl start keepalived
[root@master ~]# systemctl enable keepalived
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:64:64:76 brd ff:ff:ff:ff:ff:ff
inet 192.168.205.144/24 brd 192.168.205.255 scope global dynamic noprefixroute ens33
valid_lft 1075sec preferred_lft 1075sec
inet 192.168.205.250/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::d319:3a8d:e1e8:8a63/64 scope link noprefixroute
valid_lft forever preferred_lft forever
配置备keepalived
[root@slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass lijiang
}
virtual_ipaddress {
192.168.205.250
}
}
virtual_server 192.168.205.250 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.205.144 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.205.147 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@slave ~]# systemctl start keepalived
[root@slave ~]# systemctl enable keepalived
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:12:0a:ff brd ff:ff:ff:ff:ff:ff
inet 192.168.205.147/24 brd 192.168.205.255 scope global dynamic noprefixroute ens33
valid_lft 1698sec preferred_lft 1698sec
inet6 fe80::26b1:cd6:d073:9acd/64 scope link noprefixroute
valid_lft forever preferred_lft forever
给web1安装httpd
[root@web1 ~]# dnf -y install httpd
[root@web1 ~]# echo 'web1' > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
[root@web1 ~]# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
给web2安装httpd
[root@web2 ~]# dnf -y install httpd
[root@web2 ~]# echo 'web2' > /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd
[root@web2 ~]# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@master ~]# curl http://192.168.205.250
web2
[root@master ~]# curl http://192.168.205.250
web1
[root@master ~]# systemctl stop keepalived.service
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:b9:bd:f9 brd ff:ff:ff:ff:ff:ff
inet 192.168.205.144/24 brd 192.168.205.255 scope global dynamic noprefixroute ens33
valid_lft 1163sec preferred_lft 1163sec
inet 192.168.29.250/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::9a33:ce06:9305:f665/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@slave ~]# curl http://192.168.205.250
web2
[root@slave ~]# curl http://192.168.205.250
web1
正向代理
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。
正向代理可以但不限于为局域网内客户端做代理,它扮演的角色类似于NAT。
代理内部主机上网,共享上网,缓存,控制内网用户上网行为等功能(客户端需要设置代理服务器的IP和代理端口)
正向代理分析图:
外网
|
modem
|
路由器(dhcp,snat共享上网,上网行为控制,限速等)
|
|
squid正向代理(共享上网,静态页面缓存加速,内网用户四七层上网行为控制,限速等)
|
|
|----------------------|
上网用户一 上网用户二
正向代理服务的作用
- 替代访问
- 加速访问
- Cache作用
Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。
还是上面的例子,假如某宿舍的学生 A 通过这个代理服务器下载了某个动作电影,而在此之前同学 B 已经通过这个代理服务器下载过,这个时候代理服务器可以将这个电影保存在代理服务器上一段时间,A 去下载的时候直接返回给 A,而不需要再跑去目标服务器重新下载。这个过程就是 Cache 命中,如果客户端和代理之间带宽够高,也可以起到加速访问的作用,达到秒下载的效果。
- 客户端访问授权
比如在一些机构内部不能随意访问外网,这个时候就可以用正向代理服务器,为不同的用户分配固定 IP 或者 ID 身份识别,客户端通过设置代理服务器访问网络时,代理服务器会检查网络请求的客户端来源,非允许的客户端请求数据包会被直接丢弃。
- 隐藏访问者的行踪
显然,如果我们通过一个代理服务器去访问某个网站资源,网站服务器只能看到代理服务器在发请求,并不知道其背后真正的请求者,这就可以在一定程度上起到隐匿行踪的作用。
透明代理
透明代理(transparent proxy),透明代理其实也叫做内网代理(inline proxy)、拦截代理(intercepting proxy)以及强制代理(force proxy)。透明代理和正向代理的行为很相似,但细节上有所不同。透明代理将拦截客户端发送的请求,拦截后自己代为访问服务端,获取响应结果后再由透明代理交给客户端。一般公司内的上网行为管理软件就是透明代理。
和正向代理的功能完全一致(客户端不需要设置代理服务器的IP和代理端口,对用户是透明的)
例如,客户端要访问www.baidu.com,如果是正向代理的方式,客户端会指明它要交给正向代理服务,就像路由中说要交给网关一样。如果是透明代理的方式,则是发送出去,然后被透明代理拦截,客户端以为请求的这个过程是自己完成的,并不知道是透明代理完成的。
正向代理和透明代理的区别
细分起来还是有不少的,但主要几点:
1、正向代理时,客户端明确指明请求要交给正向代理服务,也就是说要设置代理。而透明代理对客户端是透明的,客户端不知道更不用设置透明代理,但是客户端发出去的请求都会被透明代理拦截。
2、正向代理为了实现某些额外的需求,有可能会修改请求报文,但按照RFC文档的要求,透明代理不会修改请求报文。
3、正向代理可以内网也可以外网,但透明代理都是内网。
反向代理
反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。
客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。
反向代理 从外部网络访问内部服务器,与正向方向相反,主要用于网站架构的缓存加速或CDN
反向代理分析图:
client
|
|
反向代理 (缓存加速,七层切分,负载均衡,会话保持等)
|
|
web
反向代理服务器的作用
- 保护和隐藏资源服务器
- 负载均衡,CDN 技术的就是利用了反向代理技术
正向代理和反向代理的区别
从用途上来讲:
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。
正向代理还可以使用缓冲特性减少网络使用率。
反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。
反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。
另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
从安全性来讲:
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。