高可用是指2台机器启动着完全相同的业务系统,一台机器宕机后,另一台可以快速启用,用户是无感知的。高可用硬件通常使用F5,软件通常使用keepalived。keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障。
VRRP实现原理
咱们拿公司路由器举例,路由器故障后,网关无法转发报文,所有人无法上网了怎么办?
一般我们会选择增加一台路由器,但是我们主路由器故障后,用户需要手动指向备用路由器,如果用户多的话修改起来会非常麻烦,另外我们的主路由器修好后,主路由器用不用;主路由器故障后我们把备用路由器的网关配置改成主路由器是否可以,等等,涉及问题很多。
实际上,我们如果单纯上修改网关配置,是行不通的,我们的PC第一次通过ARP广播寻找到主路由器的MAC地址和IP地址,会将信息写到ARP的缓存表,那么PC在之后的连接中都是根据缓存表信息去连接,在进行数据包转发,即使我们修改了IP,但是Mac地址是唯一的,PC的数据包依旧会发给主路由器(除非PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的备用路由器的MAC的地址和IP地址)
那么我们就需要VRRP了,通过软件或硬件的形式在主路由器和副路由器外面增加一个虚拟的MAC地址(VMAC)和虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,不管是主路由器处理还是备用路由器处理,PC只是在ARP缓存表中记录VMAC和VIP的信息。
Keepalived核心概念
要掌握Keepalived之前,我们需要先知道它的核心概念。
1、如何确定谁是主节点谁是备用节点(谁的效率高,速度快就用谁,类似选举投票;手动干预是通过优先级的方式)
2、如果主节点故障,备用节点自动接管,如果主节点恢复了,那么抢占式的方式主节点会自动接管,类似于夺权,而非抢占式的方式,主节点恢复了,并不会自动接管。
3、主节点和备用节点在1个小组,主节点正常时,1秒钟向小组内发送一次心跳(时间可以自定义),表示它还正常,如果没有发送心跳,则备用节点自动接管,如果主节点和备用节点都没发送心跳,则两台服务器都会认为自己是主节点,从而形成脑裂
Keepalived安装配置
1、我们准备一台LB01(10.0.0.5)和一台LB02(10.0.0.6)两台虚拟主机
2、两台主机都安装keepalived
1. [root@LB01 ~]# yum -y install keepalived 2. 3. [root@LB02 ~]# yum -y install keepalived
3、配置LB01
1. [root@LB01 ~]# rpm -qc keepalived #查询keepalived的配置文件 2. /etc/keepalived/keepalived.conf 3. /etc/sysconfig/keepalived 4. [root@LB01 ~]# cat /etc/keepalived/keepalived.conf 5. global_defs { #全局配置 6. router_id LB01 #标识身份->名称 7. } 8. 9. vrrp_instance VI_1 { 10. state MASTER #标识角色状态 11. interface eth0 #网卡绑定接口 12. virtual_router_id 50 #虚拟路由id 13. priority 150 #优先级 14. advert_int 1 #监测间隔时间 15. authentication { #认证 16. auth_type PASS #认证方式 17. auth_pass 1111 #认证密码 18. } 19. virtual_ipaddress { 20. 10.0.0.3 #虚拟的VIP地址 21. } 22. }
4、配置LB02
1. [root@LB02 ~]# cat /etc/keepalived/keepalived.conf global_defs { 2. router_id LB02 #与主结点区别1:唯一标识 3. } 4. 5. vrrp_instance VI_1 { 6. state BACKUP #与主节点区别2:角色状态 7. interface eth0 8. virtual_router_id 50 9. priority 100 #与主节点区别3:竞选优先级 10. advert_int 1 11. authentication { 12. auth_type PASS 13. auth_pass 1111 14. } 15. virtual_ipaddress { 16. 10.0.0.3 17. } 18. }
5、启动两个节点的keepalived
1. [root@LB01 ~]# systemctl start keepalived 2. [root@LB01 ~]# systemctl enable keepalived 3. 4. [root@LB02 ~]# systemctl start keepalived 5. [root@LB02 ~]# systemctl enable keepalived
Keepalived测试抢占式和非抢占式
1、LB01的优先级高于LB02,所以VIP在LB01上面
1. [root@LB01 ~]# ip add | grep 10.0.0.3 2. inet 10.0.0.3/32 scope global eth0
2、关闭LB01的keepalived,发现LB02自动接管
1. [root@LB01 ~]# systemctl stop keepalived 2. [root@LB01 ~]# ip add | grep 10.0.0.3 3. 4. [root@LB02 ~]# ip add | grep 10.0.0.3 5. inet 10.0.0.3/32 scope global eth0
3、重启LB01的keepalived,发现VIP被强行抢占
1. [root@LB01 ~]# systemctl start keepalived 2. [root@LB01 ~]# ip add | grep 10.0.0.3 3. inet 10.0.0.3/32 scope global eth0 4. 5. [root@LB02 ~]# ip add | grep 10.0.0.3
4、配置非抢占式
两个节点的state都必须配置为BACKUP,都必须加上配置nopreempt,其中一个节点的优先级必须高于另外一个节点的优先级。
1. [root@LB01 ~]# cat /etc/keepalived/keepalived.conf 2. global_defs { #全局配置 3. router_id LB01 #标识身份->名称 4. } 5. 6. vrrp_instance VI_1 { 7. state BACKUP #标识角色状态 8. nopreempt 9. interface eth0 #网卡绑定接口 10. virtual_router_id 50 #虚拟路由id 11. priority 150 #优先级 12. advert_int 1 #监测间隔时间 13. authentication { #认证 14. auth_type PASS #认证方式 15. auth_pass 1111 #认证密码 16. } 17. virtual_ipaddress { 18. 10.0.0.3 #虚拟的VIP地址 19. } 20. } 21. [root@LB01 ~]# systemctl restart keepalived 22. 23. [root@LB02 ~]# cat /etc/keepalived/keepalived.conf 24. global_defs { 25. router_id LB02 26. } 27. 28. vrrp_instance VI_1 { 29. state BACKUP 30. nopreempt 31. interface eth0 32. virtual_router_id 50 33. priority 100 34. advert_int 1 35. authentication { 36. auth_type PASS 37. auth_pass 1111 38. } 39. virtual_ipaddress { 40. 10.0.0.3 41. } 42. } 43. [root@LB02 ~]# systemctl restart keepalived
5、通过windows的arp去验证,是否会切换MAC地址
1. [root@LB01 ~]# ip add | grep 10.0.0.3 2. inet 10.0.0.3/32 scope global eth0
Windows本地hosts到10.0.0.3,浏览器访问blog.koten.com(LB01分配到Web01里面的域名)
WIN+R调用运行窗口,输入cmd打开命令提示符arp -a,查看arp缓存区,此时物理地址与LB01上10.0.0.3MAC地址一致