【负载均衡】高可用组件Keepalived的编译安装与配置教程

tanglu WebServer 2019-02-19 16393 0

一、Keepalived介绍与安装

Keepalived是一款HA高可用工具,常和LVS、Nginx等负载均衡软件合作,实现负载均衡+高可用。Keepalived除了提供VIP漂移功能外,还支持对后端服务进行健康检查并自动failover。安装Keepalived也非常简单,yum安装或编译安装都可,下面是编译安装Keepalived的方法:

1、通过Keepalived官方网站http://www.keepalived.org/进行工具下载。从1.4版本开始支持IPV6,所以在编译安装Keepalived之前要先安装如下环境

yum install -y libnl-devel libnl3-devel libnfnetlink-devel


2、在需要进行高可用配置的节点上都编译安装Keepalived。编译安装完成后注意看是否有如图出现几个yes的标记,这个是代表安装Keepalived所支持的功能

./configure --prefix=/usr/local/keepalived 
 make 
 make install
/usr/local/keepalived/sbin/keepalived -v  #查看版本


如果编译时出现!!! OpenSSL is not properly installed on your system. !!! Can not include OpenSSL headers files.!!! 这样的报错需要先安装openssl-devel这个软件包

yum install openssl-devel -y


keep.png

 

二、Keepalived配置

1、通过编译安装的Keepalived可以在keepalived/etc目录中获取到配置模板文件,如果使用yum安装的则是/etc/keepalived/keepalived.conf,在启动Keepalived时服务会默认读取/etc/keepalived/keepalived.conf,或者通过-f选项指定配置文件路径

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf  


2、下面是Keepalived配置文件示例,如果服务启动异常可以通过/var/log/message查找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.145.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_instance test_nginx {  #实例名称随便取
   state MASTER            #标记该节点是master还是backup,但并不起实际作用,为了防止脑裂抢占IP建议设置backup并且配置非抢占模式
   interface eth0          #配置VIP绑定的网卡,这里使用和外网通信的网卡
   virtual_router_id 51    #取1-255之间的值,主备需要相同,这样才能成为一个组
   priority 100            #权重,数值高的主机是master,这是影响主备的关键
   # nopreempt             #非抢占模式,如果打开注释那state必须为backup
   advert_int 1            #主备之间通讯的间隔秒数,用于判断主节点是否存活
   authentication {
       auth_type PASS      #进行安全认证的方式,PASS或者AH方式,推荐PASS
       auth_pass 1111      #PASS的密码
   }
   virtual_ipaddress {
       192.168.145.200     #VIP地址,最多可以写20个,keepalive服务启动后会在interface选项所配置的网卡上新增该VIP
   }
   #定义虚拟服务信息
   virtual_server 192.168.145.200 80 {  #虚拟服务的访问地址与端口,访问该地址的请求会转发到后端real_server,通常就是VIP的信息
       delay_loop 6
       protocol TCP
       lb_algo rr
       lb_kind DR
       real_server 192.168.145.101 80{  #后端节点1
         weight 1        }
       
       real_server 192.168.145.102 80{  #后端节点2
          weight 1       }
   }
}


3、启动服务后使用ps命令查看是否有进程在工作。通过ip add命令可以看到配置出的VIP信息已经出现在Master节点上(用ifconfig是看不到的) ,当Master挂掉后该VIP会自动绑定到Slave节点去。

keep2.png


keepalived1.png


4、由于上面配置的是nginx服务,所以在后端节点上都配置好Nginx,这里可以故意为2个不同的节点配置不同的页面用于验证。看看最开始请求VIP的页面以及将主节点关机或者杀掉keepalived后的页面是否不同,如果不同说明VIP已经自动跳到另一台节点。由于上面配置了非抢占模式,所以第一个节点挂掉再恢复也不会重新把VIP抢占回来。除此还需要注意使用负载均衡后的session问题。如果keepalived在使用中被强行杀死或者网络出现脑裂问题,VIP会同时出现在主备节点上,只能通过重启网络解决

