四层负载均衡LVS+健康检查

四层负载均衡服务器

实现负载均衡的软件:

lvs haproxy nginx httpd varnish
四层:
传输层:lvs haproxy(tcp) 模型tcp协议
应用层:haproxy nginx(都可以做7层负载均衡)
haproxy : 可以做一个读写分离和动静分离
lvs:
全称呼:linux virtual server
linux虚拟服务器
工作在防火墙input链上,附着几个高级函数
lvs有四种模式:DR:直接路由模式 (主要是修改mac地址)
NAT:网络地址转换模式
TUNNEL:隧道模式
FULLNAT:完全的地址转换模式

编辑工具策略:

[root@server1 ~]# yum install -y ipvsadm.x86_64

[root@server1 ~]# ipvsadm -l  列出策略
[root@server1 ~]# lsmod  查看内核支持模块

[root@server1 ~]# rpm -qa | grep ipvsadm
ipvsadm-1.27-7.el7.x86_64
[root@server1 ~]# rpm -qc ipvsadm  查看
/etc/sysconfig/ipvsadm-config
[root@server1 ~]# vim /etc/sysconfig/ipvsadm-config
[root@server1 ~]# touch /etc/sysconfig/ipvsadm
[root@server1 ~]# systemctl start ipvsadm.service
[root@server1 ~]# ipvsadm -h  #编辑策略的方法查询

指定一个虚拟ip:虚拟ip只是一个入口,不提供服务
指定虚拟ip的原因:这个地址为公有IP地址,外网进行访问的,用起来方便安全。对外开放的ip地址
192.168.0.90 为虚拟地址:(-s rr 表示制定调度器的方法)

[root@server1 ~]# ipvsadm -A -t 192.168.0.90:80 -s rr
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.90:http rr

添加真实主机和端口:(-g:表示使用lvs的直接路由(DR)模式)

[root@server1 ~]# ipvsadm -a -t 192.168.0.90:80 -r 192.168.0.20:80 -g
[root@server1 ~]# ipvsadm -a -t 192.168.0.90:80 -r 192.168.0.30:80 -g
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.90:http rr
  -> server2:http                 Route   1      0          0         
  -> server3:http                 Route   1      0          0         
