菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
187
0

Keepalived

原创
05/13 14:22
阅读数 38676

1. HA(High Availabl)集群中的相关术语

  1> 节点

  运行HA进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和高可用软件服务,在高可用集群中,节点有主次之分,分别称之为主节点/备份节点,每个节点拥有唯一的主机名,并且拥有属于自己的一组资源,例如,磁盘,文件系统,网络地址和应用服务等,主节点上一般运行着一个或多个应用服务,而备节点一般处于监控状态。

  2> 资源(resource)

  资源是一个节点可以控制的实体,并且当节点发生故障时,这些资源能够被其他节点接管,HA集群软件中,可以当做资源的实体有:

    1)磁盘分区、文件系统;

    2)IP地址VIP;

    3)应用程序服务;

    4)NFS文件系统。

  3> 事件(event)

    也就是集群中可能发生的事情,例如节点系统故障,网络连通故障,网卡故障,应用程序故障等,这些事情都会发生节点资源发生转移,HA的测试也是基于这些事情来进行的。

   4> 动作(action)

事件发生时HA的响应方式,动作是由shell脚本控制的,例如当某个节点发生故障后,备份节点将通过事先设定好的执行脚本进行服务的关闭或启动,进而接管故障节点的资源

 

2. Keepalived简介

  keepalived 是linux下一个轻量级的高可用解决方案,它与HACMP实现功能类似,都可以实现服务或者网络的高可用,但是又有差别:hacmp是一个专业的、功能完善的高可用软件,它提供了HA软件所需的基本功能,比如心跳检测和资源接管,检测集群中的系统服务,在集群节点间转移共享ip地址所有者等,hacmp功能强大,但是部署和使用相对麻烦,同时也是商业化软件(收费),与hacmp相比,keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然他没有hacmp功能强大,但是keepalived部署使用相对简单,所有配置只需要一个配置文件即可完成。

3. Keepalived的用途

  keepalived起初是为lvs设计的,专门用来监控集群系统中各个服务节点的状态,它根据layer3,4 & 5交换机制检测每个服务节点的状态,如果某个服务节点出现异常,或工作出现故障,keepaived将检测到,并将出现故障的服务节点从集群系统中剔除,而在故障节点恢复正常后,keepalived又可以自动将此服务节点重新加入到集群中,这些工作全部自动完成,不需要人工干预,需要人工完成的只是修复故障节点(集成的lvs功能)。

  keepalived后来又加入了VRRP 的功能,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,它出现的目的是为了解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断的、稳定的运行,因此,keepalived一方面具有服务器状态监测和故障隔离功能,另一方面也具有HA Cluster功能,下面详细介绍下VRRP协议的实现过程

4. VRRP协议与工作原理

  在现实的网络环境中,主机之间的通信都是通过配置静态路由完成的,而主机之间的路由器一旦出现故障,通信就会失败,因此在这种通信模式中,路由器就成了一个单点瓶颈,为了解决这个问题就引入了VRRP协议。

  VRRP协议是一种主备模式的协议,通过VRRP可以在网络发生故障时透明地进行设备切换不影响主机间的数据通信(切换主节点和备用节点),这其中涉及两个概念:物理路由器和虚拟路由器。

  VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,而在虚拟路由器内部,是多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称之为主路由器(处于master状态角色)。它拥有对外提供的虚拟ip,提供各种网络功能,比如arp请、icmp、数据转发等,而其他物理路由器不拥有对外提供的虚拟ip,也不提供对外网络功能,仅仅接收master的vrrp状态通告信息,这些路由器被统称为备份路由器(处于backup角色)。当主路由器失效时,处于backup角色的备份路由器将重新进行选举,产生一个新的主路由器进入master角色继续对外服务,整个切换过程对于用户来说完全同名。

  在一个虚拟路由器中,只有处于master角色的路由器会一直发送vrrp数据包(发送间隔视情况而定,适可而止),处于backup角色的路由器只接受master发过来的报文信息,用来监控master运行状态,因此,不会发生master被抢占的现象,除非它的优先级更高,而当master不可用时,backup也就无法收到master发过来的报文信息,于是就认定master出现故障,接着多台backup就会进行选举,优先级最高的backup将成为新的master,这种选举并进行角色的过程非常快,因此也就保证了服务的持续可用性

