Nginx+keepalived主从双机热备自动切换架构
1:安装 keepalived
安装 keepalived 非常的简单和容易,这跟安装其他 GNU 源码软件步骤是以模一样的。下面 给出其安装过程
下载最新稳定版 wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz
解包 tar zxvf keepalived-1.1.17.tar.gz
切换目录 cd keepalived-1.1.17
配置 ./configure –prefix=/usr/local/keepalive
编译和安装 make ; make install
Keepalived 安装完成后,会在安装目录/usr/local/keepalived 生成 bin,etc,man,sbin 这 4 个目录。 其中 etc 为配置文件所在的目录.
值得注意的是,keepalived 的启动过程并不会对配置文件进行语法检查,就算没有配置文件,
keepalived的守护进程照样能够被运行起来.在默认状态下– 即不指定配置文件的位置,
keepalived先查找文件 /etc/keepalived/keepalived.conf,如果为了省事,
可以手动创建这个文件,然后在这个文件里书写规则,来达到控制keepalived 运行的目的。
2:配置 keepalived.conf
一个功能比较完整的keepalived 的配置文件,其配置文件keepalived.conf可以包含三个文本
块:全局定义块、VRRP 实例定义块及虚拟服务器定义块.全局定义块和虚拟服务器定义块
是必须的,如果在只有一个负载均衡器的场合,就不须VRRP实例定义块.
接下来,我们以一个配置文件模版为例,有选择的说明其中一些重要项的功能或作用.
#全局定义块
global_defs {
notification_email {
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
#以上是email通知,作用:有故障,发邮件报警。这是可选项目,建议不用
router_id LVS_DEVEL
#Lvs负载均衡器标识(lvs_id),在一个网络内,它应该是唯一的
}
#VRRP定义块
vrrp_sync_group VG_1 {
group {
VI_1
}
}
vrrp_instance VI_1 {
state MASTER #实例状态state.只有 MASTER 和 BACKUP 两种状态,并且需要大写这些单词
interface eth0 #通信接口 interface 。对外提供服务的网络接口,如 eth0,eth1
virtual_router_id 86 #虚拟路由标识,这个标识是一个数字,并且同一个vrrp实例使用唯一的标识
priority 188 #优先级priority.这是一个数字,数值愈大,优先级越高
advert_int 1 #同步通知间隔,单位为秒
authentication {
auth_type PASS #验证类型
auth_pass 1234 #验证密码
}
virtual_ipaddress {
192.168.1.123 dev eth0 #虚拟ip地址
}
}
#虚拟服务器定义块,是keepalived最重要的项目了,是keepalived.conf必不可少的部分
virtual_server 192.168.1.123 80 {
delay_loop 6 #健康检查时间间隔,单位是秒
lb_kind DR #负载均衡转发规则,一般包括 DR,NAT,TUN3种,在我的方案中,都使用DR的方式
persistence_timeout 50 #会话保持时间,单位是秒
protocol TCP #转发协议,一般有tcp和udp两种
#真实服务器
real_server 192.168.1.100 80 {
weight 1 #权重weight.权重值是一个数字,数值越大,权重越高
notify_down “/root/service_down.sh” #检测到真实服务down后执行的脚本
#下面检查任意一种检查方式
#http或ssl检查
HTTP_GET|SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
connect_port 444
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
#Tcp检查
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
#脚本检查
MISC_CHECK {
misc_path /usr/local/bin/script.sh! #外部程序检查
misc_timeout 10 #脚本执行超时时间
}
}
}
3:nginx+keepalived主从自动切换示例
有两台机器:
192.168.1.6 主
192.168.1.7 从
虚ip 192.168.1.8 最好保局域网内无此IP
前提是两台主机已经安装好了nginx和keepalived.假设nginx的虚拟主机是test.xtgxiso.cn
主(192.168.1.6)keepalived配置文件
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 86
priority 188
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.8 dev eth0
}
}
virtual_server 192.168.1.8 80 {
delay_loop 6
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.6 80 {
weight 1
notify_down “/sbin/service keepalived stop”
HTTP_GET{
url {
path “/index.php”
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
为了检查的正确性,最好在hosts将域名指向本机(192.168.1.6)
从(192.168.1.7)keepalived配置文件
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 86
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.8 dev eth0
}
}
virtual_server 192.168.1.8 80 {
delay_loop 6
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.7 80 {
weight 1
notify_down “/sbin/service keepalived stop”
HTTP_GET{
url {
path “/index.php”
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
同样为了检查的正确性,最好在hosts将域名指向本机(192.168.1.7)
4:测试
分别在2台nginx上启动nginx和keepalived服务,然后分别用ip a 查看ip
也可以通过tail -f /var/log/message 查看日志信息.
通过杀掉主从的nginx看到切换情况
总结:
有的时候会出现主从不正常或其他异常情况,一般是keepalived不能正常通信造成的 keepalived不能正常通信,除了配置错误之外,通常是由于防火墙的原因,很多资料都没有提及这点
请检查防火墙规则符合下面的条件:
1:keepalived 默认需要使用D类多播地址224.0.0.18进行心跳通信
2:keepalived 使用vrp协议进行通信(端口号为112)
检测两个keepalived主机之间是否能通信的办法有 停掉一个keepalived,看另外一个keepalived的日志/var/log/messages 里是否有新的日志