1  Keepalived 原理

VRRP:virtual router redundancy protocol(虚拟路由冗余协议):

在现实的环境中,两台需要通信的主机大多数情况下并没有直接的物理连接,比如没有网线连接。在这时候,他们之间的路由怎么选择,通常解决办法有两种:

Ø  在主机上使用动态路由

Ø  主机上使用静态路由

动态路由并不十分实际,因为管理维护成本以及是否支持等诸多问题,所以配置静态路由就显得十分流行,但是路由器或者默认网关经常是有单点问题,就算配了多个路由,也必须重启网络才生效。

这时候VRRP应运而生。他的作用就是解决路由单点故障问题。它是一种通过竞选的协议动态的将路由任务交给LAN虚拟路由器中某台VRRP路由器。

虚拟路由器:就是并不是实际存在的,是一个逻辑而并非物理的路由,通常有多台物理的VRRP路由器通过某种方式组成就好像这些物理的路由器都丢到一个pool里面,整个pool对外看起来就像是一台路由器,但其实内部有多台,虚拟路由器标志成为VRID.

VRRP路由器:就是一台路由器,物理的。只不过上面运行了VRRPD这样的程序实现了VRRP协议而已,一个VRRP路由器,可以位于多个虚拟路由器下。

Master vs Backup:

在一个VRRP虚拟路由器中,有多台VRRP路由器,但是这多台物理的机器并不同时工作,而是由一台称为Master的负责路由工作,其他的都是备份,Master并非一成不变,VRRP协议让每一个VRRP路由器参与竞选,最终获胜就是Master.Master有一些特权,比如拥有虚拟路由器IP地址,我们主机就是用这个IP进行静态路由的。然后Master还要负责转发发给网关地址的包和响应ARP的请求。

选择规则:

如果对外的虚拟路由器IP就是路由器本身配置的IP地址的话,该路由器始终都是MASTER;
否则如果不具备虚拟IP的话,将进行MASTER选举,各路由器都宣告自己是MASTER,发送VRRP通告信息;
如果收到其他机器的发来的通告信息的优先级比自己高,将转回BACKUP状态;
如果优先级相等的话,将比较路由器的实际IP,IP值较大的优先权高;
不过如果对外的虚拟路由器IP就是路由器本身的IP的话,该路由器始终将是MASTER,这时的优先级值为255。

工作机制:

所有的拣选协议报文都是通过IP 多播功能multicast包(224.0.0.18)形式发送的。

虚拟路由器的VRID由0-255和一组IP组成,对外表现为一个MAC地址:00-00-5E-00-01-${VRID},所以在虚拟路由器中,不管谁是MASTER,对外提供的都是相同的MAC地址和IP地址,这个IP也就是我们所谓的VIP,客户端并不需要因为MASTER的改变而修改自己的路由配置

Keepalived模块介绍:

Core:核心程序,比如有全局配置的解析以及进程的启动

VRRP:vrrpd子进程

Check:healthchekcer子进程目录,包括了所有的健康检查方式以及对应的配置解析,LVS的配置解析也在这里

Libipfwc:iptables库,主要用来配置LVS的firewall-mark

Libipvs*:也是LVS需要用到的

Keepalived采用多进程模式,每一个进程负责不同的功能

ControlPanel: 所谓的控制面板就是对配置文件的编译和解析,并不是一次解析所有的配置,而是   只有用到某个模块的时候才解析相对应的配置。

WatchDog:对子进程vrrpd和healthchecker进行监控

2 Keepalived 的配置详解

2.1全局配置

全局配置包括2个子配置:globaldefinition 和 staticipaddress/

Routes,即全局定义和静态地址路由

全局定义:主要设置keepalived的通知机制标识

global_defs

{

      notification_email

      {

           admin@example.com

      }

      notification_email_from admin@example.com

      smtp_server 127.0.0.1

      stmp_connect_timeout 30

      router_id my_hostname

}

静态地址和路由:

static_ipaddress

{

192.168.1.1/24brd + dev eth0 scope global

192.168.1.2/24brd + dev eth1 scope global

}

