Keepalived+LVS
来源:互联网 发布:阿里云 招聘 安全 编辑:程序博客网 时间:2024/06/05 06:57
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
}
}
}
- LVS+Keepalived
- lvs keepalived
- LVS+keepalived
- lvs+keepalived
- lvs+keepalived
- LVS+keepalived
- LVS+keepalived
- LVS+Keepalived
- keepalived+lvs
- lvs+keepalived
- keepalived+lvs
- keepalived + LVS
- keepalived+lvs
- Keepalived+lvs
- LVS+Keepalived
- Keepalived+LVS
- Keepalived+LVS | Keepalived+Nginx
- LVS+keepalived keepalived.conf配置
- MySQL 学习笔记本2——SQL 语句
- Go并发编程之协程
- ENVI教程:InSAR技术,相位解缠
- Python批量导入图片生成能治疗颈椎病的HTML5版课件
- hibernate学习教程一相关配置
- Keepalived+LVS
- Object类的哪些方法?
- 怎么在spring官网上下载spring的jar包, 源代码和文档?
- linux 环境配置虚拟主机
- 程序猿必定会爱上的十款软件
- Spring Cloud分布式微服务云架构源码结构
- 关于wpf的date binding的绑定失败错误信息输出格式
- Java【集合系列】-02-Collection架构
- 数据结构<十>: 线程结构 栈的两种实现