跳至主要內容

安装Keepalived

soulballad环境配置CentOSCentOS约 4309 字大约 14 分钟

yum安装

1、安装依赖包

[root@localhost ~]# yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
[root@localhost ~]# yum install -y keepalived

2、初始化及启动

[root@localhost ~]# systemctl start keepalived   //启动keepalived
[root@localhost ~]# systemctl enable keepalived  //加入开机启动keepalived
[root@localhost ~]# systemctl restart keepalived  //重新启动keepalived
[root@localhost ~]# systemctl status keepalived   //查看keepalived状态

编译安装

1、官网下载keepalived,解压并安装

注意这里不要下载最新版本,可能编译失败(亲身体验)

[root@master src]# yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
[root@master src]# wget http://www.keepalived.org/software/keepalived-2.1.5.tar.gz
[root@master src]# tar -zxvf keepalived-2.1.5.tar.gz -C /usr/local
[root@master src]# cd /usr/local/keepalived-2.1.5
[root@master keepalived-2.1.5]# ./configure --prefix=/usr/local/keepalived --sysconf=/etc --disable-dependency-tracking
[root@master keepalived-2.1.5]# make && make install

完成后会生成两个目录:

  • /usr/local/keepalived/
  • /etc/keepalived/

2、初始化及启动

# 将keepalived主程序加入到环境变量(安装目录下)
[root@localhost /]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
 
# keepalived启动脚本(源码目录下),放到/etc/init.d/目录下就可以使用service命令便捷调用
[root@localhost /]# cp /usr/local/keepalived-2.1.5/keepalived/etc/init.d/keepalived  /etc/init.d/keepalived

# 增加系统服务
[root@localhost keepalived]# chkconfig --add keepalived
# 开机自启
[root@localhost keepalived]# chkconfig keepalived on
# 启动停止状态
[root@localhost keepalived]# service keepalived start
[root@localhost keepalived]# service keepalived stop
[root@localhost keepalived]# service keepalived status
[root@localhost keepalived]# service keepalived restart

keepalived.conf

keepalived服务安装完成之后,后面的主要工作就是在keepalived.conf文件中配置HA和负载均衡。一个功能比较完整的常用的keepalived配置文件,主要包含三块:全局定义块、VRRP实例定义块和虚拟服务器定义块。全局定义块是必须的,如果keepalived只用来做ha,虚拟服务器是可选的。下面是一个功能比较完整的配置文件模板:

配置说明

配置文件可以分为三块:
全局定义块: 对整个 Keepalive 配置生效的,不管是否使用 LVS;
**VRRP实际定义块:**是keepalived的核心;

全局定义块

  1. email通知(notification_email、smtp_server、smtp_connect_timeout): 用于服务有故障时发送邮件报警,可选项,不建议用。需要系统开启sendmail服务,建议用第三独立监控服务,如用nagios全面监控代替。
  2. lvs_id: lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。
  3. router_id: 用户标识本节点的名称,通常为hostname
  4. 花括号{}: 用来分隔定义块,必须成对出现。如果写漏了,keepalived运行时不会得到预期的结果。由于定义块存在嵌套关系,因此很容易遗漏结尾处的花括号,这点需要特别注意。

VRRP实际定义块

vrrp_sync_group G1 {
    group {
        VI_1
        VI_2
        VI_5
    }
    notify_master "/usr/local/bin/vrrp.mast arg1 arg2"
    notify_backup "/usr/local/bin/vrrp.bak arg1 arg2"
    notify_fault "/usr/local/bin/vrrp.fault arg1 arg2"
    notify_stop "/usr/local/bin/vrrp.stop arg1 arg2"
}
vrrp_sync_group G2 {
    group {
        VI_3
        VI_4
    }
}
vrrp_instance VI_1 { 
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
	mcast_src_ip 
	garp_master_delay 10
	track_interface {
        eth0
        eth1
	}
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17 dev eth1
        192.168.200.18 dev eth2
    }
	virtual_routers {
		src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
		192.168.110.0/24 via 192.168.200.254 dev eth1
		192.168.111.0/24 dev eth2
		192.168.112.0/24 via 192.168.100.254
		192.168.113.0/24 via 192.168.100.252 or 192.168.100.253
	}
	nopreempt
	preemtp_delay 300
}

