LAN客户端判定哪个路由器应该为其到达目标主机的下一跳网关的方式有动态及静态决策两种方式,其中,常见的动态路由发现方式有如下几种:
1、Proxy ARP —— 客户端使用ARP协议获取其想要到达的目标,而后,由某路由以其MAC地址响应此ARP请求;
2、Routing Protocol —— 客户端监听动态路由更新(如通过RIP或OSPF协议)并以之重建自己的路由表;
3、ICMP IRDP (Router Discovery Protocol) 客户端 —— 客户端主机运行一个ICMP路由发现客户端程序;

动态路由发现协议的不足之处在于它会导致在客户端引起一定的配置和处理方面的开销,并且,如果路由器故障,切换至其它路由器的过程会比较慢。解决此类问题的一个方案是为客户端静态配置默认路由设备,这大大简化了客户端的处理过程,但也会带来单点故障类的问题。默认网关故障时,LAN客户端仅能实现本地通信。

VRRP可以通过在一组路由器(一个VRRP组)之间共享一个虚拟IP(VIP)解决静态配置的问题,此时仅需要客户端以VIP作为其默认网关即可。

图1显示了一个基本的VLAN拓扑,其中,Router A、B、C共同组成一个VRRP组,其VIP为10.0.0.1,配置在路由器A的物理接口上,因此A为master路由器,B和C为backup路由器。VRRP组中,master(路由器A)负责负责转发发往VIP地址的报文,客户端1、2、3都以此VIP作为其默认网关。一旦master故障,backup路由器B和C中具有最高优先级的路由器将成为master并接管VIP地址,而当原来的master路由器A重新上线时,其将重新成为master路由器。

VRRP是一个“选举”协议,它能够动态地将一个虚拟路由器的责任指定至同一个VRRP组中的其它路由器上,从而消除了静态路由配置的单点故障。

VRRP术语:

VRRP虚拟路由(VRRP router):

VRRP的优势:

冗余:可以使用多个路由器设备作为LAN客户端的默认网关,大大降低了默认网关成为单点故障的可能性;
负载共享:允许来自LAN客户端的流量由多个路由器设备所共享;
多VRRP组:在一个路由器物理接口上可配置多达255个VRRP组;
多IP地址:基于接口别名在同一个物理接口上配置多个IP地址,从而支持在同一个物理接口上接入多个子网;
抢占:在master故障时允许优先级更高的backup成为master;
通告协议:使用IANA所指定的组播地址224.0.0.18进行VRRP通告;
VRRP追踪:基于接口状态来改变其VRRP优先级来确定最佳的VRRP路由器成为master;

IP地址拥有者(IP Address Owner):如果一个VRRP设备将虚拟路由器IP地址作为真实的接口地址,则该设备被称为IP地址拥有者。如果IP地址拥有者是可用的,通常它将成为Master。

配置keepalived为实现haproxy高可用的配置文件示例:

! Configuration File for keepalived

global_defs {
notification_email { br/>linuxedu@foxmail.com
mageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 1
weight 2
}

vrrp_script chk_mantaince_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -2
}

vrrp_instance VI_1 {
interface eth0
state MASTER # BACKUP for slave routers
priority 101 # 100 for BACKUP
virtual_router_id 51
garp_master_delay 1

authentication {  auth_type PASS  auth_pass password
}
track_interface {  eth0
}
virtual_ipaddress {  172.16.100.1/16 dev eth0 label eth0:0
}
track_script {  chk_haproxy  chk_mantaince_down
}  notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"  

}

注意:
1、上面的state为当前节点的起始状态,通常在master/slave的双节点模型中,其一个默认为MASTER,而别一个默认为BACKUP。
2、priority为当关节点在当前虚拟路由器中的优先级,master的优先级应该大于slave的;

下面是一个notify.sh脚本的简单示例:
#!/bin/bash

Author: MageEdu <linuxedu@foxmail.com>

description: An example of notify script

vip=172.16.100.1
contact='root@localhost'