[root@server1 ~]# systemctl restart ipvsadm.service #重启之后策略会自动添加到文件
[root@server1 ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.0.90:80 -s rr
-a -t 192.168.0.90:80 -r 192.168.0.20:80 -g -w 1
-a -t 192.168.0.90:80 -r 192.168.0.30:80 -g -w 1

[root@server1 ~]# ip addr add 192.168.0.90/24 dev ens33 #添加虚拟网址到网卡

数据走向:client -> vs -> rs -> client (用户到虚拟主机server1到真实主机server2,server3在到客户端)
没设置网关的其那个况下
需要给真实主机添加虚拟地址,否则虚拟ip无法跟真实ip地址之间进行数据的访问

[root@server2 ~]#  ip addr add 192.168.0.90/24 dev ens33 
[root@server3 ~]# ip addr add 192.168.0.90/24 dev ens33

测试:

[root@rhel8_node1 ~]# arp -d 192.168.0.90 #清理物理网卡的缓存
[root@rhel8_node1 ~]# curl 192.168.0.90
www.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org

以上实验存在的问题:
返回给客户端的是由调度器srver1返回的数据,并不是由真实服务器server2,server3返回的。

问题:

[root@rhel8_node1 ~]# arp -an | grep 90
? (192.168.0.90) at 00:0c:29:65:03:25 [ether] on ens160

这个物理地址是调度器的物理地址
因为真机也添加了公网ip

解决方法:
1.通过配置内核参数的方法去解决
2.用防火墙的方法来解决

通过防火墙的方式来解决:

[root@server3 ~]# yum install -y arptables
[root@server2 ~]# yum install -y arptables
server2:
[root@server2 ~]# arptables -A INPUT -d 192.168.0.90 -j DROP  #输入连接丢弃192.168.0.90这个地址
[root@server2 ~]# arptables -A OUTPUT -s 192.168.0.90 -j mangle --mangle-ip-s 192.168.0.20
		在返回的数据包上告诉来源是192.168.0.90,添加到mangle这个表上,告诉真实的ip来源是
		192.168.0.20
[root@server2 ~]# arptables-save  > /etc/sysconfig/arptables #保存策略

server3:解释同server2
[root@server3 ~]# arptables -A INPUT -d 192.168.0.90 -j DROP
[root@server3 ~]# arptables -A OUTPUT -s 192.168.0.90 -j mangle --mangle-ip-s 192.168.0.30
[root@server3 ~]#  arptables-save  > /etc/sysconfig/arptables

测试:

[root@rhel8_node1 ~]# arp -d 192.168.0.90
[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
www.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org

查询调度器:所有的访问都在调度器上
[r

oot@server1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.90:80 rr
  -> 192.168.0.20:80              Route   1      0          4         
  -> 192.168.0.30:80              Route   1      0          3  

lvs基本工作原理:
lvs -> -> kernel space -> IP -> INPUT(ipvs) -> change -> POSTROUTING ->rs
防火墙的prerouting(路由前) 会判断ip是否为本机,是,则数据发送数据包。做一个change,发送到POSTROUTING(是后端服务器地址,发往调度器)

DR模式数据流向:(需要在同一个网络,通过二层数据链传输的)
client -> DS -> kernel space -> PREROUTING -> CIP(客户端IP):VIP(目标IP,入口) -> INPUT -> ipvs(工作在INPUT链上) ->DMAC:RMAC(把源MAC地址修改为真实MAC地址) -> POSTROUTING -> DS RS -> 二层传输 -> rs -> lo -> ens33(VIP:CIP) -> client

######隧道模式####
清除DR 模式的配置:

[root@server1 ~]# ipvsadm -C

添加隧道模式使用的模块:

[root@server1 ~]# modprobe ipip

配置隧道模式:

[root@server1 ~]# ipvsadm -A -t 192.168.0.90:80 -s rr
[root@server1 ~]# ipvsadm -a -t 192.168.0.90:80 -r  192.168.0.20:80 -i
[root@server1 ~]# ipvsadm -a -t 192.168.0.90:80 -r  192.168.0.30:80 -i
[root@server1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.90:80 rr
  -> 192.168.0.20:80              Tunnel  1      0          0         
  -> 192.168.0.30:80              Tunnel  1      0          0         
[root@server1 ~]# systemctl restart ipvsadm.service 

server1:

[root@server1 ~]# ip addr del 192.168.0.90/24 dev ens33
[root@server1 ~]# ip addr add 192.168.0.90/24 dev tunl0
[root@server1 ~]# ip link set up tunl0 #激活IP

server2:(移动公网ip地址到隧道tunl0)

[root@server2 ~]# ip addr del 192.168.0.90/24 dev ens33
[root@server2 ~]# ip addr add 192.168.0.90/24 dev tunl0
[root@server2 ~]# ip link set up tunl0 

server3:
[root@server3 ~]# ip addr del 192.168.0.90/24 dev ens33
[root@server3 ~]# ip addr add 192.168.0.90/24 dev tunl0
[root@server3 ~]# ip link set up tunl0

激活隧道模式后:
一定在真实后端server2,server3上关闭反向过滤规则
[root@server3 ~]# sysctl -a | grep rp_filter #查看反向过滤规则
见图片:

更改例子:

[root@server3 ~]# sysctl -w net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.rp_filter = 0
[root@server3 ~]# sysctl -p  #设置立即生效

server2 同server3

测试:

[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
www.westos.org
[root@rhel8_node1 ~]# curl 192.168.0.90
bbs.westos.org

###健康平衡检查###
安装软件包: ldirectord-3.9.6-0rc1.1.1.x86_64.rpm

注意:yum源包需要配置高可用的软件仓库(在yum中的addons中)
[root@server1 Downloads]# rpm -qa | grep ldire
[root@server1 ~]# rpm -qc ldirectord-3.9.6-0rc1.1.1.x86_64.rpm #查看软件包的位置

注意:由于软件包出了问题,健康检查稍后在补

####高可用###
安装软件包:keepalived-2.0.20.tar.gz
[root@server1 Downloads]# tar zxf keepalived-2.0.20.tar.gz

进行源码编译:
[

root@server1 keepalived-2.0.20]# yum install -y openssl-devel #安装二进制文件,二进制文件,大多数是以却少的文件加devel
[root@server1 keepalived-2.0.20]# ./configure --prefix=/usr/local/keepalived --with-init=systemd
[root@server1 keepalived-2.0.20]# make && make install #进行源码编译

源码编译完了以后进行配置:

root@server1 keepalived-2.0.20]# ls /usr/local/
bin  etc  games  include  keepalived  lib  lib64  libexec  sbin  share  src
[root@server1 keepalived-2.0.20]# cd /usr/local/keepalived/
[root@server1 keepalived]# ls
bin  etc  sbin  share
为方便操作,做以个软链接,把木路链接到/etc/:
[root@server1 keepalived]# ln -s /usr/local/keepalived/etc/keepalived/  /etc/
[root@server1 keepalived]# cd /etc/keepalived/
[root@server1 keepalived]# ls
keepalived.conf  samples
[root@server1 keepalived]# vim keepalived.conf  #`配置文件
 ! Configuration File for keepalived
  2 
  3 global_defs {
  4    notification_email {
  5      root@localhost
  6    }
  7    notification_email_from keepalived@localhost
  8    smtp_server 127.0.0.1
  9    smtp_connect_timeout 30
 10    router_id LVS_DEVEL
 11    vrrp_skip_check_adv_addr
 12   # vrrp_strict
 13    vrrp_garp_interval 0
 14    vrrp_gna_interval 0
 15 }
 16 
 17 vrrp_instance VI_1 {
 18     state MASTER
 19     interface ens33
 20     virtual_router_id 51
 21     priority 100
 22     advert_int 1
 23     authentication {
 24         auth_type PASS
 25         auth_pass 1111
 26     }
 27     virtual_ipaddress {
 28         192.168.0.80
 29     }
 30 }
 31 
 32 virtual_server 192.168.0.80 80 {
 33     delay_loop 3
 34     lb_algo rr
 35     lb_kind DR
 36     persistence_timeout 50
 37     protocol TCP
 38 
 39     real_server 192.168.0.20 80 {
 40         TCP_CHECK{
 41         weight 1
 42            connect_timeout 3
 43            retry 3
 44            delay_before_retry 3
 45         }
 46     }
 47 
 48 real_server 192.168.0.30 80 {
 49           TCP_CHECK{
 50           weight 1
 51              connect_timeout 3
 52              retry 3
 53              delay_before_retry 3
 54           }
 55      }
 56 
 57 }

发送到server4:192.168.0.40

[root@server1 local]# scp -r keepalived 192.168.0.40:/usr/local/
[`root@server1 keepalived]# scp keepalived.conf  192.168.0.40:/etc/keepalived/ #发送配之文件去备用主机`

server4:(备用的真实server)

[root@server4 local]# ls
bin  etc  games  include  keepalived  lib  lib64  libexec  sbin  share  src
[root@server4 local]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 local]# vim /etc/keepalived/keepalived.conf    需要修改配置文件,修改内容为,更该MASKTER为BACKUP;降低优先级。

server1:
[

root@server1 ~]# systemctl start keepalived.service

server4:

[root@server4 ~]# systemctl start keepalived.service

重新启动激活健康检查:

测试:
1,先测试轮循的访问有没有问题
测试方法看轮循的测试

server1和server4同时监控日志
停掉server1 的真实server

日志会显示:
访问正常,此时自动启动了备用的server4
链接成功后会主动切换回server1

健康检查保证了用户的一直正长的访问,用户的信息暂时会被server4接管;
冲新启动其server1 时会回到优先级较高的server1,VIP进行漂移。

VRRP:虚拟路由协议,实现路由器高可用的协议

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值