目录

VRRP协议原理

高可用配置文件

Keepalived高可用服务搭建测试

Keepalived高可用服务器的"脑裂"问题


参考文档:https://weread.qq.com/web/reader/ea732b705c6eeaea7febb5ek37132b503160371bce7de3e
Keepalived软件主要是通过VRRP协议实现高可用功能;

Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:nginx、haproxy、Mysql等)的高可用解决方案。

VRRP协议原理

VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议),它出现的目的就是为了解决静态路由单点故障问题的。它能够保证当个别节点宕机是,整个网络可以不间断的运行。
Keepalived一方面具有配置管理LVS的功能,还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

VRRP通过一种竞选机制来讲路由的任务交给某台VRRP路由器的。

在一组VRRP路由器集群中,有多台物理VRRP路由器,但是这多台物理的机器并不是同时工作的,而是有一台称为Master的机器负责路由工作,其他的机器都是Backup。Master角色并非一成不变的,VRRP会让每个VRRP路由器参与竞选,最终获胜的就是Master。获胜的Master有一些特权,比如拥有虚拟路由器的IP地址等,拥有系统资源的Master负责转发发送给网关地址的包和响应ARP请求。

VRRP通过竞选机制来实现虚拟路由器的功能,所以的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的。虚拟路由器有VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因Master的改变而修改自己的路由配置。对它们来说,这种切换是透明的。

在一组虚拟路由器中,只有作为Master的VRRP路由会一直发送VRRP广播包(VRRP Advertiesment messages),此时Backup不会抢占Master。当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master。这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性。出于安全性考虑,VRRP数据包使用了加密协议进行了加密。

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

高可用配置文件

# 全局定义(Global Definition)部分

! Configuration File for keepalived  # 注释

global_def {

# 定义服务故障报警的Email地址,作用是当服务发生切换或RS节点等有故障时,发报警邮件。email地址可以多个。

notification_email {

test1@test.com

test2@test.com

}

# 指定发送邮件的发送人,即发件人地址,可选配置

notification_email_from test@test.com

# smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail或postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。

smtp_server 192.168.108.1

# smtp_connect_timeout是连接smtp的超时时间,可选配置

smtp_connect_timeout 30

# keepalived服务器的路由标识(router_id)。在一个局域网内,这个标识(router_id)应该是唯一的。

router_id LVS_DEVEL

}

# VRRP实例定义区块(VRRP instance(s) )部分

# 这部分主要用来定义具体服务的实例配置,包括Keepalived主备状态、接口、优先级、认证方式和IP信息等。

# 定义一个vrrp_instance实例,名字是VI_1,每个vrrp_instance实例可以认为是Keepalived服务的一个实例或者作为一个业务服务,

vrrp_instance VI_1 {

# 表示当前实例VI_1的角色状态,当前角色为MASTER。这个状态只有MASTER和BACKUP两种状态,并且需要大写这些字符。其中MASTER为正式工作状态,BACKUP为备用状态。

# 当MASTER所在的服务器故障或失效时,BACKUP所在的服务器会接管故障的MASTER继续提供服务。

state MASTER

# interface 为网络接口。为对外提供服务的网络接口,如eth0、eth1。

interface eth0

# virtual_router_id为虚拟路由ID标识,这个标识最好是一个数字,并且要在一个keepalived.conf配置中是唯一的。但是MASTER和BACKUP配置中相同实例virtual_router_id又必须是一致的,否则将出现脑裂问题。

virtual_router_id 51

# 优先级,其后面的数值是一个数字,数字越大,表示实例优先级越高。在同一个vrrp_instance实例里,MASTER的优先级配置要高于BACKUP的。若MASTER的priority值为150,那么BACKUP的priority必须小于150,一般建议间隔50以上,例如:设置BACKUP的priority为100 或者更小的数值。

priority 100

# 同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为,秒,默认为1。

advert_int 1

# authentication 为权限认证配置。包含认证类型(auth_type)和认证密码(auth_pass)。认证类型有PASS(Simple Passwd(suggested))、AH(IPSEC(not recommended))两种,官方推荐使用的类型为PASS。验证密码为铭文方式,最好长度不要超过8个字符,建议用4位的数字,同一vrrp实例的MASTER与BACKUP使用相同的密码才能通信。

authentication {

auth_type PASS

auth_pass 1111

}

# 虚拟IP地址。可以配置多个IP地址,每个地址占一行,配置时最好明确指定子网掩码以及虚拟IP绑定的网络接口。否则,子网掩码默认是32位,绑定的接口和前面的interface参数配置的一致。注意,这里的虚拟IP就是在工作中需要和域名绑定的IP,即和配置的高可用服务监听的IP要保持一致。

virtual_ipaddress {

192.168.200.16

192.168.200.17

192.168.200.18

}

}

