Keepalived高可用集群应用

1、keepalived服务说明

1.1、keepalived介绍

Keepalived是一个用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础设施提供简单而强大的负载均衡和高可用性设施。Loadbalancing框架依赖于众所周知且广泛使用的 提供Layer4负载平衡的Linux虚拟服务器(IPVS)内核模块。Keepalived实现了一组检查器,根据其健康动态地自适应维护和管理负载均衡服务器池。另一方面,VRRP实现高可用性协议。VRRP是路由器故障转移的基础砖块。此外,Keepalived还为VRRP有限状态机提供了一系列挂钩,以提供低级别和高速协议交互。Keepalived框架可以独立使用,也可以一起使用,以提供弹性基础设施。

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

  Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

  所以,Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能

官网:http://www.keepalived.org

1.2、keepalived服务的三个重要功能

管理LVS负载均衡软件

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

作为系统网络服务的高可用功能(failover)

1.3、keepalived高可用故障切换转移原理

Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。

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

1.4、keepalived 原理

Keepalived高可用对之间是通过VRRP通信的,因此,我们从 VRRP开始了解起:

  1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。

  2) VRRP是通过一种竞选协议机制来将路由任务交给某台 VRRP路由器的。

  3) VRRP用 IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信。

  4) 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。

  5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。

工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。

 

2、keepalived部署

环境说明

主机名

IP地址

说明

lb01

10.0.0.5

负载均衡(keepalived主服务器)

lb02

10.0.0.6

负载均衡(keepalived备服务器)

Web01

10.0.0.7

网站服务器(已经搭建好discuz和wordpress)

db01

10.0.0.51

网站数据库服务器

2.1、软件安装及配置文件说明

yum install keepalived -y

配置文件/etc/keepalived/keepalived.conf说明

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf

1 ! Configuration File for keepalived        #注释,说明该配置文件为keepalived的配置文件

2

3 global_defs {                        #全局配置

4 notification_email {                #定义报警邮件地址

5 acassen@firewall.loc

6 failover@firewall.loc

7 sysadmin@firewall.loc

8 }

9 notification_email_from Alexandre.Cassen@firewall.loc    #定义发送邮件的地址

10 smtp_server 192.168.200.1        #邮箱服务器

11 smtp_connect_timeout 30            #定义超时时间

12 router_id LVS_DEVEL                #定义路由器标识,相同局域网要求唯一

13 }

14

15 vrrp_instance VI_1 {                    #实例定义区,实例名称为VI_1

16 state MASTER                    #当前实例角色状态,可选项为MASTER(主)和BACKUP(备)

17 interface eth0                    #虚拟ip地址放置的网络通信接口

18 virtual_router_id 51                #虚拟路由ID标识

19 priority 100                    #优先级权值,决定主备,越大越优先

20 advert_int 1                    #主备间同步通知间隔

21 authentication {                #权限认证配置

22 auth_type PASS                #认证类型

23 auth_pass 1111                #认证密码,密码相同主备间才能互相通信

24 }

25 virtual_ipaddress {                #虚拟ip地址

26 192.168.200.16

27 192.168.200.17

28 192.168.200.18

29 }

30 }

后面内容省略

2.2、部署

去掉配置文件中不必要的内容

主负载均衡服务器配置

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

router_id LVS_DEVEL1

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.3

}

}

备负载均衡服务器配置

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

router_id LVS_DEVEL2

}

 

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.3

}

}

2.3、启动服务

在lb01和lb02上配置好负载均衡后,都启动nginx和keepalived服务

[root@lb01 ~]# nginx

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

Starting keepalived: [ OK ]

利用ip addr命令查看ip

