keepalived
keepalived
keepalived实现ha+lvs-DR
client 172.16.2.9
|
eth0 172.16.2.8
[router 或 firewall] <--------|
eth1 1.1.1.8 |
|
VIP eth0:0 1.1.1.2 |
|
vrrp1(类似心跳) |
1.1.1.3 eth0 --- eth0 1.1.1.4 |
主lvs 备lvs |
2.2.2.3 eth1 --- eth1 2.2.2.4 |
vrrp2(类似心跳) |
|
|----------------------| |
web1 web2-----|
1.1.1.5 1.1.1.6
lo:0 1.1.1.2/255.255.255.255
准备上面的架构图:
1,client我这里用的是宿主机,有一个elinks就ok了
2,router我这里使用双网卡kvm虚拟机
3,主和备lvs调度服务器,也都使用双网卡kvm虚拟机
4,web1和web2使用单网卡kvm虚拟机
然后我这里全部使用kvm虚拟机,这个结构图一共需要三个网段
我这里分别使用
br0桥接模拟外网172.16.0.0/16网络
default网络(virbr0)模拟1.1.1.0/24网络(但因为默认此网络是192.168.122.0/24网段,我这里就是嫌ip太长,不方便画图讲解,才换成1.1.1.0/24来测试).所以我这里就使用ifconfig virbr0:0 1.1.1.1/24在宿主机上模拟此网段(还要保证宿主机上不要有两个网卡同网段)
default1网络(virbr1)模拟2.2.2.0/24网络;我这里就使用ifconfig virbr1:0 2.2.2.1/24在宿主机上模拟此网段
其它相关准备:(centos7.3平台)
1,静态ip
2,主机名配置和绑定
# hostnamectl set-hostname --static master.cluster.com
# vim /etc/hosts
1.1.1.8 router.cluster.com
1.1.1.3 master.cluster.com
1.1.1.4 backup.cluster.com
1.1.1.5 web1.cluster.com
1.1.1.6 web2.cluster.com
3,时间同步
4,关闭firewalld(这里准备来说只关firewalld,不关iptables),selinux
5,配置yum (本地iso镜像yum源)
6,准备客户端,只需要有firefox或elinks命令就可以了
第一大步:
router上做SNAT,DNAT将外网连接转到内网
也就是把
sip:172.16.2.9 dip:172.16.2.8
转成
sip:1.1.1.8 dip:1.1.1.2
1,在router上打开ip_forward
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p 使之生效
2,在router上使用iptables(不是firewalld)实现snat,dnat
# systemctl stop firewalld
# systemctl disable firewalld
# yum install iptables-services iptables
# iptables -t filter -F
# iptables -t nat -F
# iptables -t mangle -F
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 1.1.1.2
# iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth1 -j SNAT --to 1.1.1.8
# iptables-save > /etc/sysconfig/iptables
# systemctl start iptables.service
# systemctl enable iptables.service
第二大步:
在主lvs调度器和备lvs调度器上安装keepalived包
# yum install keepalived ipvsadm
第三大步:
在主lvs调度器和备lvs调度器上配置keepalived
先在主lvs调度器上配置,配置完了再拷到备lvs调度器进行简单修改
# cat /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_DEVEL --同一个局域网内注意要唯一。用私有网段做实验的话保持默认就好了
}
vrrp_instance VI_1 { --定义整个VRRP(virtual router reduntancy protocol)实例
state MASTER --主DR要为MASTER,并大写
interface eth0 --提供服务的网卡,在我这里是外网网卡
lvs_sync_daemon_interface eth0 --指定它为一个心跳网卡
virtual_router_id 51 --ID值,主DR和备DR要一致 ; 这里要特别注意;如果都在同一个网段,每个人的ID值请使用不同的,以免冲突(范围为1-255,不能超过这个范围)
priority 100 --优先级,主DR要大于备DR
advert_int 1 --主备同步的时间间隔
authentication {
auth_type PASS --验证类型,还有一种验证类型为AH,这里建议使用pass就可以了(明文的,这里没必要去加密)
auth_pass 1111 --验证字符串,随便写都可以
}
virtual_ipaddress { --vip
1.1.1.2/24
}
}
vrrp_instance VI_2 {
state MASTER
interface eth1
lvs_sync_daemon_interface eth1
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { --因为是DR架构,只有一个VIP,这个VIP为空
}
}
virtual_server 1.1.1.2 80 {
delay_loop 6 --健康检查时间间隔
lb_algo rr --rr算法
lb_kind DR --LVS-DR模式
nat_mask 255.255.255.0 --掩码
protocol TCP
real_server 1.1.1.5 80 {
weight 1 --权重
TCP_CHECK {
connect_timeout 3
connect_port 80 --简单的健康检查方式,3秒连不上80端口就认为不健康
}
}
real_server 1.1.1.6 80 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
把上面的配置文件拷给备lvs调度器
# scp /etc/keepalived/keepalived.conf 1.1.1.4:/etc/keepalived/
把两个vrrp的
state MASTER 改为 state BACKUP
priority 100 改为 priority 99
两台lvs调度器都启动keepalived服务
# systemctl start keepalived
# systemctl enable keepalived
第四大步:
配置real server(web1,web2)
在web1服务器上做
# echo 'web1'> /var/www/html/index.html
# systemctl start httpd
# systemctl enable httpd
在web2服务器上做
# echo 'web2'> /var/www/html/index.html
# systemctl start httpd
# systemctl enable httpd
2,
# ifconfig lo:0 1.1.1.2 netmask 255.255.255.255
--想要永久生效,要写一个ifcfg-lo:0的网卡配置文件
3,
# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
# sysctl -p使它生效
4,
# yum install arptables_jf
# arptables -A INPUT -d 1.1.1.2 -j DROP
# arptables-save -n > /etc/sysconfig/arptables
# systemctl start arptables
# systemctl enable arptables
--第3和第4小步都是解决LVS-DR的arp问题,可以二选一,也可以二个步骤都做
5,,在主DR和备DR上都绑定web1和web2的网卡物理地址
(这一步在这个架构中可以不用做,因为web1和web2虚拟了lo:0 1.1.1.2/32后,不会造成主DR和备DR与web1,web2不通的情况,因为主DR和备DR有心跳线路的IP1.1.1.3和1.1.1.4,它们可以与web1,web2通迅,也就是说可以得到web1和web2的MAC地址)
# arp -s 1.1.1.5 1.1.1.5的MAC地址
# arp -s 1.1.1.6 1.1.1.6的MAC地址
第五大步:
测试验证
验证1:
客户端
# elinks 172.16.2.8
结果为web1和web2的rr轮循ok
验证2:
查看资源
# ip addr
# ipvsadm -ln
验证结果
在主lvs调度器上有1.1.1.2/24这个vip,备lvs调度器没有这个vip
主和备lvs调度器使用ipvsadm -ln都能查看lvs信息(此软件比较特殊,备也能看到信息是为了高可用切换到备时,lvs调度数据保持一致;其它的ha软件一般只能主上看到信息)
验证3:
验证健康检查
在web1上关闭httpd服务,那么客户端就只会被调度给web2
验证4:
在主lvs调度器reboot
结果:客户端访问几乎不中断,资源切换到了备,主启动后,资源又切回了主
验证5:
在主lvs调度器ifconfig eth0 down,正常切换到备;在主lvs调度器ifconfig eth0 up回来,又切换回主
在主lvs调度器ifconfig eth1 down,不用切换(因为eth1网卡只是心跳备份,也没有vip在此网卡上)
验证6:
在主lvs调度器不小心kill杀掉了keepalived的进程
# ps -ef |grep keepa |grep -v grep
root 2310 1 0 17:30 ? 00:00:00 /usr/sbin/keepalived -D
root 2311 2310 0 17:30 ? 00:00:00 /usr/sbin/keepalived -D
root 2312 2310 0 17:30 ? 00:00:00 /usr/sbin/keepalived -D
# kill -15 2310
结果:正常切换到备,当主keepalived服务再启动后,又会切换回主
验证7:
在主lvs调度器删除了1.1.1.2这个vip
# ip address del 1.1.1.2/24 dev eth0
结果:没有切换到备,整个架构完蛋
解决方法:可以写个shell监控此vip,如果不存在,则加回来;或者如果不存在,直接把主lvs调度器reboot