Keepalived高可用服务搭建测试

通过创建两个lxc ( 操作系统为ubuntu 16.04)进行keepalived的高可用测试,通过本次测试,还发现,lxc也可以用来做keepalived的高可用部署。

实验环境 IP分配
Hostname lxc IP vip
keepalived-ha-test-1 192.168.200.40 172.168.188.40
keepalived-ha-test-2 192.168.200.41

配置文件:

keepalived 配置文件
keepalived-ha-test-1 keepalived-ha-test-2

global_defs {
    notification_email { caihua01@test.com }
    notification_email_from test@test.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 5
    router_id keepalived-ha-test-1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 250
    priority 150
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 1111
    }
    virtual_ipaddress {
       172.168.188.40/32 dev eth0 label eth0:1
    }
}

global_defs {
    notification_email { caihua01@test.com }
    notification_email_from test@test.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 5
    router_id keepalived-ha-test-2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 250
    priority 100
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 1111
    }
    virtual_ipaddress {
      172.168.188.40/32 dev eth0 label eth0:1
    }
}

启动master和backup两个lxc的keepalived服务,发现172.168.188.40,在master(keepalived-ha-test-1)上,(通过ip a,可以观察到),当将master上的keepalived服务停掉,在backup(keepalived-ha-test-2)上执行 ip a 的时候,会发现172.168.188.40在该服务器上。可以通过 watch ip a 命令来观察IP漂移的情况。
遇到一个问题:

May 31 03:38:47 keepalived-ha-test-2 Keepalived_vrrp[878]: (VI_1): ip address associated with VRID 51 not present in MASTER advert : 172.168.188.40

原因:

解决多组keepalived服务器在一个局域网内的冲突问题:

当在同一个局域网内部署了多组keepalived服务对,而又未使用专门的心跳先通信时,可能会发生高可用接管的严重故障问题。
1.VRRP协议默认是通过IP多播的形式实现高可用对之间的通信,如果同一个局域网内存在多组keepalived服务器对,就会造成IP多播地址冲突问题,导致接管错乱,不同组的keepalived都会使用默认的224.0.0.18作为多播地址。
2.局域网内有相同VRID的其他keepalived实例,即,局域网内virtual_router_id有冲突,因为vrrp是通过多播的方式进行方式,进行心跳检测的,且默认多播地址:224.0.0.18。
3.不同实例的通信认证密码也最好不同,以确保接管正常。

解决方案:

1.此时的解决方法是,在同组的keepalived服务器所有配置文件里指定独一无二的多播地址。
global_defs {
    router_id LVS_19
    vrrp_mcast_group4 224.0.0.19  ##指定多播地址的配置 
}
2.修改两个lxc中keepalived的配置文件中的virtual_router_id(我改了一个250),重启keepalived服务后,日志中不在报错。

Keepalived高可用服务器的"脑裂"问题

1.什么是脑裂

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

2.导致脑裂发生的原因

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

  • 心跳线坏了(包括断了,老化)
  • 网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
  • 心跳线间连接的设备故障(网卡及交换机)
  • 仲裁的机器出问题(采用仲裁的方案)

(2)高可用服务器上开启了iptalbes防火墙阻挡了心跳消息传输。

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

(4)其他服务器配置不当等原因,如果心跳方式不同,心跳广播冲突、软件Bug等。

(5)keepalived配置里同一VRRP实例如果virtual_router_id两端参数配置不一致,也会导致脑裂问题发生。