[root@lb01 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

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

link/ether 00:0c:29:c1:51:ec brd ff:ff:ff:ff:ff:ff

inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0

inet 10.0.0.3/32 scope global eth0

inet6 fe80::20c:29ff:fec1:51ec/64 scope link

valid_lft forever preferred_lft forever

[root@lb02 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

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

link/ether 00:0c:29:e6:5f:14 brd ff:ff:ff:ff:ff:ff

inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0

inet6 fe80::20c:29ff:fee6:5f14/64 scope link

valid_lft forever preferred_lft forever

可以发现,主负载均衡服务器上有我们配置的虚拟ip,备负载均衡服务器上没有,这是根据配置来决定的。可以通过抓包软件wireshark来抓取VRRP协议来检验,keepalived服务使lb01和lb02都通过VRRP协议和组播地址224.0.0.18通信,使用虚拟ip10.0.0.3以及1111来进行认证

这个时候我们在lb01即主服务器上停止其keepalived服务,再查看lb01和lb02的ip,可以发现ip地址10.0.0.3到了lb02备服务器上,这与理论是相符合的,相当于主服务器宕机之后,虚拟ip会通过组播VRRP分配到备服务器上

[root@lb01 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

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

link/ether 00:0c:29:c1:51:ec brd ff:ff:ff:ff:ff:ff

inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0

inet6 fe80::20c:29ff:fec1:51ec/64 scope link

valid_lft forever preferred_lft forever

[root@lb02 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

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

link/ether 00:0c:29:e6:5f:14 brd ff:ff:ff:ff:ff:ff

inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0

inet 10.0.0.3/32 scope global eth0

inet6 fe80::20c:29ff:fee6:5f14/64 scope link

valid_lft forever preferred_lft forever

 

3、keepalived存在的问题

3.1、keepalived服务器的"生锈"问题

在配置好主负载均衡服务器和备负载均衡服务器之后,如果某个服务器宕机,keepalived服务会将虚拟ip分配分配给另外一台服务器。但是如果这种情况不会发生,那么备负载均衡服务器将一直不会起到负载均衡服务器的作用来与后端服务器进行负载均衡的分配,通俗的来说即"生锈"。我们如果有多个网站需要运行在web服务器上,那么在配置主负载均衡和备负载均衡时我们可以将其交叉进行,即一台服务器作为一个网站的主负载均衡服务器,同时又作为另外一个网站的备负载均衡服务器,另外一台跟这一台相仿。这样大体来看,负载均衡服务器没有了主备之分,都起到了相应作用。

例如我们将discuz论坛的主负载均衡服务器指定为lb01,备负载均衡服务器指定为lb02。将wordpress博客的主负载均衡服务器指定为lb02,备负载均衡服务器指定为lb01。

其中lb01的keepalived配置文件如下

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

router_id LVS_DEVEL1

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id

priority

advert_int 1

authentication {

auth_type PASS

auth_pass

}

virtual_ipaddress {

10.0.0.3

}

}

vrrp_instance VI_2 {

state BACKUP

interface eth0

virtual_router_id

priority

advert_int 1

authentication {

auth_type PASS

auth_pass

}

virtual_ipaddress {

10.0.0.4

}

}

3.2、keepalived服务器的"脑裂"问题

3.2.1 脑裂问题介绍

在高可用(HA)系统中,当联系2个节点的"心跳线"断开时(不能通过VRRP相互通信),本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像"裂脑人"一样,争抢"共享资源"、争起"应用服务",就会发生严重后果——或者共享资源被瓜分、2边"服务"都起不来了;或者2边"服务"都起来了,但同时读写"共享存储",导致数据损坏(常见如数据库轮询着的联机日志出错)。

3.2.2 脑裂问题产生的原因

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

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

 因心跳线坏了(包括断了,老化)。

 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。

 因心跳线间连接的设备故障(网卡及交换机)。

 因仲裁的机器出问题(采用仲裁的方案)。

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

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

※ 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

※ 提示: Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生

3.2.3 脑裂问题的解决方案

在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生:

※ 同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。

※ 当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、feyce)。相当于备节点接收不到心跳消患,通过单独的线路发送关机命令关闭主节点的电源。

※ 做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.

当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务.这个损失是可容忍的。

3.2.4 脑裂情况监控

可以利用脚本在备负载均衡服务器上进行监控,在脑裂情况未发生的情况下

执行命令ip a show eth0 |grep 10.0.0.3|wc -l可以得出虚拟ip有没有在该备服务器上,以0和1来进行区分

脚本如下

[root@lb02 scripts]# vim check_keepalived.sh

#!/bin/bash

while true

do

if [ `ip a show eth0 |grep 10.0.0.3|wc -l` -ne 0 ]

then

echo "keepalived is error!"

else

echo "keepalived is OK !"

fi

done

脚本要赋予执行权限,可以添加定时任务来进行定时的监控

3.3、keepalived服务器不随业务停止而停止服务

在实际中还存在着一种情况:若主负载均衡服务器的负载均衡功能(nginx服务)停止,但是keppalived服务并不会主动随nginx的停止而停止,即keepalived服务和其他负载均衡服务如nginx服务之间没有必然关联。那么这样的情况就导致虚拟ip无法主动漂移到备服务器上使备服务器接管业务。

执行命令ps -ef |grep nginx |grep -v grep |wc –l过滤出nginx进程并计数,正常情况下为2,当这个数小于2时,就主动停止keepalived服务(自杀式任务)从而使备服务器接管工作,在主服务器上利用脚本让keepalived监控nginx

[root@lb02 scripts]# vim check_nginx.sh

#!/bin/bash

ngx_pro_count=`ps -ef|grep nginx|grep -v "grep"|wc -l`

if [ $ngx_pro_count -lt 2 ];then

/etc/init.d/keepalived stop

fi

同样脚本要赋予执行权限,可以添加定时任务来进行定时的监控或者将脚本引入到keepalived.conf中执行

[root@lb01 scripts]# chmod +x check_nginx.sh

[root@lb01 scripts]# ll

总用量 4

-rwxr-xr-x 1 root root 134 5月 20 16:51 check_nginx.sh

[root@lb01 scripts]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

router_id LVS_DEVEL1

}

 

vrrp_script check {     #定义脚本

script "/service/scripts/check_nginx.sh"     #表示将一个脚本信息赋值给变量check_web

interval 2         #执行监控脚本的间隔时间

weight 2             #利用权重值和优先级进行运算,从而降低主服务优先级使之变为备服务器(建议先忽略)

}

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

}

