VRRP协议及Keepalived原理使用
VRRP 协议即 Virtual Router Redundancy Protocol,虚拟路由器冗余协议, 为了解决局域网内默认网关单点失效的问题.
VRRP 将局域网内的一组路由器组成一个虚拟路由器组,每个路由器都有自己的局域网地址, 根据设置的优先级最高决定那个是master路由器,
然后网关地址赋给该主路由器, 该主路由器定时发送VRRP报文向虚拟路由器组公布健康状况, 备份的路由器根据柏爱文判断Master路由器是否工作正常,从而决定是否要接替它. VRRP说白了就是实现IP地址漂移的,是一种容错协议。在下图中,Router A(10.100.10.1)、Router B(10.100.10.2)和Router C(10.100.10.3) 组成一个虚拟路由器。各虚拟路由器都有自己的IP地址。局域网内的主机将虚拟路由器设置为缺省网关。 Router A、Router B和Router C中优先级最高的那台路由器作为Master路由器,比如A,承担网关的功能。局域网内的服务 只知道这台主master路由器A的存在,将自己缺省路由下一跳地址设置为该路由的ip地址10.100.10.1, 其余两台路由器作为Backup路由器。当master路由器出故障后, backup路由器会根据优先级重新选举出新的master路由器承担网关功能。Master路由器周期性地发送VRRP报文, 在虚拟路由器中公布其配置信息(优先级等)和工作状况。Backup路由器通过接收到VRRP报文的情况来判断Master路由器是否工作工常。
而keepalived 使用的就是VRRP协议, 不过它作用在多台主机上, 而不是路由器组上.
比如我们现在准备搭建的配置:
主机: 192.168.0.7
从机: 192.168.0.8
vip虚拟主机: 192.168.0.12
访问的时候我们的地址都填 192.168.0.12, 由它决定目前绑定在那个网卡上就由那台机器进行服务, 如果刚好服务的这台机器挂了,它就会绑定到下一台正常的机器的网卡上去,由新机器处理请求,由此实现高可用和避免单点故障.
|--- 13 web机
|---- 07转发(ng) ---- |--- 14 go程序
| |--- 15 php-cgi
请求 --> 12-|
|
|---- 08 (时刻待命取代07)
(1)keepalived简介
keepalived使用的是VRRP协议方式。简单的说就是,Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。
keepalived是模块化设计,不同模块负责不同的功能,下面是keepalived的组件 :
@1. core 模块
是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等 。
@2. check模块
负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析 。
@3. vrrp模块
VRRPD子进程,VRRPD子进程就是来实现VRRP协议的 。
@4. libipfwc模块
iptables(ipchains)库,配置LVS会用到 。
@5. libipvs* 模块
配置LVS会用到 。
备注:keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已。 keeplived 是检测机器的健康状况, 发现病体机器将其移除, lvs 是实现多台机器都均衡处理请求.
keepalived 开始搭建
在主从机器上各自安装好keeepalived
下载链接: http://www.keepalived.org/download.html
或者 wget http://www.keepalived.org/software/keepalived-2.0.2.tar.gz
然后解压进入目录执行安装三板斧
./configure --prefix=/usr/local/keepalived && make && make install
编辑配置文件
mkdir /etc/keepalived -p #新建配置目录
#复制默认配置到/etc/keepalived 目录去(别拼错,否则默认加载失败的,到时程序都起不来就只能用-f指定配置路径了)
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然后编辑配置文件
vim /usr/local/etc/keepalived/keepalived.conf
内容如下:(只保留这两节即可,其他的是lvs的配置的,暂时去掉)
! 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
router_id NodeA #节点名,唯一,08可以叫NodeB
#vrrp_strict #把这王八蛋注释掉,不然严格遵守vvrp协议,访问不了vip的
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #名字唯一,主机07填MASTER,从机08填BACKUP
interface eth0 #网卡名,跟你机器对应上
virtual_router_id 51 #主从机器保持统一
priority 150 #设置主机的值大于从机即可
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 #不动
}
virtual_ipaddress {
192.168.0.12/24
#你要的虚拟ip的地址,自己填一个,别填已经使用的即可.(填不填子网号24看你,本人亲测有没有都ok,之所以填写是因为执行ip a 查看到eth0网卡上也有192.168.0.7/24 字样)
}
}
上面各自按照要求都配置好后执行启动:
/usr/local/keepalived/sbin/keepalived -D
如果指定配置文件路径可以使用-f: /usr/local/keepalived/sbin/keepalived -D -f /tmp/keepalived.conf
查看运行
@1.使用ip a 命令查看网卡绑定的详细信息, ifconfig只会显示默认的那个,不显示其他的绑定
[root@07 keepalived]# ip a
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1c:42:dc:15:9a brd ff:ff:ff:ff:ff:ff
inet 192.168.0.7/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.0.12/24 scope global secondary eth0 <--- 看12也在这个网卡下
valid_lft forever preferred_lft forever
inet6 fe80::21c:42ff:fedc:159a/64 scope link
valid_lft forever preferred_lft forever
@2. 两台主机的keepalived都检查运行后, 在192.168.0.3 上(或局域网内的任意一台机器上)运行下 arp -an (扫描查看以太网内所有主机的mac信息)
PS:不要在主从机上执行, 因为不完整,不会显示vip的信息的
➜ ~ arp -an
? (192.168.0.1) at a4:56:2:92:c2:73 on en0 ifscope [ethernet]
? (192.168.0.7) at 0:1c:42:dc:15:9a on en0 ifscope [ethernet]
? (192.168.0.8) at 0:1c:42:c0:7a:40 on en0 ifscope [ethernet]
? (192.168.0.12) at 0:1c:42:dc:15:9a on en0 ifscope [ethernet]
? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]
可看到 12机器后面的mac地址跟07的是一样的, 这说明192.168.0.12这个vip也绑定到跟07一个共同网卡上了.
然后在07上查看日志, keepalived 日志在 /var/log/message 里
[root@07 keepalived]# tail -f /var/log/messages
Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12
Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12
Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12
Jun 15 16:28:20 07 Keepalived_vrrp[1716]: Sending gratuitous ARP on eth0 for 192.168.0.12
由上提示意思是 各位以太网小伙伴们注意了 192.168.0.12 的mac地址在我的网卡上,你们来这找它啊!
如果都OK 了, 那么在以太网内任意机器上 ping 一下vip地址, 如果能ping通, 并且主从机也能ping通, 基本就没问题了.
[root@08 keepalived]# ping 192.168.0.12
PING 192.168.0.12 (192.168.0.12) 56(84) bytes of data.
64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=0.327 ms
64 bytes from 192.168.0.12: icmp_seq=2 ttl=64 time=0.577 ms
运行测试
然后在主从机器上各自搭建ng+php访问,
curl http://192.168.0.8/index.php 的输出内容为 "i am 08";
curl http://192.168.0.7/index.php 的输出内容为 "i am 07";
都能访问的话, 用vip地址来访问, 因为现在vip绑定的是07的网卡,因此应该也输出"i am 07"
curl http://192.168.0.12/index.php #输出 "i am 07" , 非常成功.
现在我把07机器关掉, 再其他机器上用arp -an 查看局域网内的mac信息
➜ ~ arp -an
? (192.168.0.1) at a4:56:2:92:c2:73 on en0 ifscope [ethernet]
? (192.168.0.7) at 0:1c:42:dc:15:9a on en0 ifscope [ethernet]
? (192.168.0.8) at 0:1c:42:c0:7a:40 on en0 ifscope [ethernet]
? (192.168.0.12) at 0:1c:42:c0:7a:40 on en0 ifscope [ethernet]
? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]
对比下上面的,发现12地址的mac信息, 立马绑定成跟08的mac地址一样了, 说明现在它们共用网卡了,避免了单点故障.
再次访问
➜ ~ curl http://192.168.0.12/index.php
i am 08 ...
vip成功转移到192.168.0.8这台机器上,于是keepalived成功了.
--> PS: 一旦ping不通(dns的问题我不管)首先把看下是否去掉了配置文件里的 vrrp_strict [它表严格执行vvrp协议,还不行再把防火墙搞掉], 否则搞死你半天都不知咋回事.
在有“vrrp_strict”的时候,就会有下面的iptables规则:
[root@centos ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 0.0.0.0/0 192.168.111.130
把这个选项去掉了之后,重新启动keepalived就完全没有了。
附上即是通知以太网内vip更新mac信息的指令
说不定arp开启了缓存, 你ping不通的原因可能也是这个, 因此主动向局域网内的成员推送12这台新增vip的mac信息
arping -c 5 -U -I eth0 192.168.1.12
-c 表示要发多少个广播包。
-U 非请求模式,更新同网段设备上的arp缓存。
-I 通过哪个接口发送数据包,这个会使用到这个网卡的mac的地址。