5. Keepalived的体系结构

  keepaived是一个高度模块化的软件,结构简单,但扩展性很强,下图是官方给出的keepalived的体系结构

  可以看出来,keepalived的体系结构从整体上分为两层,分别是用户空间层和内核空间层。下面介绍一个keepalived两层结构的详细组成及实现的功能。

内核空间层处于最底层,它包括ipvs和netlink两个模块。ipvs模块是keepalived引入的一个第三方模块(集成lvs),通过ipvs可以实现基于ip的负载均衡集群。ipvs默认包含在lvs集群软件中。

  这里有一个误区,由于keepalived可以和ipvs一起很好的工作,所以很多初学者都认为keepalived是一个负载均衡的软件,这种理解是错误的。

 

  内核模块:

    IPVS:主要用于通过IPVS跟lvs进行整合,是lvs的核心模块,跟lvs一块使用的;

    NETLINK:主要实现一些网络的功能;

 

  用户模块:主要用于高可用;

    checker:检查服务状态;

    vrrp stack:用于DS高可用。

6. Keepalived实例详解

  keepalived以路由模式进行运作,

1> 下载安装keepalived

[root@localhost ~]# mount /dev/cdrom /mnt
[root@localhost ~]# yum install keepalived -y

2> 配置文件 /etc/keepalived/keepalived.conf

  配置文件共分为三类

  1> 全局配置

  2> VRRP配置

  3> LVS配置

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
#示例文件
global_defs {                                             # 全局配置
   notification_email {
     acassen@firewall.loc
……….
vrrp_instance VI_1 {                                      # VRRP配置
    state MASTER
    interface eth0
………..
    virtual_ipaddress {                                   #虚拟主机配置文件
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
…………

#修改配置文件
#.4       
vrrp_instance VI_1 {                                     #虚拟主机名,可以改
    state MASTER                                         #主路由
    interface ens33                                      #网卡名
virtual_router_id 56                                     #虚拟路由id,主备之间一定要一样,在同一个虚拟路由当中为避免同教室干扰,修改此处id为56(默认51)
    priority 100                                         #优先级,越大越有权
advert_int 1                                             #1秒发送1次备发消息
    authentication {                                     #授权文件
        auth_type PASS                                   #加密类型,主备之间必须是同一加密类型、同一密码才能在同一虚拟主机
        auth_pass 1222                                   #密码,同样修改(默认为1111)
    }
    virtual_ipaddress {                                  #vip,简单起见,继承上节的路由模式配置
    192.168.16.250
    }

  简单起见,将.4的配置文件发送给.5、.6

[root@localhost ~]# scp /etc/keepalived//keepalived.conf root@192.168.16.5:/etc/keepalived/keepalived.conf
root@192.168.16.5's password:
keepalived.conf                         100% 3552     3.5KB/s   00:00   

  修改

  .5:改为备份,降低权限,其他都不用改

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP                                             #备份路由
……..
priority 60
……..

  修改完配置文件后将路由模式设置的子网vip关掉,关掉防火墙,再重启keepalived,得到vip,配置成功

#.4
[root@localhost ~]# ip a
    inet 192.168.16.250/32 brd 192.168.16.250 scope global ens33:0
[root@localhost ~]# ifconfig ens33:0 down
[root@localhost ~]#
[root@localhost ~]# systemctl restart keepalived         #重启keepalived,得到配置文件设置的vip
[root@localhost ~]# ip a                                 #多查看几次
inet 192.168.16.250/32 scope global ens33

  此时主节点获得vip,即主路由是正常工作的,备份路由没有工作,获取不到vip

#.6
[root@localhost ~]# ip a
[root@localhost ~]#

  若将主路由的keepalived断掉(模拟主路由出问题),则备份路由自动顶替工作,可以查看到备份路由获取到了vip

#.4:
[root@localhost ~]# systemctl stop keepalived
[root@localhost ~]# ip a
[root@localhost ~]#

#.5:
[root@localhost ~]# ip a                                   #多查看几次
inet 192.168.16.250/32 scope global ens33

  当主路由(调度器)工作时备用路由是闲置的,即同一时间只有一台调度器在工作,为了负载均衡,可以修改配置文件实现负载均衡,两台调度器互为主备。

  定义两个ip,部分访问主,部分访问备

  配置两个vip实例(VRRP协议):

#.4
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 56
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1222
    }
    virtual_ipaddress {
        192.168.16.250/32
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 57
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1333
    }
    virtual_ipaddress {
        192.168.16.200/32
    }
}

#.5:分别降低、提高权限
[root@localhost ~]# vim //etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 56
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1222
    }  
    virtual_ipaddress {
        192.168.16.250/32
    }  
}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 57
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1333
    }
    virtual_ipaddress {
        192.168.16.200/32
    }
}
#仅开启.4的keepalived,.4会将.5的.200vip抢占 #.
4 [root@localhost ~]# systemctl restart keepalived [root@localhost ~]# ip a inet 192.168.16.250/32 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.16.200/32 scope global ens33 valid_lft forever preferred_lft forever #.5 [root@localhost ~]# ip a [root@localhost ~]# #开启.5的keepalived后,.200vip会被.5抢回 [root@localhost ~]# systemctl restart keepalived [root@localhost ~]# ip a #多试几次 inet 192.168.16.200/32 scope global ens33
#此时若关闭.
4 的keepalived,.250vip会被.5抢到 #.4 [root@localhost ~]# systemctl stop keepalived [root@localhost ~]# ip a .5: [root@localhost ~]# ip a inet 192.168.16.200/32 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.16.250/32 scope global ens33 valid_lft forever preferred_lft forever