说明:

  1. vrrp_sync_group: 同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪
    1. notify_master:指定当keepalived进入MASTER状态时要执行的脚本,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本,允许传入参数;
    2. notify_backup:指定当keepalived进入BACKUP状态时要执行的脚本;
    3. notify_fault:指定当keepalived进入FAULT状态时要执行的脚本;
    4. notify_stop:指定当keepalived程序终止时需要执行的脚本;
  2. group: 至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
  3. vrrp_instance: vrrp实例名
    1. state: 实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态。当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态。
    2. interface: 对外提供服务的网卡接口,即VIP绑定的网卡接口。如: eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。
    3. priority: 节点优先级,取值范围0~254,MASTER要比BACKUP高
    4. smtp_alert: 有故障时是否激活邮件通知
    5. advert_int: MASTER与BACKUP节点间同步检查的时间间隔,单位为秒
    6. mcast_src_ip: 本机IP地址
    7. authentication: 验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用PASS类型,据说AH使用时有问题。验证密码为明文,同一vrrp 实例MASTER与BACKUP使用相同的密码才能正常通信。
    8. garp_master_delay: 用于设置在切换到MASTER状态后延时进行Gratuitous arp请求的时间;
    9. track_interface: 用于设置一些额外的网络监控接口,其中任何一个接口出现故障,keepalived都会进入FAULT状态;
    10. virtual_router_id: 虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,他将决定多播的 MAC 地址。
    11. virtual_ipaddress: 用于设置虚拟IP地址(VIP),可设置多个,每行一个;keepalived通过ip address add命令的形式将VIP添加进系统中,而且IP形式可多样;
    12. virtual_routers: 和virtual_ipaddress段一样,用来设置在切换时添加或删除相关路由信息;
    13. nopreempt: 禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。
    14. preemtp_delay: 用于设置抢占的延时时间,单位秒,如系统启动或重启之后网络需要经过一段时间才能正常工作,这时进行主备切换是没有必要的,此选项就是来设置这种情况发生的时间间隔;
    15. lvs_sync_daemon_inteface: 负载均衡器之间的监控接口,类似于 HA HeartBeat 的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口

虚拟服务器块

virtual_server 192.168.12.200 80 {
	delay_loop 6 
	lb_algo rr
	lb_kind DR
	persistence_timeout 50 
	persistence_granularity 
	protocol TCP
	ha_suspend
	virtualhost 
	sorry_server 
	real_server 192.168.12.132 80 {
		weight 3
		inhibit_on_failure
		notify_up | 
		notify_down | 
		#TCP_CHECK检测方式示例:
		TCP_CHECK {
			connect_port 80
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}

		#HTTP_GET和SSL_GET检测方式示例:
		HTTP_GET | SSL_GET {
			url {
				path /index.html
				digest e6c271eb5f017f280cf97ec2f51b02d3
				status_code 200 
			}
			connect_port 80
			bindto 192.168.12.80
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 2
		}
	}
}

说明:

  1. virtual_server: 定义一个虚拟服务器,这个ip是virtual_ipaddress中定义的其中一个,后面一个空格,然后加上虚拟服务的端口号。
    1. delay_loop: 健康检查时间间隔,单位: 秒
    2. lb_algo: 负载均衡调度算法,互联网应用常用方式为wlc或rr
    3. lb_kind: 负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。
    4. protocol: 转发协议,分为TCP和UDP两种
    5. persistence_timeout: http服务会话保持时间,单位: 秒
    6. persistence_granularity: 配合persistence_timeout使用,后面跟的值是子网掩码,表示持续连接的粒度,默认是255.255.255.255即一个单独的客户端IP,如果改为255.255.255.0那么客户端所在的整个网段的请求都会分发到同一台realserver上;
    7. real_server
  2. real_server: 真实服务器IP和端口,可以定义多个
    1. weight: 负载权重,值越大,转发的优先级越高
    2. notify_up: 和notify_master相同,后跟一个脚本,表示在检测到real server节点服务处于UP状态后只执行的脚本;
    3. notify_down: 表示在检测到real server节点服务处于DOWN状态后只执行的脚本
    4. inhibit_on_failure: 表示在检测到real server节点失效后,把他的weight值置为0,而不是从IPVS中删除;
    5. TCP_CHECK
  3. TCP_CHECK: 服务有效性检测,常见的有HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK
    1. connect_port: 服务连接端口
    2. connect_timeout: 服务连接超时时长,单位: 秒
    3. nb_get_retry: 服务连接失败重试次数
    4. delay_before_retry: 重试连接间隔,单位: 秒
    5. url: 用来指定HTTP/SSL检查的URL信息,可指定多个URL;
    6. path: 后跟详细的URL路径;
    7. digest: SSL检查后的摘要信息,可通过genhash命令获取,如genhash -s 192.168.12.80 -p 80 -u /index.html
    8. status_code: 指定HTTP检查返回正常状态吗的类型,一般为200;
    9. bindto: 表示通过此地址来发送请求对服务器进行健康检查;

