LVS
一、概述
Cluster:集群,为解决某个问题将多台计算机组合起来形成的单个系统
VS:Virtual Server,负责调度
RS:Real Server,负责真正提供服务
CIP:client IP,客户端IP
VIP:virtual server IP,vs外网的IP
DIP:director IP,VS内网的IP
RIP:real server ip,后端服务器IP
ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的RS等
ipvs:工作于内核上的netfilter INPUT HOOK之上的程序,可根据用户定义的集群实现请求转发;
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS
1.集群类型
Lvs-NAT
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某台RS的RIP和PORT实现转发
- RS必须使用私有IP地址,网关指向DIP
- DIP与RIP必须在同一网段内
- DS作为所有服务器节点的网关,也就是说请求和响应报文都需要经过Director Server
- 高负载场景中,Director Server压力比较大,易成为性能瓶颈
数据包流向分析:
- 用户发送请求到Director Server,请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
- 内核空间判断数据包的目标IP是本机,此时IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,重新封装数据包(源IP为CIP,目标IP为RIP),然后选路将数据包发送给Real Server。
- Real Server比对发现目标IP是本机的IP,重新封装报文(源IP为RIP,目标IP为CIP)发回给Director Server。
- Director Server重新封装数据包,将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
Lvs-DR
直接路由,LVS默认模式,应用最广泛,通过请求报文重新封装MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某台RS的RIP所在接口的MAC地址;
1.director和各RS都有配置VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director
在RS上修改内核参数以限制arp通告以及应答级别/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
3.RS的RIP可以使用私网地址,也可以是公网地址;RIP于DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
4.RS和Director要在同一个物理网络
5.请求报文要经过Director,但响应报文不经由Director,而由RS直接发往Client
数据包流向分析:
- 用户发送请求到Director Server,请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
- 由于DS和RS在同一个网络中,所以是通过二层数据链路层来传输。
- 内核空间判断数据包的目标IP是本机IP,此时IPVS比对数据包请求的服务是否为集群服务,若是,重新封装数据包,修改源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server.
- RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文,重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过lo接口传送给eth0网卡然后向外发出。
- RS直接将响应报文传送到客户端。
2.算法
- rr:roundrobin,轮询
- wrr:weighted RR,加权轮询
- sh:source hashing,将来自于同一个IP地址的请求始终转发倒第一次挑选的RS
- dh:destination hashing,目标地址如果是一样的,则代理到同一台服务器
- lc:最少连接:会将客户端请求发送到连接数量比较少的real-server
- wlc:加权最少连接:我的权重是2,你的是1,我的连接是100,你的是50才是等价的,按比例的
二、服务搭建
1.ipvsadm命令
ivpsadm -A -t VIP:端口 -s 算法 #创建集群
ipvsadm -a -t VIP:端口 -r RIP -m/g/i #添加真实服务器;nat/dr/tun
ipvsadm -E -t VIP:端口 -s 算法 #修改
ipvsadm -Ln #查看集群
ipvsadm -d -t VIP:端口 -r RIP #去除真实服务器
ipvsadm -D -t VIP:端口 #去除某个集群
ipvsadm -C #去除所有集群
2.Lvs-NAT
VIP:192.168.171.2
DIP:192.168.0.165 ip_forward=1
RIP1:192.168.0.166 GATEWAY:192.168.0.165
RIP2:192.168.0.167 GATEWAY:192.168.0.165
VS
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p
yum -y install ipvsadm
nmcli connection add ifname ens37 con-name ens37 type ethernet
ipvsadm -A -t 192.168.171.2:80 -s rr
ipvsadm -Ln
ipvsadm -a -t 192.168.171.2:80 -r 192.168.0.166 -m
ipvsadm -a -t 192.168.171.2:80 -r 192.168.0.167 -m
3.Lvs-DR
VIP:192.168.0.180
DIP:192.168.0.165
RIP1:192.168.0.166
RIP2:192.168.0.167
1.RS配置
1.配置RS的VIP
#VIP地址仅用作发送Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器Director监听并分发)。因此使用虚接口lo:0来承载VIP地址。
2.在两台real server上配置启动脚本
#限制响应级别arp_ignore
0:默认值,表示可以使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收倒请求报文的接口上时,才给予响应
#限制通告级别arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直连网络进行通告
2:必须避免将接口信息向非本地网络进行通告
vim /etc/init.d/rs.sh
#!/bin/bash
VIP=192.168.0.180
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0 #为本机添加一条路由记录
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK "
;;
stop)
ifconfig lo:0 down
route del $VIP /dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stopd"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
2.VS配置
1.yum install ipvsadm -y
2.vim /etc/init.d/dr.sh
#!/bin/bash
VIP=192.168.0.180
RIP1=192.168.0.166
RIP2=192.168.0.167
case "$1" in
start)
/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev ens33:0
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
echo "ipvsadm starting --------------------[ok]"
;;
stop)
/sbin/ipvsadm -C
systemctl stop ipvsadm
ifconfig ens33:0 down
route del $VIP
echo "ipvsamd stoped----------------------[ok]"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm stoped---------------"
exit 1
else
echo "ipvsamd Runing ---------[ok]"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
Keepalived
一、概述
防止单点故障
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
1.原理
仅能实现IP的高可用,借助VRRP(虚拟路由)
2.配置文件
! Configuration File for keepalived
global_defs { #出问题给谁发邮件
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #显示邮件从谁发出来的
smtp_server 192.168.200.1 #邮件服务器地址
smtp_connect_timeout 30 #连接邮件服务器的超时时间
router_id LVS_DEVEL #路由器ID,随意写
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { #定义虚拟路由
state MASTER #主节点
interface eth0 #哪个接口加入虚拟路由
virtual_router_id 51 #虚拟路由ID号
priority 100 #优先级
advert_int 1 #检测间隔1秒
authentication { #账号密码认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #VIP地址
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.0.180 80 { #定义lvs的VIP
delay_loop 6 #健康检测间隔
lb_algo rr #算法
lb_kind DR #lvs模式
persistence_timeout 50 #超时时间
nat_mask 255.255.255.255 #掩码
protocol TCP #TCP
real_server 192.168.0.166 80 { #定义real-server
weight 1 #权重
HTTP_GET { #健康状态检测的方法
url {
path /
status_code 200
}
connect_timeout 3 #超时时间
nb_get_retry 3 #重试次数
delay_before_retry 3 #每次重试之前等待3秒
}
}
}
3.健康检测方式
- 基于状态码的检测
HTTP_GET {
url {
path /index.html
status_code 200 #http://192.168.2.188/index.html的返回状态码
}
- TCP_CHECK检测
TCP_CHECK {
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔
connect_port 80
}
4.实践大坑
为什么LVS设置了轮询,浏览器测试还是不能轮询?这关系到两个地方的配置
/etc/keepalived/keepalived.conf的persistence_timeout会话保持时间配置,测试轮询时设置为0
ipvsadm --set 1 2 1