keepalived服务

keepalived介绍

Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。

但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作;

当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

keepalived服务的三个重要功能

1.管理LVS负载均衡软件

2.实现对LVS集群节点健康检查功能

3.作为系统网络服务的高可用功能

Keepalived的原理

在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

  那么,什么是VRRP呢?

  VRRP ,全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的

keepalived的部署

硬件环境准备

准备4台物理服务器或4台VM虚拟机,两台用来做keepalived服务,两台做测试的web节点

10.0.0.5 172.16.1.5  keepalived主服务器(Nginx主负载均衡器)

10.0.0.6 172.16.1.6  keepalived备服务器

10.0.0.8 172.16.1.8 web1服务器

10.0.0.7 172.16.1.7 web2服务器

CentOS系统及Nginx代理环境

[root@lb01 ~]# cat /etc/redhat-release

CentOS release 6.8 (Final)

[root@lb01 ~]# uname -r

2.6.32-642.el6.x86_64

[root@lb01 ~]# uname -m

x86_64

开始安装keepalived软件

[root@lb01 ~]# yum -y install keepalived

[root@lb02 ~]# rpm -qa keepalived

keepalived-1.2.13-5.el6_6.x86_64

[root@lb01 ~]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@lb01 ~]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

keepalived配置文件的说明

和其他使用yum安装的软件一样,keepalived软件的配置文件默认路径及配置文件名

[root@lb01 ~]# ls -l /etc/keepalived/keepalived.conf

-rw-r--r-- 1 root root 712 Mar 30 06:06 /etc/keepalived/keepalived.conf

keepalived.conf配置文件包含了两个重要的区块

1、全局定义(Global Definitions)部分

#1-13行表示全局配置

 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        #定义路由标识信息,相同局域网唯一
 }  
#15-30行 虚拟ip配置 vrrp

vrrp_instance VI_1 {   #定义实例

    state MASTER         #状态参数 master/backup 只是说明

    interface eth0       #虚IP地址放置的网卡位置

    virtual_router_id 51 #同一家族要一直,同一个集群id一致

    priority 150         # 优先级决定是主还是备    越大越优先

    advert_int 1        #主备通讯时间间隔

    authentication {     #

        auth_type PASS    #

        auth_pass 1111    #认证

    }                        #
    virtual_ipaddress {  #

         10.0.0.3/24 dev eth0 label eth0:1   #设备之间使用的虚拟ip地址

    }
}

keepalived高可用服务单实例实战

实战配置keepalived主服务器lb01 MASTER

global_defs {

   router_id LVS_01

}
vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 150 

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }   
    virtual_ipaddress {

     10.0.0.3/24 dev eth0 label eth0:2

    }   

}

配置完毕后,启动keepalived

[root@lb01 conf]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

检查lb01网卡上应该多了一个IP

[root@lb01 conf]# ip a |grep eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0

    inet 10.0.0.3/24 scope global secondary eth0:1

实战配置keeplived备服务器lb02 BACKUP

global_defs {

   router_id LVS_02

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

     10.0.0.3/24 dev eth0 label eth0:1

    }

}

启动keeplived

[root@lb02 tools]# /etc/init.d/keepalived reload

Reloading keepalived:                                      [  OK  ]

[root@lb02 tools]# ip a |grep eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0

这里没有10.0.0.3的IP就对了,当主节点活着时候,它不会接管主

这里我把lb01停了,再看看lb02的变化

[root@lb01 conf]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

在lb02上明显看到多了一个IP

[root@lb02 tools]# ip a |grep eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0

    inet 10.0.0.3/24 scope global secondary eth0:1

打开后lb01他又自动跳回了

[root@lb01 conf]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@lb01 conf]# ip a |grep eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0

    inet 10.0.0.3/24 scope global secondary eth0:1

keepalived高可用服务器的“裂脑”问题

什么是裂脑

由于某些原因,导致两台高可用服务器对指定的时间内,无法检测到对方的心跳信息,各自取得资源及服务的所有权,而此时的两台高可用服务器都还活着并在正常运行,这样就会导致同一个IP或服务在两段同时存在而发生冲突,最严重的的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写到两段,这可能会导致服务器两段的数据不一致或造成数据丢失,这种情况就被称为裂脑

导致裂闹发生的原因

一般来说,裂脑的发生,有以下几种原因

高可用服务器对之间心跳线链路发生故障,导致无法正常通行

心跳线坏了

网卡及相关的驱动坏了,IP配置及冲突问题

心跳线间的连接的设备故障

仲裁的机器出问题。

高可用服务器上开启了iptables防火墙阻挡了心跳信息传输

高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳发送失败

其他服务配置不当的原因,如心跳方式不同,心跳广播冲突,软件BUG等

解决裂脑的常见方案

同时使用串行电缆和以太网连接,同时用两条心跳线路。

当检测到裂脑时强行关闭一个心跳节点

做好对裂脑的监控报警

如果开启了防火墙,一定要让心跳信息通过

keepalived双主模式配置

global_defs {

   router_id LVS_01

}

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

     10.0.0.3/24 dev eth0 label eth0:1

    }

}

vrrp_instance VI_2 {

    state BACKUP

    interface eth0

    virtual_router_id 52

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }   

    virtual_ipaddress {

     10.0.0.4/24 dev eth0 label eth0:2

    }   
 
}
lb1配置
global_defs {

   router_id LVS_02

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

     10.0.0.3/24 dev eth0 label eth0:1

    }

}

vrrp_instance VI_2 {

    state MASTER

    interface eth0

    virtual_router_id 52

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }   

    virtual_ipaddress {

     10.0.0.4/24 dev eth0 label eth0:2

    }   

}
lb2配置

分别启动lb01、lb02上的keepalived

[root@lb01 ~]# /etc/init.d/keepalived restart

Stopping keepalived:                                       [  OK  ]

Starting keepalived:                                       [  OK  ]

#lb01上查看

[root@lb01 ~]# ip a |grep eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0

    inet 10.0.0.3/24 scope global secondary eth0:1

#lb02上查看

[root@lb02 tools]# ip a |grep eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0

    inet 10.0.0.4/24 scope global secondary eth0:2

#断开lb01

[root@lb01 ~]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

#查看lb02上的变化

[root@lb02 tools]# ip a |grep eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0

    inet 10.0.0.4/24 scope global secondary eth0:2

    inet 10.0.0.3/24 scope global secondary eth0:1
启动查看验证

解决服务监听的网卡上不存在IP地址问题

如果配置使用”listen 10.0.0.3:80;”的方式指定IP监听服务,而本地的网卡上没有10.0.0.3这个IP,Nginx就会报错

[root@lb01 ~]# /application/nginx/sbin/nginx -t

nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok

nginx: [emerg] bind() to 10.0.0.3:80 failed (99: Cannot assign requested address)

nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test failed

解决方法就是在/etc/sysctl.conf中添加如下内核参数

echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf

最后执行sysctl -p 使上述修改生效

[root@lb01 ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf

[root@lb01 ~]# sysctl -p

[root@lb01 ~]# /application/nginx/sbin/nginx -t

nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok

nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful

猜你喜欢

转载自www.cnblogs.com/HByang/p/9197203.html
今日推荐