搭建LVS和Keepalived,使用包版本为ipvsadm-1.26和keepalived-1.3.5,环境:CentOS7
安装ipvsadm:
*需要机器支持且加载ipvs模块,通过lsmod|grep ip_vs 查看是否有相关模块,如果没有可以通过modprobe ip_vs动态加载,不过每次重启失效,想要永久生效就在/etc/sysconfig/modules下增加脚本ip_vs.modules并且chmod 755 ip_vs.modules
#!/bin/sh
/sbin/modinfo -F filename ip_vs >/dev/null 2>&1
if [ $? -eq 0 ];then
/sbin/modprobe ip_vs
fi
需要安装的依赖包有,libnl,libnl-devel,popt,popt-devel,popt-static,部分yum源没有popt-static,通过rpm包安装popt-static,然后直接make和make install
安装keepalived:
需要openssl,openssl-devel,libnfnetlink,libnfnetlink-devel,同样是部分源没有这个包,可以通过下载tar包安装,然后./configure --prefix=/usr/local/keepalived && make && make install
稍微讲一下概念,LVS是指Linux Virtual Server,虚拟服务器,主要用于服务器集群的负载均衡,[集群的机器把对外的服务绑定在某个Virtual IP(简称VIP)]就是客户端访问的,而后端提供服务的是Real IP(简称RIP),对应的服务器称为Virtual Server(LVS)和Real Server(RS)]。
LVS有两种模式:
NAT模式:NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。
DR模式:
DR模式下需要LVS和RS集群绑定同一个VIP(RS通过将VIP绑定在loopback实现),但与NAT的不同点在于:请求由LVS接受,由真实提供服务的服务器(RS)直接返回给用户,返回的时候不经过LVS。详细来看,一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。
开始搭建LVS+Keepalived
配置RS:
网上有提供对应的启动脚本,比较方便,这里稍微介绍脚本
VIP=192.168.100.20 #对外提供服务的ip地址
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP #通过lo:0网卡别名绑定vip地址
/sbin/route add -host $VIP dev lo:0 #添加路由
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore #这四句是为了关闭arp广播响应[下文详讲]
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
/sbin/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 Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
关于关闭arp广播响应:
arp_ignore:定义对目标地址为本地ip的arp询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地ip地址的arp查询请求
1 - 只回答目标ip地址是来访网络接口本地地址的arp查询请求
2 -只回答目标ip地址是来访网络接口本地地址的arp查询请求,且来访ip必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询
arp_announce:对网络接口上,本地ip地址的发出的,arp回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源ip地址发出arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应,当发起arp请求的源ip地址是被设置应该经由路由达到此网络接口的时候很有用,此时会检查来访ip是否为所有接口上的子网段内ip之一,如果改来访ip不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个ip数据包的源地址并尝试选择与能与该地址通信的本地地址,首要是选择所有的网络接口的子网中外出访问子网中包含该目标ip地址的本地地址,如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该arp回应的网络接口来进行发送
Keepalived配置(MASTER):
以下是一个简单的配置方案
global_defs {
notification_email {
admin@youngyuyeah.com #出现keepalived告警时,邮件通知此邮箱
}
notification_email_from root@youngyuyeah.com #发件人名称
smtp_server 192.168.100.2 #发邮服务器的ip
smtp_connection_timeout 30 #连接发邮服务器的时间
router_id LVS_DEVEL #设置lvs的id,唯一标识符
}
vrrp_instance VI_1 { #定义一个vrrp域
state MASTER #指定keepalived的为MASTER(需要大写)
interface eth0 #指定VIP绑定网卡
virtual_router_id 51 #虚拟路由编号,同一vrrp域内MASTER和BACKUP要相同
priority 100 #优先级,数字越大,优先级越高,主必须大于从
advert_int 1 #检查间隔,默认为1s
authentication { #主从间通讯密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.20 #定义VIP为192.168.100.20,可以有多个,换行写
}
}
virtual_server 192.168.100.20 80 {
delay_loop 6 #设置健康检查时间,单位是秒
lb_algo wrr #设置负载调度的算法为wlc
lb_kind DR #设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.100.21 80 { #指定RS的IP地址
weight 3 #配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
real_server 192.168.100.22 80 { #另一个RS的IP地址
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
而Keepalived(BACKUP)的配置可以在MASTER的基础上修改几个地方即可:
vrrp_instance VI_1 {
state BACKUP #这里改为BACKUP
interface eth0
virtual_router_id 51
priority 99 #这里改为99,master优先级是100
nopreempt #[如果需要backup机器切换之后维持主的身份,可以添加这个项]
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.20
}
}
最后测试:
①启动两台机器,通过ipvsadm -L -n 是否已经有对应RIP的均衡池,
②访问VIP看是否正常(两台keepalived只有一台能有VIP,同时出现是有异常的)
③停止其中RS的web服务,看是否会切换至另一个RS
④模拟MASTER宕机,通过ifconfig查看VIP是否漂移至BACKUP上。
更多的使用方法,后期再继续补充