notify() {
mailsubject="hostname to be $1: $vip floating"
mailbody="date '+%F %H:%M:%S': vrrp transition, hostname changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in
master)
notify master
/etc/rc.d/init.d/haproxy start
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/haproxy stop
exit 0
;;
fault)
notify fault
/etc/rc.d/init.d/haproxy stop
exit 0
;;
*)
echo 'Usage: basename $0 {master|backup|fault}'
exit 1
;;
esac

配置keepalived为实现haproxy高可用的双主模型配置文件示例:

说明:其基本实现思想为创建两个虚拟路由器,并以两个节点互为主从。

! Configuration File for keepalived

global_defs {
notification_email { br/>linuxedu@foxmail.com
mageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 1
weight 2
}

vrrp_script chk_mantaince_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight 2
}

vrrp_instance VI_1 {
interface eth0
state MASTER # BACKUP for slave routers
priority 101 # 100 for BACKUP
virtual_router_id 51
garp_master_delay 1

authentication {  auth_type PASS  auth_pass password
}
track_interface {  eth0
}
virtual_ipaddress {  172.16.100.1/16 dev eth0 label eth0:0
}
track_script {  chk_haproxy  chk_mantaince_down
}  notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"  

}

vrrp_instance VI_2 {
interface eth0
state BACKUP # BACKUP for slave routers
priority 100 # 100 for BACKUP
virtual_router_id 52
garp_master_delay 1

authentication {  auth_type PASS  auth_pass password
}
track_interface {  eth0
}
virtual_ipaddress {  172.16.100.2/16 dev eth0 label eth0:1
}
track_script {  chk_haproxy  chk_mantaince_down
}    

}

说明:
1、对于VI_1和VI_2来说,两个节点要互为主从关系;

LVS + keepalived的实现:

! Configuration File for keepalived

global_defs {
notification_email { br/>linuxedu@foxmail.com
mageedu@126.com
}
notification_email_from kanotify@magedu.com
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}

vrrp_script chk_schedown {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 2
weight -2
}

vrrp_instance VI_1 {
interface eth0
state MASTER
priority 101
virtual_router_id 51
garp_master_delay 1

authentication {  auth_type PASS  auth_pass password
}  track_interface {  eth0
}  virtual_ipaddress {  172.16.100.1/16 dev eth0 label eth0:0
}  track_script {  chk_schedown
}    

}

virtual_server 172.16.100.1 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP

sorry_server 192.168.200.200 1358

real_server 172.16.100.11 80 {weight 1HTTP_GET {url { path /status_code 200}connect_timeout 3nb_get_retry 3delay_before_retry 3}
}real_server 172.16.100.12 80 {weight 1HTTP_GET {url { path /status_code 200}connect_timeout 3nb_get_retry 3delay_before_retry 3}
}

}

如果要使用TCP_CHECK检测各realserver的健康状态,那么,上面关于realserver部分的定义也可以替换为如下内容:
virtual_server 172.16.100.1 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 300
protocol TCP

sorry_server 127.0.0.1 80real_server 172.16.100.11 80 {weight 1TCP_CHECK {tcp_port 80connect_timeout 3}
}real_server 172.16.100.12 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3}
}

}

说明:其中的sorry_server是用于定义所有realserver均出现故障时所用的服务器。

keepalived通知脚本进阶示例:

下面的脚本可以接受选项,其中:
-s, --service SERVICE,...:指定服务脚本名称,当状态切换时可自动启动、重启或关闭此服务;
-a, --address VIP: 指定相关虚拟路由器的VIP地址;
-m, --mode {mm|mb}:指定虚拟路由的模型,mm表示主主,mb表示主备;它们表示相对于同一种服务而方,其VIP的工作类型;
-n, --notify {master|backup|fault}:指定通知的类型,即vrrp角色切换的目标角色;
-h, --help:获取脚本的使用帮助;

#!/bin/bash

Author: MageEdu <linuxedu@foxmail.com>

description: An example of notify script

Usage: notify.sh -m|--mode {mm|mb} -s|--service SERVICE1,... -a|--address VIP -n|--notify {master|backup|falut} -h|--help

#contact='linuxedu@foxmail.com'
helpflag=0
serviceflag=0
modeflag=0
addressflag=0
notifyflag=0

contact='root@localhost'