static_routes

{

src$SRC_IP to $DST_IP dev $SRC_DEVICE

src$SRC_IP to $DST_IP via $GW dev $SRC_DEVICE

}

2.2VRRPD 配置

也包括2部分,VRRP同步组(synchronizedgroup) 和 VRRPinstance以及VRRP脚本

同步组:不使用同步组,如果机器有2个网段,一个内网一个外网,每一个网段开启一个VRRPinstance,假设VRRP配置为检查内网,那么外网出问题时,VRRPD认为自己仍然健康。就不会进行主备的切换。

vrrp_sync_groupVG_1 {

group{

http

mysql

}

notify_master/path/to/to_master.sh

notify_backup/path_to/to_backup.sh

notify_fault"/path/fault.sh VG_1"

notify/path/to/notify.sh

smtp_alert

}

Notify_master:当切换到master,指定执行的脚本,这个脚本可以传入参数

Notify:有三个参数,$1(GROUP-INSTANCE),$2(group或者 instance名字),$3(MASTER-BACKUP-FAULT)

Smtp_alter:使用global_defs里面定义的邮件地址

VRRP实例配置:

其实就是在上面开启了VRRP协议,这个实例说明了VRRP的一些特性,比如主从,VRID等。主要配置vrrp_sync_group里面每一个组的漂移IP等

vrrp_instancehttp {

stateMASTER

interfaceeth0

dont_track_primary

track_interface{

eth0

eth1

}

mcast_src_ip<IPADDR>

garp_master_delay10

virtual_router_id51

priority100

advert_int1

authentication{

auth_typePASS

autp_pass1234

}

virtual_ipaddress{

#<IPADDR>/<MASK>brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>

192.168.200.17/24dev eth1

192.168.200.18/24dev eth2 label eth2:1

}

virtual_routes{

#src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev<STRING> scope <SCOPE> tab

src192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1

192.168.110.0/24via 192.168.200.254 dev eth1

192.168.111.0/24dev eth2

192.168.112.0/24via 192.168.100.254

}

nopreempt

preemtp_delay300

debug

}

state:state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定,里如果这里设置为master,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为master

interface:实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的

donttrack primary:忽略VRRP的interface错误

trackinterface:跟踪接口,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态,例如,用nginx做均衡器的时候,内网必须正常工作,如果内网出问题了,这个均衡器也就无法运作了,所以必须对内外网同时做健康检查

mcastsrc ip:发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址

garpmaster delay:在切换到master状态后,延迟进行免费的ARP(gratuitousARP)请求

virtualrouter id:这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址

priority100:设置本节点的优先级,优先级高的为master

advertint:检查间隔,默认为1秒

virtualipaddress:这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址

virtualroutes:原理和virtualipaddress一样,只不过这里是增加和删除路由

lvssync daemon interface:lvs syncd绑定的网卡

authentication:这里设置认证
auth type:认证方式,可以是PASS或AH两种认证方式
auth pass:认证密码
nopreempt:设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须别另外的高
preempt delay:抢占延迟
debug:debug级别
notify master:和syncgroup这里设置的含义一样,可以单独设置,例如不同的实例通知不同的管理人员,http实例发给网站管理员,mysql的就发邮件给DBA

VRRP脚本:

vrrp_scriptcheck_running {

script"/usr/local/bin/check_running"

interval 10

weight 10

}

vrrp_instancehttp {

state BACKUP

smtp_alert

interface eth0

virtual_router_id 101

priority 90

advert_int 3

authentication {

auth_type PASS

auth_pass whatever

}

virtual_ipaddress {

1.1.1.1

}

track_script {

check_running weight 20

}

}

首先在vrrp_script区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更
vrrp_script check_running {

script"/usr/local/bin/check_running"

interval 10     #脚本执行间隔

weight 10      #脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10

}

然后在实例(vrrp_instance)里面引用,有点类似脚本里面的函数引用一样:先定义,后引用函数名
track_script {
check_running weight 20
}

注意:VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别

2.3 LVS 配置

