keepalived
keepalived
1 简介
Keepalived是基于vrrp协议的一款高可用软件。Keepailived有一台主服务器和多台备份服务器,在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟IP地址对外提供服务,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器。
VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议),VRRP是为了解决静态路由的高可用。
VRRP的基本架构
虚拟路由器由多个路由器组成,每个路由器都有各自的IP和共同的VRID(0-255),其中一个VRRP路由器通过竞选成为MASTER,占有VIP,对外提供路由服务,其他成为BACKUP,MASTER以IP组播(组播地址:224.0.0.18)形式发送VRRP协议包,与BACKUP保持心跳连接,若MASTER不可用(或BACKUP接收不到VRRP协议包),则BACKUP通过竞选产生新的MASTER并继续对外提供路由服务,从而实现高可用。
2 VRRP相关知识
2.1 vrrp协议的相关术语
虚拟路由器:Virtual Router
虚拟路由器标识:VRID(0-255)
物理路由器:
master :主设备
backup :备用设备
priority:优先级
VIP:Virtual IP
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
GraciousARP
2.2 安全认证:
简单字符认证、HMAC机制,只对信息做认证
MD5(leepalived不支持)
2.3 工作模式:
主/备:单虚拟路径器;
主/主:主/备(虚拟路径器),备/主(虚拟路径器)
2.4 工作类型:
抢占式:当出现比现有主服务器优先级高的服务器时,会发送通告抢占角色成为主服务器
非抢占式:
3 keepalived
3.1 工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
大致如下:
1.利用VRRP协议进行主备通信。组播224.0.0.18
2.利用VRRP协议进行主备竞选,产生VIP
3.利用VRRP协议主向备发送组播包,发送明文信息。当备服务器接收不到主服务器的组播包,就会认为主出现故障,主动接管资源
4.当主恢复时,根据配置决定是否抢占备服务器资源
3.2 核心组件
vrrp stack:vrrp协议的实现
ipvs wrapper:为集群内的所有节点生成IPVS规则
checkers:对IPVS集群的各RS做健康状态检测
控制组件:配置文件分析器,用来实现配置文件的分析和加载
IO复用器
内存管理组件,用来管理keepalived高可用是的内存管理
注意:
1.各节点时间必须同步
2.确保各节点的用于集群服务的接口支持MULTICAST通信(组播);
3.3 安装
从CentOS 6.4开始keepalived随系统base仓库提供,可以使用yun -y install keepalived安装。
3.4 配置文件
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
提供校验码:/usr/bin/genhash
Unit File:keepalived.service
Unit File的环境配置文件:/etc/sysconfig/keepalived
3.5 配置文件详解
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
3.5.1 global_defs区域
主要是配置故障发生时的通知对象以及机器标识
global_defs {
#故障发生时给谁发邮件通知
notification_email {
a@abc.com
b@abc.com
...
}
#通知邮件从哪个地址发出。
notification_email_from alert@abc.com
#通知邮件的smtp地址
smtp_server smtp.abc.com
#连接smtp服务器的超时时间
smtp_connect_timeout 30
#开启SNMP陷阱
enable_traps
#标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到
router_id host163
}
3.5.2 static_ipaddress和static_routes区域
static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置
static_ipaddress {
# /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
10.210.214.163/24 brd 10.210.214.255 dev eth0
...
}
static_routes {
# /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
# /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0
10.0.0.0/8 via 10.210.214.1 dev eth0
...
}
注意: 请忽略这两个区域,因为我坚信你的机器肯定已经配置了IP和路由
3.5.3 vrrp_script区域
用来做健康检查的,当时检查失败时会将vrrp_instance
的priority
减少相应的值。
vrrp_script chk_http_port {
script "</dev/tcp/127.0.0.1/80"
interval 1
weight -10
}
以上意思是如果script
中的指令执行失败,那么相应的vrrp_instance
的优先级会减少10个点。
3.5.4 vrrp_instance和vrrp_sync_group区域
vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。
vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:
两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。
vrrp_sync_group VG_1 {
group {
inside_network # name of vrrp_instance (below)
outside_network # One for each moveable IP.
...
}
#切换为主执行的脚本
notify_master /path/to_master.sh
#切换为备执行的脚本
notify_backup /path/to_backup.sh
#出错时执行的脚本
notify_fault "/path/fault.sh VG_1"
#任何状态切换都会调用的脚本
notify /path/notify.sh
#表示是否开启邮件通知(用全局区域的邮件设置来发通知)。
smtp_alert
}
vrrp_instance VI_1 {
#可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
state MASTER
#节点固有IP(非VIP)的网卡,用来发VRRP包。
interface eth0
#是否使用VRRP的虚拟MAC地址。
use_vmac <VMAC_INTERFACE>
#忽略VRRP网卡错误。(默认未设置)
dont_track_primary
#监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)
track_interface {
eth0
eth1
}
#修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的)
mcast_src_ip <IPADDR>
#绑定lvs syncd的网卡
lvs_sync_daemon_interface eth1
#当切为主状态后多久更新ARP缓存,默认5秒。
garp_master_delay 10
#取值在0-255之间,用来区分多个instance的VRRP组播。可以用这条命令来查看该网络中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8
virtual_router_id 1
#用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)。
priority 100
#发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。
advert_int 1
# 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
authentication {
auth_type PASS
auth_pass 12345678
}
#vip
virtual_ipaddress {
10.210.214.253/24 brd 10.210.214.255 dev eth0
192.168.1.11/24 brd 192.168.1.255 dev eth1
}
#虚拟路由,当IP漂过来之后需要添加的路由信息。
virtual_routes {
172.16.0.0/12 via 10.210.214.1
192.168.1.0/24 via 192.168.1.1 dev eth1
default via 202.102.152.1
}
track_script {
chk_http_port
}
#允许一个priority比较低的节点作为master,即使有priority更高的节点启动。首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。
当使用track_script时可以不用加nopreempt,只需要加上preempt_delay 5,这里的间隔时间要大于vrrp_script中定义的时长。
nopreempt
#master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt
选项。
preempt_delay 300
debug
notify_master <STRING>|<QUOTED-STRING>
notify_backup <STRING>|<QUOTED-STRING>
notify_fault <STRING>|<QUOTED-STRING>
notify <STRING>|<QUOTED-STRING>
smtp_alert
}
3.5.5 virtual_server_group和virtual_server区域
virtual_server IP Port {
#延迟轮询时间(单位秒)。
delay_loop <INT>
#后端调试算法(load balancing algorithm)。
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
lb_kind NAT|DR|TUN
persistence_timeout <INT>
persistence_granularity <NETMASK>
protocol TCP
ha_suspend
#用来给HTTP_GET和SSL_GET配置请求header的。
virtualhost <STRING>
alpha
omega
quorum <INT>
hysteresis <INT>
quorum_up <STRING>|<QUOTED-STRING>
quorum_down <STRING>|<QUOTED-STRING>
#当所有real server宕掉时,sorry server顶替。
sorry_server <IPADDR> <PORT>
#真正提供服务的服务器。
real_server <IPADDR> <PORT> {
#权重
weight <INT>
inhibit_on_failure
#当real server宕掉或启动时执行的脚本
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
# HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK#健康检查的方式
HTTP_GET|SSL_GET {
url {
#请求real serserver上的路径
path <STRING>
# Digest computed with genhash分别表示用genhash算出的结果和http状态码
digest <STRING>
status_code <INT>
}
#健康检查,如果端口通则认为服务器正常。
connect_port <PORT>
#分别表示超时时长、重试次数,下次重试的时间延迟。
connect_timeout <INT>
nb_get_retry <INT>
delay_before_retry <INT>
}
}
}
3.6 配置
3.6.1 主配置文件详解
! Configuration File for keepalived
global_defs {
notification_email { #发送报警邮件收件地址
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #指明报警邮件的发送地址
smtp_server 192.168.200.1 #邮件服务器地址
smtp_connect_timeout 30 #smtp的超时时间
router_id LVS_DEVEL #物理服务器的主机名
vrrp_mcast_group4 #定义一个组播地址
static_ipaddress
{
192.168.1.1/24 dev eth0 scope global
}
static_routes
{
192.168.2.0/24 via 192.168.1.100 dev eth0
}
}
vrrp_sync_group VG_1 { #定义一个故障组,组内有一个虚拟路由出现故障另一个也会一起跟着转移,适用于LVS的NAT模型。
group {
VI1 # name of vrrp_instance (below)
VI2 # One for each moveable IP
}
}
vrrp_instance VI_1 { #定义一个虚拟路由
state MASTER|BACKUP #当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;
interface eth0 #绑定为当前虚拟路由器使用的物理接口;
virtual_router_id 51 #当前虚拟路由器的惟一标识,范围是0-255;
priority 100 #当前主机在此虚拟路径器中的优先级;范围1-254;
advert_int 1 #通告发送间隔,包含主机优先级、心跳等。
authentication { #认证配置
auth_type PASS #认证类型,PASS表示简单字符串认证
auth_pass 1111 #密码,PASS密码最长为8位
virtual_ipaddress {
192.168.200.16 #虚拟路由IP地址,以辅助地址方式设置
192.168.200.18/24 dev eth2 label eth2:1 #以别名的方式设置
}
track_interface {
eth0
eth1
} #配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;
nopreempt #定义工作模式为非抢占模式;
preempt_delay 300 #抢占式模式下,节点上线后触发新选举操作的延迟时长;
virtual_routes { #配置路由信息,可选项
# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> [or <IPADDR>] dev <STRING> scope
<SCOPE> tab
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
192.168.112.0/24 via 192.168.100.254 192.168.113.0/24 via 192.168.200.254 or 192.168.100.254 dev eth1 blackhole 192.168.114.0/24
}
notify_master <STRING>|<QUOTED-STRING> #当前节点成为主节点时触发的脚本。
notify_backup <STRING>|<QUOTED-STRING> #当前节点转为备节点时触发的脚本。
notify_fault <STRING>|<QUOTED-STRING> #当前节点转为“失败”状态时触发的脚本。
notify <STRING>|<QUOTED-STRING> #通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知。
smtp_alert #如果加入这个选项,将调用前面设置的邮件设置,并自动根据状态发送信息
}
virtual_server 192.168.200.100 443 { #LVS配置段 ,设置LVS的VIP地址和端口
delay_loop #服务轮询的时间间隔;检测RS服务器的状态。
lb_algo rr #调度算法,可选rr|wrr|lc|wlc|lblc|sh|dh。
lb_kind NAT #集群类型。
nat_mask 255.255.255.0 #子网掩码,可选项。
persistence_timeout 50 #是否启用持久连接,连接保存时长
protocol TCP #协议,只支持TCP
sorry_server <IPADDR> <PORT> #备用服务器地址,可选项。
real_server 192.168.201.100 443 { #配置RS服务器的地址和端口
weight 1 #权重
SSL_GET { #检测RS服务器的状态,发送请求报文
url {
path / #请求的URL
digest ff20ad2481f97b1754ef3e12ecd3a9cc #对请求的页面进行hash运算,然后和这个hash码进行比对,如果hash码一样就表示状态正常
status_code <INT> #判断上述检测机制为健康状态的响应码,和digest二选一即可。
} #这个hash码可以使用genhash命令请求这个页面生成
connect_timeout 3 #连接超时时间
nb_get_retry 3 #超时重试次数
delay_before_retry 3 #每次超时过后多久再进行连接
connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求
connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求
bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址;
bind_port <PORT> #发出健康状态检测请求时使用的源端口;
}
}
}
3.6.2 健康状态检测机制
HTTP_GET
SSL_GET
TCP_CHECK
SMTP_CHECK
MISS_CHECK #调用自定义脚本进行检测
4 实现LVS高可用集群
4.1 实验简介
虚拟IP:192.168.166.100
CentOS 7.3 主服务器, IP:192.168.166.130
CentOS 7.3-1 备份服务器,IP:192.168.166.132
CentOS 6.9 IP:192.168.166.129
CentOS6.9-1 IP:192.168.166.131
4.2 主调度器配置
[root@CentOS7.3 ~]#yum -y install keepalived ipvsadm #安装keepalived和LVS管理软件ipvsadm
[root@CentOS7.3 ~]#vim /etc/keepalived/keepalived.conf #配置keepalived
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1 #邮件服务器的地址
smtp_connect_timeout 30
router_id CentOS7.3 #主调度器的主机名
vrrp_mcast_group4 224.26.1.1 #发送心跳信息的组播地址
}
vrrp_instance VI_1 {
state MASTER #主调度器的初始角色
interface eth0 #虚拟IP工作的网卡接口
virtual_router_id 66 #虚拟路由的ID
priority 100 #主调度器的选举优先级
advert_int 1
authentication {
auth_type PASS #集群主机的认证方式
auth_pass 123456 #密钥,最长8位
}
virtual_ipaddress {
192.168.166.100 #虚拟IP
}
}
virtual_server 192.168.166.100 80 { #LVS配置段,VIP
delay_loop 6
lb_algo rr #调度算法轮询
lb_kind DR #工作模式DR
nat_mask 255.255.255.0
# persistence_timeout 50 #持久连接,在测试时需要注释,否则会在设置的时间内把请求都调度到一台RS服务器上面
protocol TCP
sorry_server 127.0.0.1 80 #Sorry server的服务器地址及端口
#Sorry server就是在后端的服务器全部宕机的情况下紧急提供服务。
real_server 192.168.166.129 80 { #RS服务器地址和端口
weight 1 #RS的权重
HTTP_GET { #健康状态检测方法
url {
path /
status_code 200 #状态判定规则
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.166.131 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
[root@CentOS7.3 keepalived]#systemctl start keepalived #启动keepalived
[root@CentOS7.3 keepalived]#ip a l eth0 #查看虚拟路由绑定的网卡
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:b9:7d:cb brd ff:ff:ff:ff:ff:ff
inet 192.168.166.130/24 brd 192.168.166.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.166.100/32 scope global eth0 #虚拟IP已经绑定在了eth网卡上
valid_lft forever preferred_lft forever
inet6 fe80::50fe:a3f3:83a0:d38a/64 scope link
valid_lft forever preferred_lft forever
4.3 备份调度器的配置
[root@centos7.3-1 ~]#yum -y install keepalived ipvsadm
[root@centos7.3-1 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id CentOS7.3-1 #备份调度器的主机名
vrrp_mcast_group4 224.26.1.1 #这个组播地址需与集群内的其他主机相同
}
vrrp_instance VI_1 {
state BACKUP #初始角色,备份服务器需设置为BACKUP
interface eth0
virtual_router_id 66 #虚拟路由的ID一定要和集群内的其他主机相同
priority 90 #选举优先级,要比主调度器地一些
advert_int 1
authentication {
auth_type PASS
auth_pass 123456 #密钥需要和集群内的主服务器相同
}
virtual_ipaddress {
192.168.166.100
}
}
#余下配置和主服务器相同
virtual_server 192.168.166.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.166.129 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.166.131 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
[root@centos7.3-1 ~]#systemctl start keepalived #启动备份keepalived
[root@centos7.3-1 ~]#ip a l eth0 #查看虚拟路由绑定的网卡接口
[root@centos7.3-1 ~]#ip a l eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:7e:ec:ef brd ff:ff:ff:ff:ff:ff
inet 192.168.166.132/24 brd 192.168.166.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::9aab:52b3:cc1e:fbef/64 scope link
valid_lft forever preferred_lft forever
4.4 RS1、RS2配置
[root@CentOS6.9 ~]#yum -y install httpd #安装httpd服务
[root@CentOS6.9 ~]#vim lvs.sh #创建一个配置脚本
#!/bin/bash
vip=192.168.166.100 #VIP地址
mask=255.255.255.255
dev=eth0:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask broadcast $vip up
route add -host $vip dev $dev
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
[root@CentOS6.9 ~]#bash lvs.sh start
[root@CentOS6.9 ~]#ip a l eth0:0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:23:38:c9 brd ff:ff:ff:ff:ff:ff
inet 192.168.166.129/24 brd 192.168.166.255 scope global eth0
inet 192.168.166.100/32 brd 192.168.166.100 scope global eth0:1
inet6 fe80::20c:29ff:fe23:38c9/64 scope link
valid_lft forever preferred_lft forever
[root@CentOS6.9 ~]#echo WebServer1 > /var/www/html/index.html
[root@CentOS6.9 ~]#cat /var/www/html/index.html
WebServer1
[root@CentOS6.9 ~]#service httpd start
5 双主LVS高可用集群
5.1 主调度器配置
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id CentOS7.3
vrrp_mcast_group4 224.26.1.1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.166.100
}
}
virtual_server 192.168.166.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.166.129 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.166.131 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
#第二套虚拟路由
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 88 #ID不要和第一套虚拟路由相同
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.166.200
}
}
virtual_server 192.168.166.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.166.129 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.166.131 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
5.2 RS配置
#!/bin/bash
vip=192.168.166.100
mask=255.255.255.255
dev=eth0:1
vip2=192.168.166.200 #添加一个VIP2
mask2=255.255.255.255
dev2=eth0:2 #再添加一个eth0:2别名
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask broadcast $vip up
ifconfig $dev2 $vip2 netmask $mask2 broadcast $vip2 up #设置地址
route add -host $vip dev $dev
route add -host $vip2 dev $dev2
;;
stop)
ifconfig $dev down
ifconfig $dev2 down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
6 另一个简单配置
###########lb03###########
global_defs {
router_id LVS_03
}
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.13/24
}
}
virtual_server 10.0.0.13 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 10.0.0.17 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.0.0.18 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
###########lb04###########
global_defs {
router_id LVS_04
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.13/24
}
}
virtual_server 10.0.0.13 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 10.0.0.17 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.0.0.18 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
在web03/web04同时操作下面步骤
步骤1:在lo网卡绑定VIP地址(ip)
步骤2:修改内核参数抑制ARP响应
ip addr add 10.0.0.13/32 dev lo
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
7 其他
实现监听本地网卡上没有的IP地址
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
sysctl -p