keepalived实现haparxy高可用

keepalived实现haparxy高可用

HAProxy简介

HAProxy 是法国人Willy Tarreau开发的一个开源软件,是一款应对客户端10000以上的同时连接的高性能的TCP和
HTTP负载均衡器。其功能是用来提供基于cookie的持久性, 基于内容的交换,过载保护的高级流量管制,自动故障切换
,以正则表达式为基础的标题控制运行时间,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。

HAProxy 提供高可用性、负载均衡以及基于TCP和HTTP的应用代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。

HAProxy特点和优点:

  1. 支持原声SSL,同时支持客户端和服务器的SSL.
  2. 支持IPv6和UNIX套字节(sockets)
  3. 支持HTTP Keep-Alive
  4. 支持HTTP/1.1压缩,节省宽带
  5. 支持优化健康检测机制(SSL、scripted TCP、check agent…)
  6. 支持7层负载均衡。
  7. 可靠性和稳定性非常好。
  8. 并发连接 40000-50000个,单位时间处理最大请求 20000个,最大数据处理10Gbps.
  9. 支持8种负载均衡算法,同时支持session保持。
  10. 支持虚拟主机。
  11. 支持连接拒绝、全透明代理。
  12. 拥有服务器状态监控页面。
  13. 支持ACL。

HAProxy保持会话的三种解决方法

HAProxy为了让同一客户端访问服务器可以保持会话。有三种解决方法:客户端IP、Cookie以及Session。

  1. 通过 客户端IP 进行Hash计算并保存,以此确保当相同IP访问代理服务器可以转发给固定的真实服务器。
  2. 依靠真实服务器发送客户端的 Cookie信息 进行会话保持。
  3. 将保存真实服务器的 Session 以及服务器标识 ,实现会话保持。
    (HAProxy只要求后端服务器能够在网络联通,也没有像LVS那样繁琐的ARP配置)

HAProxy 主要工作模式

  1. tcp模式:在客户端和服务器之间将建立一个全双工的连接,且不会对7层的报文做任何处理的简单模式。
    通常用于SSL、SSH、SMTP等应用层。
  2. http模式(一般使用):客户端请求在转发给后端服务器之前会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。

keepalived实现haparxy高可用

环境说明

系统信息主机名IP
centos8master192.168.205.144
centos8slave192.168.205.147
centos8web1192.168.205.152
centos8web2192.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正向代理(共享上网,静态页面缓存加速,内网用户四七层上网行为控制,限速等)
		 |
		 |	
	|----------------------|
 上网用户一		    上网用户二

正向代理服务的作用

  1. 替代访问

  2. 加速访问

  3. Cache作用

Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。

还是上面的例子,假如某宿舍的学生 A 通过这个代理服务器下载了某个动作电影,而在此之前同学 B 已经通过这个代理服务器下载过,这个时候代理服务器可以将这个电影保存在代理服务器上一段时间,A 去下载的时候直接返回给 A,而不需要再跑去目标服务器重新下载。这个过程就是 Cache 命中,如果客户端和代理之间带宽够高,也可以起到加速访问的作用,达到秒下载的效果。

  1. 客户端访问授权

比如在一些机构内部不能随意访问外网,这个时候就可以用正向代理服务器,为不同的用户分配固定 IP 或者 ID 身份识别,客户端通过设置代理服务器访问网络时,代理服务器会检查网络请求的客户端来源,非允许的客户端请求数据包会被直接丢弃。

  1. 隐藏访问者的行踪

显然,如果我们通过一个代理服务器去访问某个网站资源,网站服务器只能看到代理服务器在发请求,并不知道其背后真正的请求者,这就可以在一定程度上起到隐匿行踪的作用。

透明代理

透明代理(transparent proxy),透明代理其实也叫做内网代理(inline proxy)、拦截代理(intercepting proxy)以及强制代理(force proxy)。透明代理和正向代理的行为很相似,但细节上有所不同。透明代理将拦截客户端发送的请求,拦截后自己代为访问服务端,获取响应结果后再由透明代理交给客户端。一般公司内的上网行为管理软件就是透明代理。

和正向代理的功能完全一致(客户端不需要设置代理服务器的IP和代理端口,对用户是透明的)

例如,客户端要访问www.baidu.com,如果是正向代理的方式,客户端会指明它要交给正向代理服务,就像路由中说要交给网关一样。如果是透明代理的方式,则是发送出去,然后被透明代理拦截,客户端以为请求的这个过程是自己完成的,并不知道是透明代理完成的。

正向代理和透明代理的区别
细分起来还是有不少的,但主要几点:

1、正向代理时,客户端明确指明请求要交给正向代理服务,也就是说要设置代理。而透明代理对客户端是透明的,客户端不知道更不用设置透明代理,但是客户端发出去的请求都会被透明代理拦截。
2、正向代理为了实现某些额外的需求,有可能会修改请求报文,但按照RFC文档的要求,透明代理不会修改请求报文。
3、正向代理可以内网也可以外网,但透明代理都是内网。

反向代理

反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。

客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。

反向代理	从外部网络访问内部服务器,与正向方向相反,主要用于网站架构的缓存加速或CDN
反向代理分析图:
			client
			  |
			  |
			反向代理 (缓存加速,七层切分,负载均衡,会话保持等)
			  |
			  |	
			  web

反向代理服务器的作用

  1. 保护和隐藏资源服务器
  2. 负载均衡,CDN 技术的就是利用了反向代理技术

正向代理和反向代理的区别
从用途上来讲:

正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。
正向代理还可以使用缓冲特性减少网络使用率。
反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。
反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。
另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
从安全性来讲:

正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值