Keepalived主从虚拟路由器_虚拟服务器_优先级调整

Keepalived主从虚拟路由器虚拟服务器优先级调整

keepalived简介:

Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、
第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,
负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。

keepalived:
vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务:
    基于vrrp协议完成地址流动;
    为vip地址所在的节点生成ipvs规则(在配置文件中预先定义);
    为ipvs集群的各RS做健康状态检测;
    基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务;
组件:
核心组件:
    vrrp stack
    ipvs wrapper
    checkers
控制组件:
    配置文件分析器
    IO复用器
    内存管理组件
HA Cluster的配置前提:
 (1) 各节点时间必须同步;
        ntp, chrony
 (2) 确保iptables及selinux不会成为阻碍;
 (3) 各节点之间可通过主机名互相通信(对KA并非必须);
        建议使用/etc/hosts文件实现; 
 (4) 确保各节点的用于集群服务的接口支持MULTICAST通信;
        D类:224-239;
程序环境:
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
配置文件组件部分:
    TOP HIERACHY
    GLOBAL CONFIGURATION
        Global definitions
        Static routes/addresses
    VRRPD CONFIGURATION
        VRRP synchronization group(s):vrrp同步组;
        VRRP instance(s):每个vrrp instance即一个vrrp路由器;
    LVS CONFIGURATION
        Virtual server group(s)
        Virtual server(s):ipvs集群的vs和rs;用作定义虚拟服务器
准备:四台PC,其中两台作为实验的虚拟路由器的物理路由器(Director),两台用作RS。

1、主从虚拟路由器

两台虚拟路由器的物理主机安装keepalived软件后,将原有的/etc/keepalived/keepalived.conf重命名用作备份,
完成后新建keepalived.conf文件编写如下:
! Configuration File for keepalived #!起始行为注释行
global_defs { # 全局定义块
   notification_email { #通告邮件用户,需要邮件服务,这里不做测试
     root@localhost #接收邮件地址
   }   
   notification_email_from keepalived@localhost #发送邮件用户
   smtp_server 127.0.0.1 #邮件服务器
   smtp_connect_timeout 30 #连接超时
   router_id HA1  #当前路由设备ID,一般为主机名,可变
   vrrp_mcast_group4 224.18.18.19 #组播地址,实现健康检查,心跳
}
vrrp_instance VI_1 { #实例化虚拟路由器参数
    state MASTER #当前路由设备状态,MASTER或BACKUP,可一主一从或一主多从,
    interface eth0 #实例的网络物理接口
    virtual_router_id 51 #虚拟路由ID,两台主机需相同
    priority 96 #当前物理网络节点的优先级,0-254
    advert_int 1 #MASTER与BACKUP节点间健康检查时间间隔
    authentication {  #PASS或AH认证,一般使用PASS,长度为8,
        auth_type PASS #认证类型
        auth_pass a1b2c3d4 #认证密码
    }   
    virtual_ipaddress { #虚拟路由器IP
        192.168.1.201/24 dev eth0 label eth0:0 #绑定在eth0,标签为eth0:0
    }   
}

另一台主机设置如下:

! Configuration File for keepalived #!起始行为注释行
global_defs { #全局定义块
   notification_email { #通告邮件用户,需要邮件服务,这里不做测试
     root@localhost #接收邮件地址
   }   
   notification_email_from keepalived@localhost #发送邮件用户
   smtp_server 127.0.0.1 #邮件服务器
   smtp_connect_timeout 30 #连接超时
   router_id HA2  #当前路由设备ID,一般为主机名,可变
   vrrp_mcast_group4 224.18.18.19 #组播地址
}
vrrp_instance VI_1 { #实例化虚拟路由器参数
    state   BACKUP #当前路由设备状态,MASTER或BACKUP,可一主一从或一主多从,
    interface ens33 #实例的网络物理接口,主机网络接口
    virtual_router_id 51 #虚拟路由ID,两台主机需相同
    priority 100 #当前物理网络节点的优先级,0-254,一般MASTER主机节点优先级设置最高,
    #BACKUP要低一点
    advert_int 1 #MASTER与BACKUP节点间健康检查时间间隔
    authentication { #PASS或AH认证,一般使用PASS,长度为8,
        auth_type PASS #认证类型
        auth_pass a1b2c3d4 #认证密码
    }   
    virtual_ipaddress { #虚拟路由器IP
        192.168.1.201/24 dev ens33 label ens33:0 #绑定在ens33,标签为ens33:0
    }   
}

编写完成后,两主机各启动keepalived服务:systemctl start keepalived
这里写图片描述

这里写图片描述
查看另一台主机状态
这里写图片描述
由于工作在BACKU模式下,所有没有虚拟路由IP,现在将MASTER主机stop停掉,查看状态:
这里写图片描述
再次查看之前工作在BACKUP模式下的主机状态:
这里写图片描述

这里写图片描述

2、主从虚拟服务器,lvs-dr与sorry_server

