加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

keepalived + nginx主备切换

(2018-01-13 12:26:06)
标签:

keepalived

nginx

主备切换

分类: nginx

keepalive+nginx的主备切换配置

 

nginx版本:1.6.2

keeplive版本: 1.2.13-5.el6_6.x86_64

操作系统:CentOS release 6.5 (Final)

系统内核:2.6.32-431.el6.x86_64

 

一、nginx+keepalive联动实现功能

简单的说,ngnix在集群架构中不仅能实现静态服务器功能,而且能实现前端的负载均衡,能够为后端的web服务器提供反向代理。功能强悍,地位特殊,若只有1台服务器,出现故障后,会严重影响到整个集群。上述原因,需要一种技术保障多台负载均衡服务器同时工作,1台宕机后,其它能够自动的顶上。这样是引出了keepalive

keepalive,最主要的功能与网络工程中vrrp协议非常相似,即:虚拟路由冗余协议。与nginx配合,解决单点故障的问题。理论没必要多说,主要谈具体实现。

二、keepalive的实现

模拟环境:2ngnix负载均衡服务器,ip地址分别为:192.168.241.110192.168.241.120。效果:集群对外的vip为:192.168.241.50,当主服务器出现故障,备用服务器自动顶上。

1.安装keepalive

yum install keepalived -y

2.配置

配置文件在系统的 /etc/keepalived/keepalived.conf

配置文件内容较多,许多功能是与LVS配合使用的,但这里只配置它的高可用功能,其余功能等到配置LVS时在讨论。所有其余脚本被删除。

A.单实例:

主服务器配置:

####全局定义模块

global_defs {

   notification_email {

     acassen@firewall.loc     ##定义故障报警的email

     failover@firewall.loc   ##定义故障报警的email

     sysadmin@firewall.loc    ##定义故障报警的email

   }

notification_email_from Alexandre.Cassen@firewall.loc  ##定义发邮件的用户名称

   smtp_server 192.168.200.1   ##定义SMTP的服务器ip地址

   smtp_connect_timeout 30   ##定义SMTP连接的超时时间

   router_id   ID01       ##这是配置文件的一个核心参数:必须保证全网内唯一

}

#######################################################################################################

  #####vrrp实例定义模块

vrrp_instance VI_1 {

    state MASTER   ##主服务器的状态

    interface eth0   ##参与keepalived高可用选举的端口,在这样为对外提供服务接口

    virtual_router_id 51  ##为虚拟路由id,相同实例的ID必须相同,定义了同一域

    priority 150  ###选择优先级,选举主备的参数

    advert_int 1   ##同步通知间隔

    authentication {

        auth_type PASS  ###同一个实例,要求相同

        auth_pass 1111  ##同一个实例,密码要求相同

    }

    virtual_ipaddress {

        192.168.241.50  ##对外的虚拟ip地址,可以配置多个

   }

}

######################################################################################################

 

备用服务器配置:

####全局定义模块

global_defs {

   notification_email {

     acassen@firewall.loc     ##定义故障报警的email

     failover@firewall.loc   ##定义故障报警的email

     sysadmin@firewall.loc    ##定义故障报警的email

   }

notification_email_from Alexandre.Cassen@firewall.loc  ##定义发邮件的发送人

   smtp_server 192.168.200.1   ##定义SMTP的服务器ip地址

   smtp_connect_timeout 30   ##定义SMTP连接的超时时间

   router_id   ID02      ##这是配置文件的一个核心参数:必须保证全网内唯一

}

######################################################################################################

  #####vrrp实例定义模块

vrrp_instance VI_1 {

    state BACKUP   ##备服务器的状态

    interface eth0   ##对外提供服务的接口

    virtual_router_id 51  ##为虚拟路由id,相同实例的ID必须相同

    priority 100  ###选择优先级,选择主从关系的参数

    advert_int 1   ##同步通知间隔

    authentication {

        auth_type PASS  ###同一个实例,要求相同

        auth_pass 1111  ##同一个实例,密码要求相同

    }

    virtual_ipaddress {

        192.168.241.50  ##对外的虚拟ip地址,可以配置多个

   }

}

######################################################################################################

 

