keepalived 介绍

keepalived介绍

keepalived是什么?

Keepalived 起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。

keepalived 是一个类似于layer3,layer4,layer5交换机制的软件。

keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障,它可以自动检测集群中服务器的健康状况。

Keepalived 是用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡和高可用性功能。
Keepalived 是开源并且免费的软件。

什么是VRRP?

VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议。

keepalived的工作原理

Layer3:Keepalived 会定期向服务器群中的服务器发送一个ICMP的数据包,如果发现某台主机的IP地址没有激活,Keepalived会报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

Layer4:例如 nginx 服务(端口80),如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。Layer4主要以TCP端口的状态来决定服务器工作正常与否。

Layer5:对指定的URL执行HTTP GET,使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,Keepalived就会把这台服务器从服务器池中移除。

keepalived的组件

Keepalived 大致分两层结构:

用户空间

内核空间 (IPVS和NETLINK模块)

内核模块Keepalived主要实现负载均衡和路由高可用的核心模块,其中的NETLINK主要用于提供高级路由及其相关的网络功能。
用户空间是Keepalived的多数核心功能模块,其中几个核心功能模块的介绍如下:
core模块:keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析。
Checkers :主要负责真实服务器的健康检查( HealthChecking )。
VRRP Stack :主要负责负载均衡器之间的故障切换,集群架构中2个及2个以上LVS负载均衡器,才具备故障切换的条件。
System call 用来在进程之间的系统接口调用,来完成checkers和VRRP Stack健康检查和故障切换操作。
SMTP 在健康状态和故障切换发送故障时,通过邮件通知客户及时处理故障。
watch dog:监控check和vrrp进程的看管者,check负责检测器子进程的健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上。
IPVS Wrapper :主要用来发送设定的规则到内核IPVS代码。
Netlink Reflector :主要用来设定VRRP的VIP地址并提供相关的网络功能,该模块通过与内核中的NETLINK模块交互,从而为Keepalived提供路由高可用功能。

keepalived的作用

作为系统网络服务的高可用(High availability)

检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到并且将有故障的服务器从集群中剔除,同时使用其他服务器代替该服务器的工作,当服务器恢复正常,Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成。

Keepalived 的2大核心功能

    1.loadbalance 负载均衡 LB:ipvs--》lvs软件在linux内核里已经安装,不需要单独安装。
    2. high-availability 高可用 HA : vrrp协议

安装keepalived(yum 安装)

yum install keepalived -y

keepalived正常启动的时候,共启动3个进程:

一个是父进程,负责监控其子进程;一个是VRRP子进程,另外一个是checkers子进程;
两个子进程都被系统watchdog看管,两个子进程各自负责自己的事。Healthcheck子进程检查各自服务器的健康状况,例如http,lvs。如果healthchecks进程检查到master上服务不可用了,就会通知本机上的VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。

[root@mysql-router-1 mail]# ps aux|grep keepa
root       4298  0.0  0.0 123012  1400 ?        Ss   11:04   0:00 /usr/sbin/keepalived -D
root       4299  0.0  0.1 127212  2428 ?        S    11:04   0:00 /usr/sbin/keepalived -D
root       4300  0.0  0.1 127212  2480 ?        S    11:04   0:00 /usr/sbin/keepalived -D
root       4302  0.0  0.0 112824   980 pts/1    S+   11:04   0:00 grep --color=auto keepa

主配置文件/etc/keepalived/keepalived.conf

[root@mysqlrouter-1 ~]# cd /etc/keepalived/
[root@mysqlrouter-1 keepalived]# ls
keepalived.conf

[root@mysqlrouter-1 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

#全局配置
global_defs {
   # 定义报警收件人邮件地址
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   # 定义报警发件人邮箱
   notification_email_from Alexandre.Cassen@firewall.loc
   # 邮箱服务器地址
   smtp_server 192.168.200.1
   # 定义邮箱超时时间
   smtp_connect_timeout 30
   # 定义路由标识信息,同局域网内唯一
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #表示严格遵守VRRP协议(建议注释)
   #vrrp_strict
   #可设置ARP接口之间发送免费报文的延迟时间,可以精确到毫秒,默认是0
   vrrp_garp_interval 0
   #设置非请求消息的发送延迟时间,默认为0
   vrrp_gna_interval 0
}

#定义一个vrrp协议的实例  名字叫VI_1  第一个vrrp实例
vrrp_instance VI_1 {
 	#做master角色
    state MASTER
    #指定监听网络的接口,其实就是vip绑定到那个网络接口上
    interface ens33
    #虚拟路由器id
    virtual_router_id 51
    #优先级   0~255
    priority 200
    #宣告消息的时间间隔 1秒
    advert_int 1
    authentication {
    	#密码认证
        auth_type PASS
        #具体密码
        auth_pass 1111
    }
    #虚拟ip地址,可以有多个(vip)
    virtual_ipaddress {
        192.168.2.188
    }
}

示例

配置单个主备vip

[root@mysql-router-1 ~]# cd /etc/keepalived/
[root@mysql-router-1 keepalived]# ls
keepalived.conf

[root@mysqlrouter-2 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state backup
    interface ens33
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.188
    }
}

[root@mysqlrouter-2 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service

[root@mysql-router-1 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 80
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.188
    }
}

[root@mysql-router-1 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service

[root@mysql-router-1 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:0b:ab:19 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.106/24 brd 192.168.2.255 scope global noprefixroute dynamic ens33
       valid_lft 6575sec preferred_lft 6575sec
    inet 192.168.2.188/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::756f:5c73:773b:8942/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::c677:9e7:aa77:c70c/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::e6:ae86:1811:699b/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
[root@mysql-router-1 keepalived]# 

验证vip漂移

# 有vip的服务器停掉keepalived
[root@mysqlrouter-1 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service

# 查看另一台服务器上是否有vip
[root@mysql-router-2 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:0b:ab:19 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.106/24 brd 192.168.2.255 scope global noprefixroute dynamic ens33
       valid_lft 6575sec preferred_lft 6575sec
    inet 192.168.2.188/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::756f:5c73:773b:8942/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::c677:9e7:aa77:c70c/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::e6:ae86:1811:699b/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

配置2个vrrp实例,互为主备

# 第1台服务器的配置
[root@mysql-router-1 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 80
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.187
    }
}

vrrp_instance VI_2 {
    state backup
    interface ens33
    virtual_router_id 81
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.186
    }
}

# 第2台服务器的配置
[root@mysqlrouter-2 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state backup
    interface ens33
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.187
    }
}

vrrp_instance VI_2 {
    state master
    interface ens33
    virtual_router_id 81
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.186
    }
}

什么是脑裂?

当两台高可用服务器在指定的时间内,无法互相检测到对方而各自启动故障转移功能,取得了资源以及服务的所有权,而此时的两台高可用服务器对都还活着并作正常运行,这样就会导致同一个服务在两端同时启动而发生冲突的严重问题,最严重的就是两台主机同时占用一个VIP的地址。
脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。

为什么会出现脑裂?

    1.vrid(虚拟路由id)不一样
    2.网络通信有问题:中间有防火墙阻止了网络之间的选举的过程,vrrp报文的通信
    3.认证密码不一样也会出现脑裂

脑裂有没有危害?如果有危害对业务有什么影响?

    没有危害,能正常访问,反而还有负载均衡的作用;
    脑裂恢复的时候会有影响,会导致短暂的中断,影响业务。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩未零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值