如果你没有配置LVS+keepalived那么无需配置这段区域,里如果你用的是nginx来代替LVS,这无限配置这款,这里的LVS配置是专门为keepalived+LVS集成准备的。
注意了,这里LVS配置并不是指真的安装LVS然后用ipvsadm来配置他,而是用keepalived的配置文件来代替ipvsadm来配置LVS,这样会方便很多,一个配置文件搞定这些,维护方便,配置方便是也!

这里LVS配置也有两个配置
一个是虚拟主机组配置
一个是虚拟主机配置

1,虚拟主机组配置文件详解
这个配置是可选的,根据需求来配置吧,这里配置主要是为了让一台realserver上的某个服务可以属于多个VirtualServer,并且只做一次健康检查

virtual_server_group <STRING> {
# VIP port
<IPADDR> <PORT>
<IPADDR> <PORT>
fwmark <INT>
}

2,虚拟主机配置

virtual server可以以下面三种的任意一种来配置:

下面以第一种比较常用的方式来配详细解说一下
1. virtual server IP port

2.virtual server fwmark int

3.virtual server group string

virtual_server 192.168.1.2 80 {                    #设置一个virtual server:VIP:Vport
delay_loop 3                                               # service polling的delay时间,即服务轮询的时间间隔

lb_algo rr|wrr|lc|wlc|lblc|sh|dh                       #LVS调度算法
lb_kind NAT|DR|TUN                                    #LVS集群模式                    
persistence_timeout 120                              #会话保持时间(秒为单位),即以用户在120秒内被分配到同一个后端realserver
persistence_granularity <NETMASK>             #LVS会话保持粒度,ipvsadm中的-M参数,默认是0xffffffff,即每个客户端都做会话保持
protocol TCP                                               #健康检查用的是TCP还是UDP
ha_suspend                                                #suspendhealthchecker’s activity
virtualhost <string>                                     #HTTP_GET做健康检查时,检查的web服务器的虚拟主机(即host:头)

sorry_server <IPADDR> <PORT>                #备用机,就是当所有后端realserver节点都不可用时,就用这里设置的,也就是临时把所有的请求都发送到这里啦

real_server <IPADDR> <PORT>                   #后端真实节点主机的权重等设置,主要,后端有几台这里就要设置几个
{
weight 1                                                      #给每台的权重,0表示失效(不知给他转发请求知道他恢复正常),默认是1
inhibit_on_failure                                          #表示在节点失败后,把他权重设置成0,而不是冲IPVS中删除

notify_up <STRING> | <QUOTED-STRING>  #检查服务器正常(UP)后,要执行的脚本
notify_down <STRING> | <QUOTED-STRING> #检查服务器失败(down)后,要执行的脚本

HTTP_GET                                                  #健康检查方式
{
url {                                                             #要坚持的URL,可以有多个
path /                                                          #具体路径
digest <STRING>                                          
status_code 200                                          #返回状态码
}
connect_port 80                                          #监控检查的端口

bindto <IPADD>                                           #健康检查的IP地址
connect_timeout   3                                     #连接超时时间
nb_get_retry 3                                             #重连次数
delay_before_retry 2                                    #重连间隔
} # END OF HTTP_GET|SSL_GET

#下面是常用的健康检查方式,健康检查方式一共有HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK这些
#TCP方式
TCP_CHECK {
connect_port 80
bindto 192.168.1.1
connect_timeout 4
} # TCP_CHECK

# SMTP方式,这个可以用来给邮件服务器做集群
SMTP_CHECK
host {
connect_ip <IP ADDRESS>
connect_port <PORT>                                   #默认检查25端口
14 KEEPALIVED
bindto <IP ADDRESS>
}
connect_timeout <INTEGER>
retry <INTEGER>
delay_before_retry <INTEGER>
# "smtp HELO"ž|·-ë꧌à"
helo_name <STRING>|<QUOTED-STRING>
} #SMTP_CHECK

#MISC方式,这个可以用来检查很多服务器只需要自己会些脚本即可
MISC_CHECK
{
misc_path <STRING>|<QUOTED-STRING> #外部程序或脚本
misc_timeout <INT>                                  #脚本或程序执行超时时间

misc_dynamic                                             #这个就很好用了,可以非常精确的来调整权重,是后端每天服务器的压力都能均衡调配,这个主要是通过执行的程序或脚本返回的状态代码来动态调整weight值,使权重根据真实的后端压力来适当调整,不过这需要有过硬的脚本功夫才行哦
#返回0:健康检查没问题,不修改权重
#返回1:健康检查失败,权重设置为0
#返回2-255:健康检查没问题,但是权重却要根据返回代码修改为返回码-2,例如如果程序或脚本执行后返回的代码为200,#那么权重这回被修改为 200-2
}
} # Realserver
} # Virtual Server