读书笔记-keepalived的高可用相关推荐

  1. 《大型网站技术架构》-读书笔记四:高可用架构

    一.网站可用性的度量与考核 1.可用性度量:通常用多少个9来形容网站的可用性 2.可用性考核:可用性指标是网站架构设计的重要指标,对外是服务承诺,对内是考核指标.  二.高可用的网站架构 三.高可用的 ...

  2. Linux 笔记 - 第十八章 Linux 集群之(三)Keepalived+LVS 高可用负载均衡集群

    一.前言 前两节分别介绍了 Linux 的高可用集群和负载均衡集群,也可以将这两者相结合,即 Keepalived+LVS 组成的高可用负载均衡集群,Keepalived 加入到 LVS 中的原因有以 ...

  3. mysql vip切换未重连问题_改良版本的使用keepalived构建高可用mysql-HA

    最近在折腾一个任务调度系统.作为企业级应用的一部分,HA is a must. 作为一个HA的任务调度系统,丢任务自然是不允许的.因此需要将已提交的任务持久化.MySQL是个比较容易想到的持久化容器. ...

  4. 服务器集群之keepalived配置高可用(资料)

    2019独角兽企业重金招聘Python工程师标准>>> Linux集群概述 • 根据功能划分为两大类:高可用和负载均衡 • 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当 ...

  5. 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

    读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...

  6. Nginx+keepalived 实现高可用,防盗链及动静分离配置

    一.Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含义就是某个URL重写成特定的URL(类似于Redirect),从某种意义上说为了美观或者对搜索引擎友好, ...

  7. 实现基于Keepalived主从高可用集群网站架构

    背景 上一期我们实现了基于lvs负载均衡集群的电商网站架构,随着业务的发展,网站的访问量越来越大,网站访问量已经从原来的1000QPS,变为3000QPS,目前业务已经通过集群LVS架构可做到随时拓展 ...

  8. LVS+keepalived 实现高可用与负载均衡实施方案

    LVS+keepalived 实现高可用与负载均衡实施方案 <Alvin-zeng:孤独0-1> 目录 一.安装LVS1 1.1.环境IP描述:1 1.2.所需软件2 1.3.安装步骤主备 ...

  9. linux集群-keepalived介绍-用keepalived配置高可用集群

    2019独角兽企业重金招聘Python工程师标准>>> linux集群介绍: 以功能划分:高可用和负载均衡 高可用集群:通常为两台服务器,一台工作,另外一台作为冗余.实现高可用的开源 ...

  10. 集群介绍 、keepalived介绍 、 用keepalived配置高可用集群

    集群介绍 根据功能划分为两大类:高可用和负载均衡 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 实现高可用的开源软件有:heartbeat.ke ...

最新文章

  1. (面试)java基础-== 和 equals 的区别?
  2. torch_geometric笔记:nn. graclus (图点分类)
  3. 求二叉树最长路径长度和
  4. 动态添加控件[可重复同一控件]
  5. python测试报告
  6. POJ - 2392 朴素多重背包 + 贪心 WA与AC代码细节分析
  7. 河北大学工商学院计算机分数线,河北大学工商学院录取分数线()
  8. 有多少人乘坐公交车时用NFC付钱?
  9. jquery各种事件使用方法总结(from:天宇之游)
  10. 2021年G2电站锅炉司炉最新解析及G2电站锅炉司炉作业考试题库
  11. 白天不去搜寻痛苦,但晚上却不能抑制
  12. 非功能需求的6种类型
  13. 日本海淘转运运输方式对比及如何选择转运渠道
  14. 高德地图在H5页面中的使用(VUE)
  15. 前、后台网站模板参考
  16. AspectJ的使用方法
  17. 从MapGIS K9到MapGIS 10到MapGIS 10.3 Server
  18. pgsql(PostgreSQL)常用命令行操作
  19. 春招从0到1offer的总结和经验分享
  20. MySQL基础:使用MySQL Workbench生成ER图

热门文章

  1. 9GAG 中用到的 Shimmer 是什么?
  2. Python绘制正态分布图及求分位数
  3. c8网络语言意思,2013年十大网络流行语
  4. Python:常见排列组合问题处理
  5. 德国人的数学题375=1
  6. Java获取本周一、上周一、下周一时间
  7. 打印纸张尺寸换算_各种打印纸的尺寸是多少?
  8. 什么是搜索引擎?有什么作用?
  9. 什么是属性,字段,变量,方法
  10. css inset属性