互为主备可以充分的利用调度器,在实现负载均衡的同时能够提高资源利用率。

 

keepalived的checker模式:监控后端的RS。监控可以通过多种方式,如tcp、httpd的。以httpd的方式做是实验。

  主备调度器设置完成后再打开两台虚拟机.5、.6充当RS,

  250调度器(DR):192.168.16.4

  200调度器(DR):192.168.16.5

  RS1:192.168.16.5

  RS2:192.168.16.6

 

添加RS,直接用keepalived集成的lvs自动配置,不再手动配置lvs

#.4
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
……….
vrrp…
………..
virtual_server 192.168.16.250 80 {              #lvs配置,服务ip及端口
    delay_loop 6                                #健康检查时间间隔
    lb_algo rr                                  #轮循算法
    lb_kind DR                                  #路由模式  
    protocol TCP                                #基于tcp协议连接
    real_server 192.168.16.6 80 {               #RS1
        weight 1
        HTTP_GET {                              #可以是httpd访问
            url {
              path /                            #从根目录检索
              status_code 200                   #根据返回的状态码200检查
            }
            connect_timeout 3                   #连接超时时间
            nb_get_retry 3                      #重连次数
            delay_before_retry 3                #重连间隔时间
        }  
    }  
    real_server 192.168.16.7 80 {               #RS2
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }  
    }  
}

#.6:继续以脚本的方式修改内核参数
[root@localhost ~]# vim lvs_rs.sh
#!/bin/bash
case $1 in
start)
        ifconfig lo:0 192.168.16.250 broadcast 192.168.16.250 netmask 255.255.255.255 up
        if [ $? -eq 0 ];then
                route add -host 192.168.16.250 dev lo:0
        fi
        echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
        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
;;
stop)
        ifconfig lp:0 down
        route del -host 192.168.16.250                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 "Usage: start|stop"
;;
esac

[root@localhost ~]# bash lvs_rs.sh start

#发送给.7
[root@localhost ~]# scp lvs_rs.sh root@192.168.16.7:/root
lvs_rs.sh                            100%  790     0.8KB/s   00:00

#.7
[root@localhost ~]# bash lvs_rs.sh start

#修改RS的网页首文件,启动RS的httpd,关闭防火墙,在.4端查看lvs配置

#.6
[root@localhost~]#vim /var/www/html/index.html
This is 6

#.7:
[root@localhost~]#vim /var/www/html/index.html
This is 7

#.4:
[root@localhost ~]# systemctl restart keepalived
[root@localhost ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.16.250:80 rr
  -> 192.168.16.6:80              Route   1      0          0         
  -> 192.168.16.7:80              Route   1      0          0        
 
#再用.5来查看是否成功
[root@localhost ~]# curl 192.168.16.250
This is 6
[root@localhost ~]# curl 192.168.16.250
This is 7
[root@localhost ~]# curl 192.168.16.250
This is 6
[root@localhost ~]# curl 192.168.16.250
This is 7
#成功

#.4宕掉之后.5主动补上,再将.4启动后又会被.4抢回vip,若不想被.4抢占,可以将.4设置为 非抢占模式。
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 56
    priority 100
    advert_int 1
    nopreempt                        #非抢占模式
    authentication {
        auth_type PASS
        auth_pass 1222
    }
    virtual_ipaddress {
        192.168.16.250
    }
}

发表评论

0/200
187 点赞
0 评论
收藏