#两种导致脑裂的操作
pkill -9 keepalived
iptables -A OUTPUT -p vrrp -j DROP
#恢复办法
systemctl restart network


三、Keepalived健康检查与高可用

在Keepalived的实际运用中需要对后端服务(比如Nginx)做一个健康检查来判断服务是否正常,否则Keepalived检查的对象是Keepalived自身服务而不是其他应用服务。所以存在后端Nginx服务挂了但是Keepalived还在正常工作,这个时候就不会切换VIP到正常的服务器上去。Keepalived健康检查功能支持TCP_CHECK、HTTP_GET、MISC_CHECK、VRRP_SCRIPT方式。

1、TCP_CHECK、HTTP_GET配置示例:

real_server 192.168.145.101 80 {  #在real server段进行配置
weight 1      
TCP_CHECK {
 connect_port 80
 connect_timeout 6
 nb_get_retry 3
 delay_before_retry 3
 }
HTTP_GET {
 url {
   path /index.html
   status_code 200
 }
 connect_timeout 6
 nb_get_retry 3
 delay_before_retry 3
 }
}


2、vrrp_script脚本检查,该选项配合track_script使用。使用自定义脚本来判断后端服务是否异常,如果出现异常就应该移除掉VIP,也就是主动来停止Keepalived服务

global_defs {  #全局部分设置,全部注释都可以,主要是邮件信息
  notification_email {
    tanglu@qq.com  #主从切换时发送邮件通知,这里是收件人地址
  }
  notification_email_from tanglu@postfix.com  #发件人地址
  smtp_server 192.168.200.1  #邮件服务器地址
  smtp_connect_timeout 30  #发送邮件超时时间
  router_id LVS_DEVEL
}

vrrp_script check_nginx {  #定义循环检测
   script "/scripts/check_nginx.sh"
   interval 5  #5秒运行一次检测脚本
}

vrrp_instance VI_1 {
   interface ens33  
   nopreempt
   priority 100
   advert_int 1  
   virtual_ipaddress {
       192.168.68.250  #VIP,最多设置20个
   }
   track_script {  #调用循环检测
   check_nginx
 }
}

check_nginx.sh脚本代码参考:

#!/bin/bash    
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]    
then    
/usr/local/nginx/sbin/nginx    
sleep 5    
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]    
then    
killall keepalived    
fi    
fi



3、Keepalived本身要实现高可用的话只需要再准备一台节点部署Keepalived,然后将两台Keepalived做成双主模式。双主的实现只需要配置一段新的vrrp_instance规则,在主Keepalived上面加配置一个从的实例规则,再到从Keepalived上面配置一个主的实例规则

· 主节点配置如下

global_defs {
  notification_email {
   381347268@qq.com
  }
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
}

vrrp_instance VI_1 {
   state MASTER
   interface ens33
   virtual_router_id 51
   priority 150
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
   192.168.1.110/24 dev ens33 label ens33:1
   }
}

vrrp_instance VI_2 {
   state BACKUP
   interface ens33
   virtual_router_id 52
   priority 100
   advert_int 1
   authentication {
   auth_type PASS
   auth_pass 2222
   }
   virtual_ipaddress {
   192.168.1.210/24 dev ens33 label ens33:2
   }
}



· 从节点配置如下

global_defs {
  notification_email {
   381347268@qq.com
  }
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
}

vrrp_instance VI_1 {
   state BACKUP
   interface ens33
   virtual_router_id 51
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
   192.168.1.110/24 dev ens33 label ens33:1
   }
}

vrrp_instance VI_2 {
   state MASTER
   interface ens33
   virtual_router_id 52
   priority 150
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 2222
   }
   virtual_ipaddress {
       192.168.1.210/24 dev ens33 label ens33:2
   }  
}


版权声明
本站所有文章均为原创,转载请注明出处!小站维护不易,如果对您有所帮助,希望能点击一下站内广告,谢谢!

评论