track_script {     #调用脚本

check

}

}

 

 

文章部分内容参考来源:https://www.cnblogs.com/clsn/p/8052649.html

转载请务必注明出处

Keepalived高可用集群应用的更多相关文章

  1. Haproxy+keepalived高可用集群实战

    1.1  Haproxy+keepalived高可用集群实战 随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡 ...

  2. Nginx+Keepalived高可用集群应用实践

    Nginx+Keepalived高可用集群应用实践 1.Keepalived高可用软件 1.1 Keepalived服务的三个重要功能 1.1.1管理LVS负载均衡软件 早期的LVS软件,需要通过命令 ...

  3. Keepalived高可用集群搭建(转载linuxIDC)

    1.Keepalived简介 Keepalived是一个基于VRRP协议来实现的WEB服务高可用方案,可以利用其来避免单点故障.使用多台节点安装keepalived.其 他的节点用来提供真实的服务,同 ...

  4. 基于Keepalived高可用集群的MariaDB读写分离机制实现

    一 MariaDB读写分离机制 在实现读写分离机制之前先理解一下三种主从复制方式:1.异步复制:MariaDB默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库 ...

  5. Linux 笔记 - 第十八章 Linux 集群之(一)Keepalived 高可用集群

    一.前言 Linux 集群从功能上可以分为两大类:高可用集群和负载均衡集群.此处只讲高可用集群,负载均衡放在下一篇博客讲解. 高可用集群(High Availability Cluster,简称 HA ...

  6. Keepalived高可用集群介绍

    1.Keepalived服务介绍 Keepalived起初是专为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入了VRRP的功能,因此除了配合LVS服务外,也可以为其他服务(n ...

  7. keepalived高可用集群。

    keepalived故障切换转移原理1vrrp协议:(vritual router redundancy protocol)虚拟路由冗余协议,2故障转移.keepalived三大功能1实现物理高可用, ...

  8. Linux系统——Keepalived高可用集群

    #### keepalived服务的三个重要功能1. 管理LVS负载均衡软件Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能,这使得 ...

  9. Nginx入门篇(七)之Nginx+keepalived高可用集群

    一.keepalived介绍 keepalived软件最开始是转为负载均衡软件LVS而设计,用来管理和监控LVS集群系统中各个服务节点的状态,后来又加入了可实现高可用的VRRP功能.所以Keepali ...

随机推荐

  1. js中哪些语句在if语句中默认为真

    结论:js中有一个函数是:Boolean(value)这个函数把一个value值转换成相应的boolean值. 当value为以下值是为true:1.任意的非空字符串 .2.任意的非0数字 而当val ...

  2. 用类加载器的5种方式读取.properties文件

    用类加载器的5中形式读取.properties文件(这个.properties文件一般放在src的下面) 用类加载器进行读取:这里采取先向大家讲读取类加载器的几种方法:然后写一个例子把几种方法融进去, ...

  3. Windows7下的Run运行命令一览表

    按住Windows键(就是左边Ctrl和Alt之间那个印windows徽标的键,简称Win键)+R,即可弹出运行对话框,在里面输入黑体字符即可运行相应程序.相比XP这次新增了不少新东西. 添加/删除程 ...

  4. [04]JS获取文件大小方法

    </pre><pre name="code" class="html"><input id="file" ty ...

  5. Topcoder SRM548 Div 1

    1. KingdomAndTrees 给出n个数a[1..n],求一个数组b[1..n]满足b严格递增,且b[1]>=1. 定义代价为W = max{abs(a[i]-b[i])},求代价最小值 ...

  6. C# 操作Excel,使用EPPlus

    EPPlus下载地址:http://www.codeplex.com/EPPlus 引用命名空间: using OfficeOpenXml; using OfficeOpenXml.Table; us ...

  7. table 实现 九宫格布局

    九宫格布局 最近遇到一个题目,是实现一个九宫格布局的.实现的效果大概是下图这种这样子的: (鼠标悬浮的时候,九宫格的边框颜色是改变的.) 首先想到的是直接使用<table>进行布局,原因很 ...

  8. 【一】ODB - C++ 访问数据库的利器--Hello World On Windows(Version-24)

    本文以MySQL数据库为例,其他数据类似. 官方文档和下载 ODB官方首页    官方开发者说明书(开发教程) 安装下载首页(下载与安装教程Windows/Linux) Windows安装步骤(都是英 ...

  9. Codeforces 798 B. Mike and strings-String的find()函数

    好久好久好久之前的一个题,今天翻cf,发现这个题没过,补一下. B. Mike and strings time limit per test 2 seconds memory limit per t ...

  10. (8)oracle 表的增删改

    表的命名 表需要字母开头 只能用如下字符 A-Z,a-z,0-9,$,#. 不能使用oracle保留字 长度不能超过30 创建一张表 create table 表名(字段名 数据类型,字段名 数据类型 ...