前言:
对于大型web项目来说,必不可少的就是高可用。
那随着公司业务的发展,虽然用nginx做负载均衡仍可以支撑日均百万PV的访问,且运行两年之久未出现单点故障,但仍要考虑避免单点故障导致的业务中断。
keepalived 简介:
keepalived 项目主要的目标是为linux系统和linux基础设施提供负责均衡和高可用。
负载均衡架构依赖于IPVS内核模块提供四层负载均衡,keepalived实现了动态检查和基于负载池的管理服务。另一方面,高可用性是通过VRRP协议实现。简单的框架可以单独或一起提供弹性基础设施。
keepalived配置文件:
keepalived.conf文件由三个配置部分组成:
- Globals configurations 全局配置
- VRRP configuration VRRP配置
- LVS configuration LVS配置
约定:
此文不做nginx安装介绍,有关nginx安装可参考前面的文章
系统:采用centos 6.8 最小化
源文件目录:/usr/local/src
master_ip:192.168.1.10
backup_ip:192.168.1.11
vip:192.168.1.20
keepalived官网http://www.keepalived.org/
keepalived master列出的配置项相对要多,可根据情况选择使用。
分别在主备nginx安装配置keepalived
准备:
下载keepalived源码包:
wget http://www.keepalived.org/software/keepalived-1.3.2.tar.gz
安装开发工具:
yum install gcc-c++ openssl-devel
iptables 配置:
关闭iptables,或允许主备互通
iptables -I INPUT -i eth1 -s 192.168.1.11 -j ACCEPT
iptables -I INPUT -i eth1 -s 192.168.1.10 -j ACCEPT
安装keepalived:
解压:
tar zxf keepalived-1.3.2.tar.gz
配置编译安装:
cd keepalived-1.3.2 ./configure make make install
创建配置文件和服务:
cp -r keepalived/etc/keepalived/ /etc/ cp keepalived/etc/init.d/keepalived.rh.init /etc/init.d/keepalived cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
配置keepalived:
master keepalived.conf
! Configuration File for keepalived global_defs { notification_email { [email protected] #接收通知的邮件地址 } notification_email_from [email protected] #发送邮件通知的地址 smtp_server 192.168.200.1 #发送邮件的SMTP服务地址,可是ip或域名.可选端口号 (默认25) smtp_connect_timeout 30 #smtp连接超时时间秒 router_id LVS_DEVEL #主机标识,用于邮件通知 vrrp_skip_check_adv_addr #vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播 vrrp_garp_interval 0 vrrp_gna_interval 0 script_user keepalived_script # 指定运行脚本的用户名和组。默认使用用户的默认组。 # 如未指定,默认为keepalived_script 用户,如无此用户,则使用root enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。 } vrrp_script chk_nginx_service { #VRRP 脚本声明 script "/usr/local/keepalived/nginx-ha-check" #周期性执行的脚本 interval 3 #运行脚本的间隔时间,秒 weight -50 #权重,调整优先级(-255-255)。priority值减去此值要小于备服务的priority值 #否则备服务选举为主服务时会失败。 fall 3 # 检测几次失败才为失败,整数 rise 2 # 检测几次状态为正常的,才确认正常,整数 user keepalived_script # 执行脚本的用户或组 } vrrp_instance VI_1 { #VRRP 实例声明 state MASTER #实例默认状态,MASTER|BACKUP interface eth0 #绑定的接口 #mcast_src_ip 192.168.1.10 # VRRP 报文使用的源ip地址 unicast_src_ip 192.168.1.10 # VRRP 报文使用的源ip地址 (alias to mcast_src_ip) unicast_peer { # 不使用VRRP多播,既用单播 192.168.1.11 # 备节点ip,可以是多个 virtual_router_id 51 #VRRP 路由标识(-1-255),主备相同 priority 100 #优先数,-1-255,主服务要大于备服务 advert_int 1 #VRRP 广告间隔 authentication { #主备认证 auth_type PASS #认证方式 auth_pass 1111 #主备需统一 } virtual_ipaddress { #VRRP 地址,可有多个 192.168.1.20 } track_script { #脚本监控状态 chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20 } }
backup keepalived.conf
! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_nginx_service { script "/usr/local/keepalived/nginx-ha-check" interval 3 weight -10 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.20 } track_script { chk_nginx_service } }
nginx-ha-check 脚本
chmod +x nginx-ha-check
#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin STATEFILE=/var/run/nginx-ha-keepalived.state if [ -s "$STATEFILE" ]; then . "$STATEFILE" case "$STATE" in "BACKUP"|"MASTER"|"FAULT") service nginx status exit $? ;; *|"") logger -t nginx-ha-keepalived "Unknown state: ‘$STATE‘" exit 1 ;; esac fi service nginx status exit $?
启动服务:
service keepalived start
验证:
主备服务安装配置完成后,可通过浏览器方位192.168.1.20地址,同时停掉主nginx服务,再次访问192.168.1.20查看页面
nginx主备服务需要能够确认唯一标识的页面,如在index.html中分别表明主备服务。
同时可观察/var/log/messages 日志信息