文章目录
1. 实现基于NAT模型的LVS(多个不同的算法)
设计要点:
(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP(内部网络)
(2) 支持端口映射
(3) Director(LVS)要打开核心转发功能ip_forward
client
不需要配置网关,与VIP在一个网段
工作中有路由器所以需要网关
两台RS为httpd,更改主机名,设置网关为DIP
客户端不配路由,
启用LVS路由功能net.ipv4.ip.forward
vim /etc/sysctl.cong
net.ipv4.ip.forward = 1
装包ipvsadm
添加规则:
ipvsadm -A -t VIP:80 -s rr
加集群服务(-m 是nat模型)
ipvsadm -a -t VIP:80 -r RS1 -m
ipvsadm -a -t VIP:80 -r RS2 -m
查看用ipvsadm -Ln
测试:while true ;do curl VIP ;sleep 0.5 ;done
查看两个RS的http访问日志/var/log/httpd/access_log
改为权重
ipvsadm -E -t VIP:80 -s wrr
加权重:
ipvsadm -e -t VIP:80 -r RS1 -m -w 6
ipvsadm -e -t VIP:80 -r RS2 -m -w 2
最终访问是1:3的结果
做端口映射
将http的端口改为8080(可以修改一个试试)
LVS有一个巨大的缺点:对后端服务器没有
健康行检察
如果RS1的端口为80,RS2的端口为8080
那么在CIP访问的时候就会出现错误,RS1
修改LVS设置
发现改不了
只能删掉
ipvsadm -d -t VIP:80 -r RS1
ipvsadm -d -t VIP:80 -r RS1
重新添加
ipvsadm -a -t VIP:80 -r RS1:8080 -m -w 6
ipvsadm -a -t VIP:80 -r RS2:8080 -m -w 6
sh算法:根据原地址hash:原地址不变,就会一直访问同一个RS
ipvsadm -E -t VIP:80 -s sh
dh:根据目标地址hash:只有访问目标地址是固定的,就会忘同一个RS上调度
在RS1和RS2上生成10个网页
ipvsadm -E -t VIP:80 -dh
也可以搞一个数据库,
然后在两个RS中装php,mysql,wordpress
启用代理
2. 实现基于DR模型的LVS(多个不同的算法)
2.1 VIP与LVS,RS的在同一网段
VIP与局域网在同一网段
DR模型中各主机上均需要配置VIP
,解决地址冲突的方式有三种:
(1) 在前端网关做静态绑定
(2) 在各RS使用arptables
(3) 在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1: 别人发请求 不搭理
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量
避免将接口信息向非直接连接网络进行通告
2:不向向非本网络发通告
CIP必须配网关(在CIP和VIP中间有路由器)
RS上
lo:VIP
eth0:RIP
GW;routeGW2
如果将VIP配置到eth0需要配置别名防止源ip被覆盖(建议配置到lo上“稳定”,避免物理网卡被破怀,)
LVS:只接受请求,但不往外相应:也需要GW
(如果不配置网,不起作用,但是必须配“随便配置也可以
”)
路由器:启用转发功能
VIP可以绑定到LVS的eth0
也可以绑定到lo
上(ip/32)
RS的配置脚本:给lo网卡绑定VIP用的
#!/bin/bash
vip=10.0.0.100
mask='255.255.255.255‘
dev=lo:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#绑定VIP
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
永久搭建:配置文件
VS的配置脚本:LVS定制规则临时的:
#!/bin/bash
vip='192.168.37.100'
iface=‘lo:1'
mask='255.255.255.255'
port='80'
rs1='192.168.0.101'
rs2='192.168.0.102'
scheduler='wrr'
type='-g'
case $1 in
start)
ifconfig $iface $vip netmask $mask #broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
;;
stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo "Usage $(basename $0) start|stop“
exit 1
esac
LVS规则:先安装ipvsadm包
ipvsadm -A -t VIP:80 -s rr
ipvsadm -a -t VIP:80 -r RIP1 (DR不支持端口映射)
ipvsadm -a -t VIP:80 -r RIP2
最后测一测
配置一个安全性检查(如果两个RS都挂掉,提供一个道歉声明该)配置sorryserver服务机
如果VIP是公网,RS配置的VIP与LVS一样,就会存在安全风险,CIP就可以直接访问RS
也可以给RS配置私网地址,和LVS就不在一个网段
2.2 VIP与LVS,RS不在同一网段
VIP与局域网不在同一网段:
VIP:10.0.0.0网段
局域网在192.168.245.0网段
注意route2
必须配置一个和LVS的VIP的网络地址
在eth0上加
永久加:nmcli connection modify eth0 +ipv4.address 10.0.0.200
RS的网关指向10.0.0.200可以,指向192.168.37.7也可以(只要能出去就行)
LVS的网关随便配(建议按正确的配192.168.37.)
VIP都可以配置到lo
上32位,有别名就行
路由器不需要加网关,但有路由,而且启用路由功能
配置LVS和RS:在lo往卡上 VIP/32 有别名
但是不能ping VIP:看LVS个调度规则,只有80端口的规则没有icmp的
注意这样CIP可以直接访问RIP 不安全
工作中中间会有防火墙,不会出现这种情况
如果实现https,有证书,安装mod_ssl包即可
然后实现443端口的调度
优化:将443和80合起来,认为都是一个服务
可以定义防火墙标签(实现逻辑给80和443都贴同样的标签,就会认为是一个集群服务)
清除ipvsadm中的规则
这样就可以用-f且标签
最后加入rs
FireWall Mark(标签:用于合并端口)
FWM:FireWall Mark
MARK target 可用于给特定的报文打标记
--set-mark value
标签可为0xffff格式,表示十六进制数字
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度
在Director主机打标记:贴标签
在mangle表上
iptables -t mangle -A PREROUTING -d $vip -p $proto –m multiport -
-dports $port1,$port2,… -j MARK --set-mark NUMBER
在Director主机基于标记定义集群服务:
ipvsadm -A -f NUMBER [options]
持久连接
如果刷新页面,可能会转到另一台机子上去(轮寻)
session 绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现
持久连接( lvs persistence )模板:实现无论使用任何调度算法,在一段时间内(默认360s ),能够实现将来自同一个地址的请求始终发往同一个RS
[-p [timeout]] 默认6分钟
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
持久连接实现方式:
1.每端口
持久(PPC):每个端口定义为一个集群服务,每集群服务单独调度
2.每防火墙标记
持久(PFWMC):基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity
3.每客户端持久
(PCC):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式
2.3 如果在路由器上只配置两个网关
注意这里的RS中的VIP和GW要在同一VIP
才能走GW出去否则不行
例如24位VIP
只有VIP的公网的网关(没有局域网的网关)
在route上删掉个局域网ip
修改RS路由
只能先加主机路由,让他可达,然后才能加网关(或者直接在配置文件中加GW)
route -add -host 10.0.0.200 dev eth0
route -add default gw 10.0.0.200
这里要注意arp
要清理/proc/sys/net/ipv4/conf/eth0/arp_ignore
重启网卡服务就可以
六. LVS高可用性
Director不可用,整个系统将不可用;SPoF Single Point of Failure
解决方案
:高可用
keepalived heartbeat/corosync
某RS不可用时,Director依然会调度请求至此RS
解决方案
: 由Director对各RS健康状态进行检查,失败时禁用,成功时启用
(也可以写脚本)
keepalived heartbeat/corosync ldirectord
检测方式
:
(a) 网络层检测,icmp
(b) 传输层检测,端口探测
© 应用层检测,请求某关键资源
RS全不用时
:backup server, sorry server
ldirectord(LVS的健康行检查)
ldirectord:监控和控制LVS守护进程,可管理LVS规则(健康性检查)
当后端的RS宕机后,就会自动的从LVS中去掉后端服务器的规则
宕机的RS恢复后,会自动将规则添加到LVS中
包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
下载
:http://download.opensuse.org/repositories/network:/haclustering:/Stable/CentOS_CentOS-7/x86_64/
文件:
/etc/ha.d/ldirectord.cf 主配置文件
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版
/usr/lib/systemd/system/ldirectord.service 服务
/usr/sbin/ldirectord 主程序,Perl实现
/var/log/ldirectord.log 日志
/var/run/ldirectord.ldirectord.pid pid文件
Ldirectord配置文件示例
checktimeout=3 3秒不回应就执行
checkinterval=1 1秒查一次
autoreload=yes 自动检查
logfile=“/var/log/ldirectord.log“ #日志文件
quiescent=no #down时yes**权重为0**,no为**删除**
#logfile="lical0" 会将日志写到/var/log/messages中
virtual=5 #指定VS的FWM 或 IP:PORT
real=172.16.0.7:80 gate 2 #DR模型,权重为 2
real=172.16.0.8:80 gate 1
fallback=127.0.0.1:80 gate #sorry server(道歉页面)
service=http
scheduler=wrr
checktype=negotiate
checkport=80
request="index.html" 对于这个页面检查
receive=“Test Ldirectord"
不需要ipvsadm规则
ipvsadm -C
需要自己手工添加VIP等
最后只需要启用ldirectord服务
systemctl start ldirectord
ipvsadm -Ln 就会看到由了directord自动生成的规则
然后宕机一个RS,看效果(多给一点时间看看)
看ipvsadm是否自动删掉规则
当quiescent=no
LVS上自己有一个道歉页面httpd服务(当所有的RS都宕机,自己提供一个道歉页面)
当quiescent=yes