B.多实例

服务器1的配置:

####全局定义模块

global_defs {

   notification_email {

     acassen@firewall.loc     ##定义故障报警的email

     failover@firewall.loc   ##定义故障报警的email

     sysadmin@firewall.loc    ##定义故障报警的email

   }

notification_email_from Alexandre.Cassen@firewall.loc  ##定义发邮件的发送人

   smtp_server 192.168.200.1   ##定义SMTP的服务器ip地址

   smtp_connect_timeout 30   ##定义SMTP连接的超时时间

   router_id   ID01       ##这是配置文件的一个核心参数:必须保证全网内唯一

}

#######################################################################################################

  #####vrrp实例1

vrrp_instance VI_1 {

    state MASTER   ##主服务器的状态

    interface eth0   ##对外提供服务的接口

    virtual_router_id 51  ##为虚拟路由id,相同实例的ID必须相同

    priority 150  ###选择优先级,选择主备关系的参数

    advert_int 1   ##同步通知间隔

    authentication {

        auth_type PASS  ###同一个实例,要求相同

        auth_pass 1111  ##同一个实例,密码要求相同

    }

    virtual_ipaddress {

        192.168.241.50  ##对外的虚拟ip地址,可以配置多个

   }

}

###定义实例2

vrrp_instance VI_2 {

    state BACKUP   ##备服务器的状态

    interface eth0   ##对外提供服务的接口

    virtual_router_id 52  ##为虚拟路由id,相同实例的ID必须相同

    priority 100  ###选择优先级,选择主备关系的参数

    advert_int 1   ##同步通知间隔

    authentication {

        auth_type PASS  ###同一个实例,要求相同

        auth_pass 1111  ##同一个实例,密码要求相同

    }

    virtual_ipaddress {

        192.168.241.60  ##对外的虚拟ip地址,可以配置多个

   }

}

#######################################################################################################

 

 

服务器2的配置:

####全局定义模块

global_defs {

   notification_email {

     acassen@firewall.loc     ##定义故障报警的email

     failover@firewall.loc   ##定义故障报警的email

     sysadmin@firewall.loc    ##定义故障报警的email

   }

notification_email_from Alexandre.Cassen@firewall.loc  ##定义发邮件的发送人

   smtp_server 192.168.200.1   ##定义SMTP的服务器ip地址

   smtp_connect_timeout 30   ##定义SMTP连接的超时时间

   router_id   ID02      ##这是配置文件的一个核心参数:必须保证全网内唯一

}

#######################################################################################################

  #####vrrp实例1

vrrp_instance VI_1 {

    state BACKUP   ##备服务器的状态

    interface eth0   ##对外提供服务的接口

    virtual_router_id 51  ##为虚拟路由id,相同实例的ID必须相同

    priority 100  ###选择优先级,选择主从关系的参数

    advert_int 1   ##同步通知间隔

    authentication {

        auth_type PASS  ###同一个实例,要求相同

        auth_pass 1111  ##同一个实例,密码要求相同

    }

    virtual_ipaddress {

        192.168.241.50  ##对外的虚拟ip地址,可以配置多个

   }

}

#####vrrp实例2

vrrp_instance VI_2 {

    state MASTER   ##主服务器的状态

    interface eth0   ##对外提供服务的接口

    virtual_router_id 52  ##为虚拟路由id,相同实例的ID必须相同

    priority 150  ###选择优先级,选择主从关系的参数

    advert_int 1   ##同步通知间隔

    authentication {

        auth_type PASS  ###同一个实例,要求相同

        auth_pass 1111  ##同一个实例,密码要求相同

    }

    virtual_ipaddress {

        192.168.241.60  ##对外的虚拟ip地址,可以配置多个

   }

}

#######################################################################################################

 

三、keepalived的测试

单实例进行测试

1.2台服务器分别打开keepalived程序

/etc/init.d/keepalived start

为了让keepalived开机自启动,使用命令:

echo " /etc/init.d/keepalived start " >> /etc/rc.local

 

2台服务已正常运行keepalived程序的情况下,2台服务器分别使用命令:

ip add  #会发现只有主服务器能看见虚拟的ip地址(192.168.241.50),而备用服务看不到vip地址,如下