Usage() {
echo "Usage: notify.sh [-m|--mode {mm|mb}] [-s|--service SERVICE1,...] <-a|--address VIP> <-n|--notify {master|backup|falut}>"
echo "Usage: notify.sh -h|--help"
}

ParseOptions() {
local I=1;
if [ $# -gt 0 ]; then
while [ $I -le $# ]; do
case $1 in
-s|--service)
[ $# -lt 2 ] && return 3
serviceflag=1
services=(echo $2|awk -F"," '{for(i=1;i&lt;=NF;i++) print $i}')
shift 2 ;;
-h|--help)
helpflag=1
return 0
shift
;;
-a|--address)
[ $# -lt 2 ] && return 3
addressflag=1
vip=$2
shift 2
;;
-m|--mode)
[ $# -lt 2 ] && return 3
mode=$2
shift 2
;;
-n|--notify)
[ $# -lt 2 ] && return 3
notifyflag=1
notify=$2
shift 2
;;
*)
echo "Wrong options..."
Usage
return 7
;;
esac
done
return 0
fi
}

#workspace=$(dirname $0)

RestartService() {
if [ ${#@} -gt 0 ]; then
for I in $@; do
if [ -x /etc/rc.d/init.d/$I ]; then
/etc/rc.d/init.d/$I restart
else
echo "$I is not a valid service..."
fi
done
fi
}

StopService() {
if [ ${#@} -gt 0 ]; then
for I in $@; do
if [ -x /etc/rc.d/init.d/$I ]; then
/etc/rc.d/init.d/$I stop
else
echo "$I is not a valid service..."
fi
done
fi
}

Notify() {
mailsubject="hostname to be $1: $vip floating"
mailbody="date '+%F %H:%M:%S', vrrp transition, hostname changed to be $1."
echo $mailbody | mail -s "$mailsubject" $contact
}

Main Function

ParseOptions $@
[ $? -ne 0 ] && Usage && exit 5

[ $helpflag -eq 1 ] && Usage && exit 0

if [ $addressflag -ne 1 -o $notifyflag -ne 1 ]; then
Usage
exit 2
fi

mode=${mode:-mb}

case $notify in
'master')
if [ $serviceflag -eq 1 ]; then
RestartService ${services[]}
fi
Notify master
;;
'backup')
if [ $serviceflag -eq 1 ]; then
if [ "$mode" == 'mb' ]; then
StopService ${services[
]}
else
RestartService ${services[]}
fi
fi
Notify backup
;;
'fault')
Notify fault
;;
)
Usage
exit 4
;;
esac

在keepalived.conf配置文件中,其调用方法如下所示:
notify_master "/etc/keepalived/notify.sh -n master -a 172.16.100.1"
notify_backup "/etc/keepalived/notify.sh -n backup -a 172.16.100.1"
notify_fault "/etc/keepalived/notify.sh -n fault -a 172.16.100.1"

global_defs {
notification_email {br/>caaxz-mozz-it02@mail.foxconn.com
caaxz-mozz-it01@mail.foxconn.com
}
notification_email_from mes_keepalived@mozz.com
smtp_server 10.210.98.27
smtp_connect_timeout 30
router_id LVS_DEVEL
}

转载于:https://blog.51cto.com/14044882/2309798

