keepalive起初专门为lvs负载均衡软件设计的,用来管理监控lvs集群系统中各个服务节点的状态,后来又加入了能够实现高可用的vrrp功能。nginx
keepalive软件经过vrrp协议实现高可用功能的。VRRP(虚拟路由器冗余协议)目的就是为了解决静态路由单点故障问题,竞选机制来将路由的任务交给某台VRRP路由器的,保证节点宕机,整个网络能够不间断的运行web
Keepalived能够实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机能够是普通的不能停机的业务服务器,也能够是LVS负载均衡、Nginx反向代理这样的服务器。vim
Keepalived高可用简单原理服务器
master端的vrrp路由器会一直发送vrrp广播包,buckup会一直收到广播包,buckup不会抢占master资源,在backup上会一直监听,一旦收不到master的包,在多台backup中优先级最高的就会抢占为master网络
keepalive服务的三个重要功能app
一、 管理LVS负载均衡软件负载均衡
二、 实现对LVS集群节点健康检查功能tcp
三、 做为系统网络服务的高可用功能测试
! Configuration File for keepalived global_defs { #全局定义 notification_email { #出问题了收件人 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Cassen@firewall.loc #发件人 smtp_server 192.168.200.1 #发件服务器地址 smtp_connect_timeout 30 #超时时间 router_id LVS_DEVEL #惟一标识,不一样机器不能同样 } vrrp_instance VI_1 { #vrrp实例,名字能够自定义,与前面关键字空格隔开 state MASTER #标识是主仍是备,必定要大写 interface eth0 #默认的通讯的接口,当vip不指定时,默认绑定它 virtual_router_id 51 #实例的ID(主备必须同样,同一文件惟一,0-255) priority 100 #真正肯定谁优先地方,数字越大,级别越高,越先获取资源,建议隔50 advert_int 1 #心跳间隔 authentication { #实例认证,主备同样 auth_type PASS auth_pass 1111 } virtual_ipaddress { #VIP地址 192.168.200.16 192.168.200.18/24 dev eth0 label eth0:1 } }
在实际工做中有三个域名spa
www.etiantian.org
blog.etiantian.org
bbs.etiantian.org
它们的访问量都很大,能够配置不一样的ip来结合keepalived进行负载,先用两个域名来测试:
10.0.0.3 www.etiantian.org 10.0.0.4 blog.etiantian.org
目地:在初始阶段,两不不一样域名的服务跑在不一样的机器上,(实际是互为主备的配置)
lb1: 10.0.0.3 www.etiantian.org lb2: 10.0.0.4 blog.etiantian.org
keepaived沿用上面互为主备的配置
如下是nginx的配置(分别在两台lb上作)
所须要作的就是监听ip
[root@LB01 conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream backend { server 172.16.1.8:80 weight=1; server 172.16.1.7:80 weight=1; check interval=3000 rise=2 fall=5 timeout=1000 type=http; } server { listen 10.0.0.3:80; #这里要监听ip server_name blog.etiantian.org; location / { proxy_pass http://backend; #这加必定要加这个抛的字段,不然访问就访问成负载的主页了 include proxy.conf; } location /status { check_status; access_log off; } } server { listen 10.0.0.4:80; server_name blog.etiantian.org; location / { proxy_pass http://backend; include proxy.conf; } location /status { check_status; access_log off; } } }
LB01:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { notification_email { 490238852@qq.com } notification_email_from 490238852@qq.com smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev eth0 label eth0:1 } } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:2 } }
LB02:
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { 490238852@qq.com } notification_email_from 490238852@qq.com smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev eth0 label eth0:1 } } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 52 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:2 } }
通常来讲脑裂问题有如下这几种缘由:
心跳线坏了(包括断了,老化)、
网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
心跳线之间的设备故障(网卡及交换机)、
仲裁的机器出现问题(才用仲裁的方案)
提示keepalive配置里同一VRRP实例若是virtual_router_id两端参数配置不一致,也会致使脑裂问题
在实际生产环境中,咱们从如下方面防止脑裂:
解决常见方案:
报错:
[root@LB01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.6.3/conf/nginx.conf syntax is ok nginx: [emerg] bind() to 10.0.0.4:80 failed (99: Cannot assign requested address) nginx: configuration file /application/nginx-1.6.3/conf/nginx.conf test failed
配置好后,出现没法绑定ip10.0.0.4:80,这是因为本地没有这个ip形成的,而这个ip是须要keepalived来生的,这样就没法进行配置nginx。
解决方法:
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p #生效
经过这个命令,系统就容许配置一个当前不存在的辅助ip
[root@LB01 ~]# /application/nginx/sbin/nginx -s stop #平滑重启没用,要关掉重启 [root@LB01 ~]# /application/nginx/sbin/nginx [root@LB01 ~]# netstat -ntpl|grep nginx tcp 0 0 10.0.0.4:80 0.0.0.0:* LISTEN 7431/nginx tcp 0 0 10.0.0.3:80 0.0.0.0:* LISTEN 7431/nginx
用来访问的机器上作解析访问检查
vim /etc/hosts
10.0.0.3 www.etiantian.org
10.0.0.4 blog.etiantian.org
用户在进行访问体验是没有什么不一样的,web服务器也没有一点变更,只是实现了负载均衡器流量的分流,
这样作的好处是平均负载的压力,可是注意的是负载的能力,由于当其中一台宕机了,另外一台立刻起另外一个vip接管资源,压力太大就是雪崩。
keepalived是服务器级别的,只监控服务器,nginx宕机了,是没有办法接管的
cat /server/scripts/check_nginx_by_keep.sh #!/bin/sh while true do if [ `netstat -lntup|grep nginx|wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi sleep 5 done
当负载器上出现nginxr的监听ip大于1时(或写作-eq 0 ,即等于0时),就杀掉keepalived进程,这样来实现web服务如nginx挂掉接管资源
一、/etc/sysconfig/keepalived
修改成 KEEPALIVED_OPTIONS="-D -d -S 0"
二、/etc/rsyslog.conf
修改成 *.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages 最后加 local0.* /var/log/keepalived.log 三、重启 /etc/init.d/rsyslog restart /etc/init.d/keepalived restart