主服务器:

[root@nginx1 ~]# ip add

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:7c:9c:fc brd ff:ff:ff:ff:ff:ff

    inet 192.168.241.100/24 brd 192.168.241.255 scope global eth0

    inet 192.168.241.50/32 scope global eth0

    inet6 fe80::20c:29ff:fe7c:9cfc/64 scope link

     valid_lft forever preferred_lft forever

备用服务:

[root@nginx2 ~]# ip add

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:4b:67:2c brd ff:ff:ff:ff:ff:ff

    inet 192.168.241.200/24 brd 192.168.241.255 scope global eth0

    inet6 fe80::20c:29ff:fe4b:672c/64 scope link

       valid_lft forever preferred_lft forever

当主服务器宕机的时候,见下

备服务器:

[root@nginx2 ~]# ip add

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:4b:67:2c brd ff:ff:ff:ff:ff:ff

    inet 192.168.241.200/24 brd 192.168.241.255 scope global eth0

    inet 192.168.241.50/32 scope global eth0

    inet6 fe80::20c:29ff:fe4b:672c/64 scope link

       valid_lft forever preferred_lft forever

以上是主备切换的效果。

 

四、keepalived的局限性和相应的补救措施

 1.常说的“脑裂”问题

简单的说,就是主备服务器无法探测到对方的存在,出现在同一个网络存在多个vip,导致ip冲突,影响到系统正常运行。

主要的原因:a)网络故障,双方无法正常交换检测数据包;b)主备服务器开启防火墙,阻断检测报文的传输;c)主备服务器配置错误;d)网络协议冲突等。

2.“脑裂”补救措施

A.主备服务器之间配置心跳线,使用带外网管的方式,不与其它业务流量共用网络线路。

B.关闭主备服务的防火墙。在工作中,最好使用硬件防火墙,毕竟硬件防火墙的功能强大,而且,服务器配置防火墙,会严重影响负载均衡服务的性能。推荐:内网内尽量关闭软件防火墙。

C.使用监控软件对运行情况进行检查,使用免费开源的zabbix软件。

3.keepalived+nginx的功能缺陷及补救

A.默认keepalived只监控物理机器ip地址的变化,只能监控3层的ip,对7层运行的服务无法监控。当nginx服务停止,keepalived不会自动探测,无法实现主备切换,这样会导致用户无法正确访问。解决办法:

首先写脚本用于监控nginx运行是否正常,存放位置/scripts/check_nginx.sh,内容如下:

#!/bin/sh

if [ `netstat -lntup  | grep nginx | wc -l` -ne 1 ];then

{

    /etc/init.d/keepalived stop

}

fi


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 ID01

}

vrrp_script chk_nginx {

script "scripts/check_nginx.sh"

interval 2

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.241.50

    }

    track_script {

     chk_nginx

   }

}

以上是主服务的keepalived配置文件,备用服务器也可以使用类似的方法,解决nginxkeepalived不同步的问题。

B.解决多组keepalived服务器在一个局域网的冲突问题

当在一个局域网内部署了多组keepalived服务器对,而又没有专用心跳线通信时,可能会发生高可用无法接管的问题。导致上诉原因是:keepalived使用的是组播:224.0.0.18,若更改组播地址,即可解决上诉问题,在全局配置模块中加入如下:

global_defs {

     router_id ID01

vrrp_mcast_group4 224.0.0.200

}

C.更改keepalived默认的日志文件

默认情况下,keepalived服务日志会输出到系统默认/var/log/messages,和其它日志信息混在一起,可以将其调整成独立的日志文件,例如存放/var/log/keepalived.log ,配置如下:

1)修改配置文件 /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D "修改为KEEPALIVED_OPTIONS="-D -d -S 0"

2)修改rsyslog的配置文件 /etc/rsyslog.conf,在最后添加

echo"local0.*     /log/keepalived.log" >>/etc/rsyslog.conf

同时在第42行,添加local0.*

*.info;mail.none;authpriv.none;cron.none;local0.*         /var/log/messages

3)重启 rsyslogkeepalived服务

/etc/init.d/rsyslog  restart

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有