配置文件到此就讲完了,下面是一份未加备注的完整配置文件

global_defs

{

notification_email

{

admin@example.com

}

notification_email_fromadmin@example.com

smtp_server127.0.0.1

stmp_connect_timeout30

router_idnode1

}

notification_email

{

admin@example.com

admin@ywlm.net

}

static_ipaddress

{

192.168.1.1/24brd + dev eth0 scope global

192.168.1.2/24brd + dev eth1 scope global

}

static_routes

{

src$SRC_IP to $DST_IP dev $SRC_DEVICE

src$SRC_IP to $DST_IP via $GW dev $SRC_DEVICE

}

vrrp_sync_groupVG_1 {

group{

http

mysql

}

notify_master/path/to/to_master.sh

notify_backup/path_to/to_backup.sh

notify_fault"/path/fault.sh VG_1"

notify/path/to/notify.sh

smtp_alert

}

group{

http

mysql

}

vrrp_scriptcheck_running {

script"/usr/local/bin/check_running"

interval 10

weight 10

}

vrrp_instancehttp {

stateMASTER

interfaceeth0

dont_track_primary

track_interface{

eth0

eth1

}

mcast_src_ip<IPADDR>

garp_master_delay10

virtual_router_id51

priority100

advert_int1

authentication{

auth_typePASS

autp_pass1234

}

virtual_ipaddress{

#<IPADDR>/<MASK>brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>

192.168.200.17/24dev eth1

192.168.200.18/24dev eth2 label eth2:1

}

virtual_routes{

#src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev<STRING> scope <SCOPE> tab

src192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1

192.168.110.0/24via 192.168.200.254 dev eth1

192.168.111.0/24dev eth2

192.168.112.0/24via 192.168.100.254

}

track_script{

check_runningweight 20

}

nopreempt

preemtp_delay300

debug

}

virtual_server_group<STRING> {

#VIP port

<IPADDR><PORT>

<IPADDR><PORT>

fwmark<INT>

}

virtual_server192.168.1.2 80 {

delay_loop3

lb_algorr|wrr|lc|wlc|lblc|sh|dh

lb_kindNAT|DR|TUN

persistence_timeout120

persistence_granularity<NETMASK>

protocolTCP

ha_suspend

virtualhost<string>

sorry_server<IPADDR> <PORT>

real_server<IPADDR> <PORT>

{

weight1

inhibit_on_failure

notify_up<STRING> | <QUOTED-STRING>

notify_down<STRING> | <QUOTED-STRING>

#HTTP_GET方式

HTTP_GET| SSL_GET

{

url{

path/

digest<STRING>

status_code200

}

connect_port80

bindto<IPADD>

connect_timeout   3

nb_get_retry3

delay_before_retry2

}

}

}

