目录
keeplived 软件起初是专门为LVS 负载均衡 软件设置的,用来管理并监控LVS集群中各个服务节点的状态,后来加入了可以实现高可用的VRRP 功能。因此,keepalived除了能管理LVS 集群以外,还可以为其它服务(如:Nginx、Haproxy、Mysql等)实现高可用。
keepalived 软件主要是通过 VRRP 协议 实现高可用的功能。VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的速写,VRRP出现的目的就是为了解决静态路由单点故障的问题,它能保证当个别节点出现问题时,整个网络可以不间断的运行。
①Keepalived是一款专为LVS 和HA 设计的一款健康检查工具
②支持故障自动切换、支持节点健康状态检查
健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
1、在网络中,主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,服务就会中断,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。
2、VRRP协议是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时进行设备切换而不影响主机之间的数据通信。
3、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
4、工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对
5、VRRP路由器在运行过程中有三种状态:①Initialize状态:系统启动后就进入Initialize,此状态下路由器不对VRRP报文做任何处理;② Master状态;③ Backup状态;一般主路由器处于Master状态,备份路由器处于Backup状态。
6、VRRP选举机制
①VRRP组中IP拥有者。如果虚拟IP地址与VRRP组中的某台VRRP路由器IP地址相同,则此路由器为IP地址拥有者,这台路由器将被定位主路由器。
②比较优先级。如果没有IP地址拥有者,则比较路由器的优先级,优先级的范围是0~255,优先级大的作为主路由器
③比较IP地址。在没有Ip地址拥有者和优先级相同的情况下,IP地址大的作为主路由器。
7、VRRP通过一竞选协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。
1、Keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
2、在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。
一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
在LVS-RD实验的基础上增加一台虚拟机 作为zwb_dr2
1、LVS-RD以之前的博客作为基础
2、配置zwb_dr2(主)
- ##关闭防火墙及安全信息中心
-
- [root@zwb_rd2 ~]# systemctl stop firewalld
- [root@zwb_rd2 ~]# systemctl disable firewalld
- [root@zwb_rd2 ~]# setenforce 0
- setenforce: SELinux is disabled
-
- ###编译安装 nginx,前面博客有
- ###安装ipvsadm
-
- [root@zwb_rd2 ~]# yum -y install ipvsadm keepalived
-
- [root@zwb_rd2 ~]# modprobe ip_vs ## 加载模块信息
- [root@zwb_rd2 ~]# cat /proc/net/ip_vs ## 查看ipvs 版本信息
- IP Virtual Server version 1.2.1 (size=4096)
- Prot LocalAddress:Port Scheduler Flags
- -> RemoteAddress:Port Forward Weight ActiveConn InActConn
- [root@zwb_rd2 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm ## 创建一个ipvsadm的一个配置文件
- [root@zwb_rd2 ~]# systemctl start ipvsadm ## 启动
- [root@zwb_rd2 ~]# systemctl enable ipvsadm ##设置开机启动
-
- ### 配置负载均衡策略
- [root@zwb_rd2 ~]# ipvsadm -C #### 清空原有配置
- [root@zwb_rd2 ~]# ipvsadm -A -t 192.168.159.100:80 -s rr ### 添加一台虚拟主机,设置IP及端口
- [root@zwb_rd2 ~]# ipvsadm -a -t 192.168.159.100:80 -r 192.168.159.10:80 -g ## 添加真实主机
- [root@zwb_rd2 ~]# ipvsadm -a -t 192.168.159.100:80 -r 192.168.159.11:80 -g ## 添加真实主机
-
-
-
-
-
- ## 添加虚拟子接口ens33:0
- [root@zwb_rd2 ~]# cd /etc/sysconfig/network-scripts/
- [root@zwb_rd2 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
- [root@zwb_rd2 network-scripts]# vim ifcfg-ens33:0
- TYPE=Ethernet
- PROXY_METHOD=none
- BROWSER_ONLY=no
- BOOTPROTO=static
- DEFROUTE=yes
- IPV4_FAILURE_FATAL=no
- IPV6INIT=yes
- IPV6_AUTOCONF=yes
- IPV6_DEFROUTE=yes
- IPV6_FAILURE_FATAL=no
- IPV6_ADDR_GEN_MODE=stable-privacy
- NAME=ens33:0
- DEVICE=ens33:0
- ONBOOT=yes
- IPADDR=192.168.159.100 ###修改为VIP
- PREFIX=24
- #GATEWAY=192.168.159.2
- #DNS1=114.114.114.114
- IPV6_PRIVACY=no
-
- [root@zwb_rd2 network-scripts]# systemctl restart network ##重启网络服务
-
- ## 配置sysctl.conf 文件
- [root@zwb_rd2 ~]# vim /etc/sysctl.conf
- net.ipv4.ip_forward = 0
- net.ipv4.conf.all.send_redirects = 0
- net.ipv4.conf.default.send_redirects = 0
- net.ipv4.conf.ens33.send_redirects = 0
-
- [root@zwb_rd2 ~]# sysctl -p ## 刷新生效
- net.ipv4.ip_forward = 0
- net.ipv4.conf.all.send_redirects = 0
- net.ipv4.conf.default.send_redirects = 0
- net.ipv4.conf.ens33.send_redirects = 0
-
- ##配置keepalived.conf文件,清空原先配置
- [root@zwb_rd2 ~]# vim /etc/keepalived/keepalived.conf
- global_defs { # 定义全局参数
- router_id lvs_01 # 定义热备组角色(每个节点不能一样)
- }
- vrrp_instance vi_1 { ## 定义VRRP的实例配置
- state MASTER # 指定热备状态,主为master,备为backup
- interface ens33 # 指定承载vip地址的物理接口
- virtual_router_id 51 # 指定虚拟路由器的ID号,每个热备组保持一致
- priority 110 # 7指定优先级,数值越大越优先
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 6666
- }
- virtual_ipaddress { ## 定义VIP地址
- 192.168.159.100
- }
- }
- virtual_server 192.168.159.100 80 { #指定虚拟服务器地址vip,端口,定义虚拟服务器和web服务器池参数
- lb_algo rr #定义轮询规则
- lb_kind DR #指定集群工作模式,直接路由DR
- persistence_timeout 6 #健康检查的间隔时间
- protocol TCP #应用服务采用的是TCP协议
- real_server 192.168.159.10 80 { #定义后端真实服务器的参数
- weight 1 #节点权重
- TCP_CHECK {
- connect_port 80 #添加检查的目标端口
- connect_timeout 3 #添加连接超时
- nb_get_retry 3 #添加重试次数
- delay_before_retry 3 #添加重试间隔
- }
- }
- real_server 192.168.159.11 80 { #指定第二个web节点的地址,端口
-
- weight 1
- TCP_CHECK {
- connect_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- }
-
- [root@zwb_dr2 ~]# systemctl start keepalived.service ##启动
2、配置zwb_dr1(增加配置)(备)
- [root@zwb_dr1 ~]# yum -y install keepalived.x86_64 ##安装
-
- [root@zwb_rd2 ~]# vim /etc/keepalived/keepalived.conf
- global_defs {
- router_id lvs_02 ##定义热备组
- }
- vrrp_instance vi_1 {
- state BACKUP ##定义BACKUP
- interface ens33
- virtual_router_id 51
- priority 105 ##优先级低于master
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 6666
- }
- virtual_ipaddress {
- 192.168.159.100
- }
- }
- virtual_server 192.168.159.100 80 {
- lb_algo rr
- lb_kind DR
- persistence_timeout 6
- protocol TCP
- real_server 192.168.159.10 80 {
- weight 1
- TCP_CHECK {
- connect_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- real_server 192.168.159.11 80 {
- weight 1
- TCP_CHECK {
- connect_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- }
-
-
- [root@zwb_dr1 ~]# systemctl start keepalived.service ##启动
3、查看VIP飘在那个服务器上
①查看keepalived(主)
主机名:[root@zwb_rd2 ~]# hostname
zwb_rd2
②查看keepalived(备)
主机名:[root@zwb_rd1 ~]# hostname
zwb_rd21
验证:
查看LVS-DR是否工作正常,正常情况下均工作在主设备master上,主机名zwb_rd2
模拟master宕机了。看VIP是否漂移
查看keepalived(备)的ip,发现VIP已经漂移成功
打开浏览器实验