keepalived(haproxy高可用、haproxy高可用双主、lvs+keepalived)相关推荐

  1. mysql双主多从高可用配置_双主MySQL+keepalived高可用配置

    部署双节点双主数据库服务器MySQL 分别在二台服务器上安装mysql,要求同版本或主服务器比从服务器版本高. 主机mysql配置: Vi /etc/my.cnf [mysqld] Log-bin=m ...

  2. Ldap双主模式+keepalived实现ldap高可用

    一.安装OpenLDAP yum install openldap openldap-clients openldap-servers 安装完直接启动 ``` systemctl start slap ...

  3. mysql双主之keepalived

    生产环境中一台mysql主机存在单点故障,所以我们要确保mysql的高可用性,即两台MySQL服务器如果其中有 一台MySQL服务器挂掉后,另外一台能立马接替其进行工作. MySQL的高可用方案一般有 ...

  4. mycat与mysql proxy_高可用Mysql架构_Mycat集群部署(HAProxy + 两台Mycat+Mysql双主双从)...

    既然大家都知道了Mysql分布式在大型网站架构中的作用,在这里就不再阐述.本片博客文章是基于我曾经搭建过的一个Mysql集群基础上实现的,实现过双主热备.读写分离.分库分表. 环境 centos6.4 ...

  5. mysql keepalived双主双活_mysql高可用架构方案之中的一个(keepalived+主主双活)

    Mysql双主双活+keepalived实现高可用 文件夹 1.前言... 4 2.方案... 4 2.1.环境及软件... 4 2.2.IP规划... 4 2.3.架构图... 4 3.安装设置MY ...

  6. Linux 高可用(HA)集群之keepalived详解

    大纲 一.前言 二.Keepalived 详解 三.环境准备 四.LVS+Keepalived 实现高可用的前端负载均衡器 一.前言 这篇文章是前几篇文章的总结,我们先简单的总结一下我们前面讲解的内容 ...

  7. 企业中MySQL高可用集群架构三部曲之MM+keepalived

    各位老铁们,老张与大家又见面了.看到各位在博客里面给我的留言和访问量的情况,我很是欣慰,也谢谢大家对我的认可.我写这些博客,就是想把自己对于MySQL数据库的一些看法和自己平时的实战经验分享出来,我们 ...

  8. mysql 双主 脑裂_MySQL高可用方案——双主

    MySQL高可用方案--双主 发布时间:2020-03-01 20:45:48 来源:51CTO 阅读:253 作者:warrent MySQL的高可用方案有很多种,双主.MHA.MMM等等,这里只是 ...

  9. python mysql 双主_keepalived+mysql双主复制高可用方案

    MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换.而Keepalived通过虚拟IP,实现了 ...

  10. LVS+keepalived构建PXC高可用集群

    2019独角兽企业重金招聘Python工程师标准>>> 1 高可用安装 1.1 集群信息 主机 IP 组件 bdc212 192.168.13.212 LVS:ipvsadm-1.2 ...

最新文章

  1. Blend_ControlTemplate(Z)
  2. 137% YOLOv3加速、10倍搜索性能提升!百度飞桨推出模型压缩神器
  3. rⅰd的意思_计量经济学练习题
  4. Python 全栈开发:python字符串切片
  5. % 在C语言中的用法
  6. 期权数据 获取_我如何免费获得期权数据
  7. python搭配什么数据库_python 连接操作数据库(一)
  8. 异步串行通讯和同步串行通讯对比
  9. LeetCode-Single Number
  10. 心大于物 ----论意识心灵与物理大脑的关系
  11. 用 ASP.NET 管理 IIS(转)
  12. 从实例中学习grid布局
  13. 如何用计算机截部分屏,电脑怎样截长屏_电脑如何长截屏截图-win7之家
  14. 简单C语言小程序:求根公式求一元二次方程式的根!
  15. 接口自动化测试平台,Django“踩坑”之旅(四):“Not Found: /favicon.ico”错误处理
  16. 二阶边值问题的数值解matlab,二阶线性微分方程边值问题的MATLAB求解
  17. 社群裂变工具有哪些?怎么用?微信如何引流客源呢?
  18. 5G来了,室内该如何覆盖?
  19. Integer i1 = 10;和Integer = new Integer(10);的区别
  20. java 有序数组 频率_java基础最全面总结_1

热门文章

  1. Qt 通过条件编译区分Debug和Release代码
  2. 国内奇葩小学数学题横扫推特,老外被难哭了
  3. SDWAN:直接互联网接入 (DIA)
  4. 网易有道校招笔试总结
  5. 下载MySQL历史版本
  6. 魔王逗勇者c语言编程软件,勇者逗魔王游戏下载-勇者逗魔王预约下载 v1.0.5-pc6手游...
  7. Ubuntu18.04 Cmake安装,报错openssl
  8. 天猫代运营公司十大排名
  9. Pandas分组统计函数:groupby、pivot_table及crosstab
  10. Vue与Node.js实现手机短信验证登录