配置示例

[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {					#全局配置
	notification_email {		#指定keepalived在发生切换时需要发送email到的对象,一行一个
		acassen@firewall.loc	#指定收件人邮箱
		failover@firewall.loc
		sysadmin@firewall.loc
	}
	notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
	smtp_server 192.168.200.1	#指定smtp服务器地址
	smtp_connect_timeout 30		#指定smtp连接超时时间
	router_id LVS_DEVEL			#此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
	vrrp_skip_check_adv_addr
	vrrp_strict
	vrrp_garp_interval 0
	vrrp_gna_interval 0
}

#如果这块没有,就不用管他 
vrrp_sync_group VG_1{				#监控多个网段的实例
	group {
		inside_network				#实例名
		outside_network
	}
	notify_master /path/xx.sh		#指定当切换到master时,执行的脚本
	netify_backup /path/xx.sh		#指定当切换到backup时,执行的脚本
	notify_fault "path/xx.sh VG_1" 	#故障时执行的脚本
	notify /path/xx.sh
	smtp_alert 						#使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
 
vrrp_instance inside_network {
	state BACKUP 			#指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决定
	interface eth0 			#设置实例绑定的网卡
	dont_track_primary 		#忽略vrrp的interface错误(默认不设置)
	track_interface{ 		#设置额外的监控,里面那个网卡出现问题都会切换
		eth0
		eth1
	}
	mcast_src_ip			#发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
	garp_master_delay		#在切换到master状态后,延迟进行gratuitous ARP请求
	virtual_router_id 50	#VPID标记
	priority 99				#优先级,高优先级竞选为master
	advert_int 1			#检查间隔,默认1秒
	nopreempt				#设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
	preempt_delay			#抢占延时,默认5分钟
	debug					#debug级别
	authentication {		#设置认证
		auth_type PASS		#认证方式,类型主要有PASS、AH 两种
		auth_pass 111111	#认证密码
	}
	virtual_ipaddress {		#设置vip
		192.168.36.200
	}
}
 
vrrp_instance VI_1 {		#虚拟路由的标识符
	state MASTER			#状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态
	interface eth0			#通信所使用的网络接口
    lvs_sync_daemon_inteface eth0  #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。
    virtual_router_id 51	#虚拟路由的ID号,是虚拟路由MAC的最后一位地址
    priority 100			#此节点的优先级,主节点的优先级需要比其他节点高
    advert_int 1			#通告的间隔时间
    nopreempt				#设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
    preempt_delay			#抢占延时,默认5分钟
    authentication {		#认证配置
		auth_type PASS		#认证方式
        auth_pass 1111		#认证密码
    }
    virtual_ipaddress {		#虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
 
virtual_server 192.168.200.100 443 { #集群所使用的VIP和端口
    delay_loop 6					#健康检查间隔,单位为秒
    lb_algo rr						#lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
    nat_mask 255.255.255.0			#VIP掩码
    lb_kind NAT						#负载均衡转发规则。一般包括DR,NAT,TUN 3种
    persistence_timeout 50			#会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了
    protocol TCP					#转发协议,有TCP和UDP两种,一般用TCP,没用过UDP
    persistence_granularity <NETMASK> #lvs会话保持粒度
 
    real_server 192.168.201.100 443 { #真实服务器,包括IP和端口号
        weight 1					#默认为1,0为失效
        inhibit_on_failure			#在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
        notify_up <string> | <quoted-string> #在检测到server up后执行脚本
        notify_down <string> | <quoted-string> #在检测到server down后执行脚本
 
		TCP_CHECK {					#通过tcpcheck判断RealServer的健康状态
            connect_timeout 3		#连接超时时间
            nb_get_retry 3			#重连次数
            delay_before_retry 3	#重连间隔时间
            connect_port 23			健康检查的端口的端口
            bindto <ip>  
        }
   
        HTTP_GET | SSL_GET {		#健康检测方式,可选有 SSL_GET、TCP_CHECK、HTTP_GET
            url {					#检查url,可以指定多个
              path /				#检查的url路径
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  #需要检查到的内容。检查后的摘要信息。
              status_code 200		#检查的返回状态码
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3		#连接超时时间
            nb_get_retry 3			#检测尝试几次
            delay_before_retry 3	#检测的时间间隔
        }
    }
}

Nginx+Keepalived

Master配置

! Configuration File for keepalived
global_defs {
    enable_script_security
    router_id LVS_DEVEL1 #运行 keepalived 服务器的标识,在一个网络内应该是唯一的
}
vrrp_script check_nginx_alive { 
    script "/etc/keepalived/check_nginx_alive.sh"  
    interval 2 # 每隔两秒运行上一行脚本 
    weight 10 # 如果脚本运行成功,则升级权重+10
}
vrrp_instance VI_11 { #vrrp 实例定义部分
    state MASTER      #设置 lvs 的状态,MASTER 和 BACKUP 两种,必须大写
    interface enp0s8  #设置对外服务的接口
    virtual_router_id 51 #设置虚拟路由标示,这个标示是一个数字,同一个 vrrp 实例使用唯一标示
    priority 100 #定义优先级,数字越大优先级越高,在一个 vrrp——instance 下,master 的优先级必须大于 backup
    advert_int 1 #设定 master 与 backup 负载均衡器之间同步检查的时间间隔,单位是秒
    authentication { #设置验证类型和密码
        auth_type PASS
        auth_pass 1111 #验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同
    }
    track_script {
        check_nginx_alive # 追踪 nginx 脚本
    }
    virtual_ipaddress { #设置虚拟 ip 地址,可以设置多个,每行一个
        192.168.11.100
    }
}
virtual_server 192.168.11.100 80 { #设置虚拟服务器,需要指定虚拟 ip 和服务端口
    delay_loop 6 #健康检查时间间隔
    lb_algo rr  #负载均衡调度算法
    lb_kind NAT #负载均衡转发规则
    persistence_timeout 50 #设置会话保持时间
    protocol TCP #指定转发协议类型,有 TCP 和 UDP 两种
    real_server cdh1 80 { #配置服务器节点 1,需要指定 real server 的真实 IP 地址和端口
        weight 1 #设置权重,数字越大权重越高
        TCP_CHECK { #realserver 的状态监测设置部分单位秒
            connect_timeout 3 #超时时间
            connect_port 80 #监测端口
            delay_before_retry 3 #重试间隔
        }
    }
}

Backup配置

! Configuration File for keepalived

global_defs {
    192.168.11.100
    router_id LVS_DEVEL2
}
vrrp_script check_nginx_alive { 
    script "/etc/keepalived/check_nginx_alive.sh"  
    interval 2 # 每隔两秒运行上一行脚本 
    weight 10 # 如果脚本运行成功,则升级权重+10
}
vrrp_instance VI_21 {
    state BACKUP
    interface enp0s8
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        check_nginx_alive # 追踪 nginx 脚本
    }
    virtual_ipaddress {
        192.168.68.100
    }
}
virtual_server 192.168.68.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server cdh2 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            connect_port 80
            delay_before_retry 3
        }
    }
}

自动切换

在 master 和 backup 节点的 /etc/keepalived/check_nginx_alive.sh 目录下设置脚本

#!/bin/bash
# –no-headers 不打印头文件
A=`ps -C nginx --no-header |wc -l` 
# 判断nginx是否宕机,如果宕机了,尝试重启 
if [ $A -eq 0 ];then 
    /usr/local/nginx/sbin/nginx 
    # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机 
    sleep 3 
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 
        # service keepalived stop
        killall keepalived 
    fi 
fi

LVS+Keepalived

Master配置

global_defs {
#   notification_email {
#     499812002@qq.com
#   }
#   notification_email_from zhangxm_qz@163.com
#   smtp_server smtp.163.com
#   smtp_connect_timeout 30
   router_id LVS_DEVEL16   #唯一标识
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER   #主节点
    interface ens33
    virtual_router_id 51
    priority 100  #优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.47.100/24
    }
}

virtual_server 192.168.47.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.47.11 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.47.12 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 192.168.47.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.47.11 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.47.12 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

Backup配置

global_defs {
   notification_email {
     499812002@qq.com
   }
   notification_email_from zhangxm_qz@163.com
   smtp_server smtp.163.com
   smtp_connect_timeout 30
   router_id LVS_DEVEL17  #唯一id
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP   #备机
    interface ens33
    virtual_router_id 51   #必须保持和主一致
    priority 90  #优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.47.100
    }
}

virtual_server 192.168.47.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.47.11 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.47.12 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 192.168.47.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.47.11 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.47.12 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

参考:

上次编辑于:
贡献者: soulballad