keepalived基于双主模型实现nginx的高可用(2)
Keepalived:keepalived是基于vrrp协议实现的一个高可用集群解决方案,可以利用keepalived来解决单点故障问题,使用keepalived实现的高可用集群方案中,一般有两台服务器,一个是MASTER(主服务器),另一个是BACKUP(备用服务器),这个集群中对外提供一个虚拟IP,MASTER服务器会定时发送特定信息给BACKUP服务器,当BACKUP服务器接收不到MASTER发送的消息时,BACKUP服务器会接管虚拟IP,继续提供服务。
当keepalived基于主备模式实现高可用时,提供服务的只有一台主服务器,备服务器只有在主服务器出现故障时才能提供作用,这就造成了资源的浪费,所以keepalived可以通过实现双主模式来实现资源的利用。两台服务器都对外提供服务,并且当一台服务器出现故障时,这台IP地址就会转移到另外一台服务器上,继续提供服务。
keepalived双主模式图:
http://blog.运维网.com/e/u261/themes/default/images/spacer.gifhttp://s3.运维网.com/wyfs02/M01/80/20/wKioL1c5M3SS8z0JAABhKamIr2w209.jpg
实验准备:
1、虚拟机 172.18.250.75 反向代理服务器
2、虚拟机 172.18.250.76 反向代理服务器
3、虚拟机 172.18.250.77 Web服务器
4、虚拟机 172.18.250.79 Web服务器
注意:iptables和selinux不会影响keepalived,两台服务时间要同步
一、安装keepalived服务
~]# yum -y install keepalived 编辑配置文件/etc/keepalived/keepalived.conf
~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.74.18
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 151
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.250.99 dev eth0 label eth0:0
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 152
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
172.18.250.100 dev eth0 label eth0:1
}
} 另一台上面也配置相同的文件(250.76)
~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.74.18
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 151
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.250.99 dev eth0 label eth0:0
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 152
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
172.18.250.100 dev eth0 label eth0:1
}
} 配置完后启动keepalived服务:
]# service keepalived start
Starting keepalived:
]# ifconfig
eth0:0 Link encap:EthernetHWaddr 00:0C:29:C5:A4:6B
inet addr:172.18.250.99Bcast:0.0.0.0Mask:255.255.255.255
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
]# ifconfig
eth0:1 Link encap:EthernetHWaddr 00:0C:29:F6:9E:DF
inet addr:172.18.250.100Bcast:0.0.0.0Mask:255.255.255.255
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1 这样就实现了keepalived的双主模式,测试下如果一台keepalived服务器down,地址会不会转移到另一台服务。
]# service keepalived stop
Stopping keepalived:
]# ifconfig
eth0:0 Link encap:EthernetHWaddr 00:0C:29:F6:9E:DF
inet addr:172.18.250.99Bcast:0.0.0.0Mask:255.255.255.255
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
eth0:1 Link encap:EthernetHWaddr 00:0C:29:F6:9E:DF
inet addr:172.18.250.100Bcast:0.0.0.0Mask:255.255.255.255
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1 地址能转移。也可以通过vrrp_script脚本来实现keepalived的IP地址转移。
编辑配置文件:
~]# vim /etc/keepalived/keepalived.conf
vrrp_script ck_down {
script "[[ -e /etc/keepalived/down ]] && exit 1 || exit 0" //如果down文件存在,则返回错误码
weight -5 //返回错误码后权重就减5
interval 2 //2秒钟扫描一次文件
}
在两个虚拟节点中调用此脚本:
track_script {
ch_down
}
重启keepalived服务:
]# service keepalived restart
Stopping keepalived:
Starting keepalived:
测试:
]# touch down
]# ls
downkeepalived.confkeepalived.conf.bak
]# ifconfig
eth0:0 Link encap:EthernetHWaddr 00:0C:29:F6:9E:DF
inet addr:172.18.250.99Bcast:0.0.0.0Mask:255.255.255.255
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
eth0:1 Link encap:EthernetHWaddr 00:0C:29:F6:9E:DF
inet addr:172.18.250.100Bcast:0.0.0.0Mask:255.255.255.255
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
已经转移到另一台服务器上来了。
]# rm down
]# ifconfig
eth0:0 Link encap:EthernetHWaddr 00:0C:29:C5:A4:6B
inet addr:172.18.250.99Bcast:0.0.0.0Mask:255.255.255.255
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1 双主模型就是这样实现。
二、通过脚本实现反向代理服务nginx的高可用
~]# yum -y install nginx 编辑配置文件:
~]# vim /etc/keepalived/keepalived.conf
vrrp_script chk_nginx_down {
script "killall -0 nginx" //查看nginx进程是否存在
weight -5
interval 2
}
在两个虚拟节点中添加调用此脚本:
track_script {
ch_down
chk_nginx_down
} 重启服务:
]# service keepalived restart
Stopping keepalived:
Starting keepalived: 测试如果一台nginx服务挂了,地址会不会转移
]# nginx -s stop
]# ifconfig
eth0 Link encap:EthernetHWaddr 00:0C:29:C5:A4:6B
inet addr:172.18.250.75Bcast:172.18.255.255Mask:255.255.0.0
inet6 addr: fe80::20c:29ff:fec5:a46b/64 Scope:Link
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
RX packets:122298 errors:0 dropped:0 overruns:0 frame:0
TX packets:8029 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:39436766 (37.6 MiB)TX bytes:918430 (896.9 KiB)
IP地址立马转移到另一台服务器上,所以实现了nginx的高可用。
keepalived也可以实现Web服务器的高可用,可以参考我的前一篇博客keepalived实现LVS集群的高可用。
页:
[1]