Keepalived+LVS相关推荐

  1. zabbix 系统搭建(LAMP环境)+keepalived LVS配置

    zabbix 系统搭建(LAMP环境) 先搭建好LAMP环境 (介绍) 安装zabbix监控主机 (设置监控主机ip为192.168.200.130) wget http://repo.zabbix. ...

  2. Linux 高可用(HA)集群之keepalived+lvs

    一:前言 Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);Keepalived的目的是模拟路由器的 ...

  3. Keepalived+LVS+Nginx负载均衡之高可用

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致 ...

  4. Keepalived+lvs+httpd之负载均衡

    2019独角兽企业重金招聘Python工程师标准>>> 最近在研究 负载均衡.目前研究的是keepalived+lvs模式 1.软件介绍 keepalived:顾名思义是保持存活,常 ...

  5. Gentoo下keepalived+LVS实验

    KEEPLIVE+LVS实现高可用服务器集群 Keepalived简介(摘自百度百科) keepalived是一个类似于layer3,4&5交换机制的软件,也就是我们平时说的第3层.第4层和第 ...

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

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

  7. Linux集群架构(下)——DR模式、keepalived+LVS

    2019独角兽企业重金招聘Python工程师标准>>> Linux集群架构(下) 八.DR模式搭建 8.1 准备工作 试验需求三台机器: 分发器,也叫调度器(简写为dir) : 19 ...

  8. keepalived热备 keepalived+LVS Haproxy

    keepalived热备 keepalived概述 调度器出现单点故障,如何解决? keepalived实现了高可用集群 keepalived最初是为了LVS设计的,专门监控个服务器节点的状态 kee ...

  9. ​十六周一次课(4月11日) 学习完成 18.11 LVS DR模式搭建 18.12 keepalived + LVS

    2019独角兽企业重金招聘Python工程师标准>>> 18.11 LVS DR模式搭建 准备工作:三台机器 分发器,也叫调度器(简写为dir) 192.134 rs1 192.13 ...

  10. LVS DR模式搭建,keepalived + LVS

    2019独角兽企业重金招聘Python工程师标准>>> LVS DR模式搭建 准备工作 三台机器,只需要有公网IP 分发器,也叫调度器(简写为dir)IP:192.168.133.1 ...

最新文章

  1. 在Linux上利用python获取本机ip
  2. linux下获取硬盘使用情况
  3. 安卓问题总结一(The connection to adb is down)
  4. JS中有两种自加法操作
  5. excel报表服务器作用,Excel各种图表的应用范围及用途介绍
  6. 微型计算机c560,2010广东省计算机等级考试试题 二级C试题最新考试试题库
  7. VFP访问外部数据源的几种方法
  8. ansys--workbench(导入solidworks)受力分析
  9. c语言生成二进制文件的步骤,C语言入门教程-二进制文件
  10. Java实现:冒泡排序
  11. 商务与经济统计_电子商务类北大核心期刊目录大汇总!(推荐收藏!)
  12. webgis、gis学习技巧总结
  13. Hangfire详解
  14. 具有硬件依赖性的计算机语言,具有硬件依赖性的计算机语言,被称为低级语言。下列哪些是低级语言?...
  15. OPC是什么意思?OPC Server 和OPC Client又有什么区别呢?
  16. 淘宝客如何通过闲鱼引流?淘宝客、闲鱼营销推广方式有哪些?
  17. Spline算法实现
  18. 补齐AI人才短板!百度飞桨师资培训高校行走进天津大学
  19. 关于聚合函数配合groupby一起使用
  20. 为何巴菲特和马斯克站在了一起?

热门文章

  1. c语言在单行文本上删除子串,一道比较简单的题——PTA基础编程题目集 7-29 删除字符串中的子串 C语言试解-Go语言中文社区...
  2. Java虚拟机(九)——方法区
  3. 处理多维特征的输出(糖尿病数据)
  4. 神舟笔记本触摸板驱动_关闭笔记本触摸板的四种方法
  5. mybatis mysql uuid_spring boot整合mybatis利用Mysql实现主键UUID的方法
  6. php数据库的值嵌入input_求助:问个关于用INPUT提取数据库里的值然后修改的问题。...
  7. 插入顶部_最快速地把同一内容插入到Word文档不同页面的相同位置
  8. deepin8、9安装docker并添加用户,解决报错:aptsources.distro.NoDistroTemplateException
  9. android没有界面app,Android离线打包 app处于原生界面 切换到桌面再点击app 原生界面被关闭...
  10. 怎么用计算机搜索文件,Win7系统如何使用内置搜索功能筛选文件名与内容