在其中一台Director主机keepalived.conf文件内添加虚拟服务器配置段,如下:
! Configuration File for keepalived
global_defs {
   notification_email {
        admin@localhost
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id HA2
   vrrp_mcast_group4 224.18.18.19
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1 
    authentication {
        auth_type PASS
        auth_pass a1b2c3d4
    }
    virtual_ipaddress { 
        192.168.1.201/24 dev ens33 label ens33:0
    }
}
virtual_server 192.168.1.201 80 { #虚拟服务配置块
      delay_loop 3 #轮询健康检查时间间隔
      lb_algo rr #客户端请求分配方法,rr,wrr,lc.wlc.lblc,sh,dh,默认wlc
   lb_kind DR #调用方法,NET,DR,TUN
      protocol TCP #协议
      sorry_server 127.0.0.1 80 # 宕机反馈页,RS宕机后,Director提供
      real_server 192.168.1.107 80 { #RS配置块
            weight 1 #权重
            HTTP_GET { #健康检测方式HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK
            url {
                path / #请求主页信息,可以自定义一个页面,专用做健康检测
                status_code 200 #判断健康反馈码
            }
            connect_timeout 3 #检测超时时长
            nb_get_retry 3 #重试次数
            delay_before_retry 3 #延时时间,三秒检测一次,失败后,延时三秒后再次检测,
            #失败三次后,判断为下线状态
        }
    }
      real_server 192.168.1.108 80 {
         weight 1
            HTTP_GET {
            url {
                path / 
                status_code 200 
            }
         connect_timeout 3
         nb_get_retry 3
         delay_before_retry 3
        }
     }
}
在另一台Director主机keepalived.conf文件内添加虚拟服务器配置段,如下:
! Configuration File for keepalived
global_defs {
   notification_email {
        admin@localhost
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id HA1
   vrrp_mcast_group4 224.18.18.19
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 96
    advert_int 1 
    authentication {
        auth_type PASS
        auth_pass a1b2c3d4
    }
    virtual_ipaddress { 
        192.168.1.201/24 dev eth0 label eth0:0
    }
}
virtual_server 192.168.1.201 80 { #虚拟服务配置块
      delay_loop 3 #轮询健康检查时间间隔
      lb_algo rr #客户端请求分配方法,rr,wrr,lc.wlc.lblc,sh,dh,默认wlc
   lb_kind DR #调用方法,NET,DR,TUN
      protocol TCP #协议
      sorry_server 127.0.0.1 80 # 宕机反馈页,RS宕机后,Director提供
                            real_server 192.168.1.107 80 { #RS配置块
            weight 1 #权重
            HTTP_GET { #健康检测方式HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK
                url {
                    path / #请求主页信息,可以自定义一个页面,专用做健康检测
                    status_code 200 #判断健康反馈码
                }
            connect_timeout 3 #检测超时时长
            nb_get_retry 3 #重试次数
            delay_before_retry 3 #延时时间,三秒检测一次,失败后,延时三秒后再次检测,
            #失败三次后,判断为下线状态
        }
    }
         real_server 192.168.1.108 80 {
         weight 1
         HTTP_GET {
            url {
                path / 
                status_code 200 
            }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        }
     }
}

文件全部编写完成后,需要修改系统参数,
在两台RS主机分别设置如下:(注意要把iptables,selinux关闭,或对相关请求放行)

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#不对网段进行自身信息通告
ifconfig lo:0 192.168.1.201 netmask 255.255.255.255 broadcast 192.168.1.201 up
#在lo配置VIP地址,只广播信息给自身
route add -host 192.168.1.201 dev lo:0
#添加lo:0 VIP地址路由,响应报文要经过lo:0网卡发送到物理网卡以原地址为192.16.1.201发送出去,

启动Director主机的keepalived服务。
启动Director主机的nginx服务,提供宕机后的状态页。
启动RS主机的httpd服务,需要在站点根目录下建立index.html测试页,。
查看keepalived服务状态:
这里写图片描述

这里写图片描述
tcpdump -i eth0 -nn host 224.18.18.19监测组播信息
这里写图片描述
根据keepalived配置参数自动生成ipvsadm策略:
这里写图片描述

这里写图片描述
模型配置如下图:
这里写图片描述

3、优先级调整

在keepalived.conf文件内添加以下内容实现调整优先级:

vrrp_script chk_down {
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
#如果down文件存在返回1,对当前keepalived服务进行降级操作,如果不存在,返回0,跳出脚本,
#touch down,keepalived服务降级,删除恢复
    interval 1 #间隔1秒
    weight -5 #优先级降5,此值要低于其它主机的优先级
}
vrrp_script chk_nginx {
    script "killall -0 nginx && exit 0 || exit 1"#killall -0为测试操作,如果测试killall nginx成功,则退出脚本,
#如果测试killall nginx不成功代表nginx服务已停止或出现其他问题,则对当前keepalived服务进行降级操作,
    interval 1 #间隔1秒
    weight -5 #优先级降5,此值要低于其它主机的优先级
}

可在vrrp_instance name {}配置段中使用track_script{}调用vrrp_script

track_script {
        chk_down
        chk_nginx
}

如下图:
这里写图片描述

touch down或启动nginx服务与停止nginx服务操作可测试优先级调整功能


版权声明:本文为wangye1989_0226原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。