一、概念
负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行。
关于负载均衡介绍,可以参考:linux负载均衡总结性说明(四层负载/七层负载)
由于业务扩展,网站的访问量不断加大,负载越来越高。现需要在web前端放置nginx负载均衡,同时结合keepalived对前端nginx实现HA高可用。
- nginx进程基于Master+Slave(worker)多进程模型,自身具有非常稳定的子进程管理功能。在Master进程分配模式下,Master进程永远不进行业务处理,只是进行任务分发,从而达到Master进程的存活高可靠性,Slave(worker)进程所有的业务信号都 由主进程发出,Slave(worker)进程所有的超时任务都会被Master中止,属于非阻塞式任务模型。
- Keepalived是Linux下面实现VRRP备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。二者结合,可以构架出比较稳定的软件LB方案。
Keepalived介绍:
- Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
VRRP协议:
- VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。
- 在VRRP协议实现里,虚拟路由器使用 00-00-5E-00-01-XX 作为虚拟MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播IP地址 224.0.0.18 来定时发送通告消息。每个Router都有一个 1-255 之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低master的优先权可以让处于backup状态的路由器抢占(pro-empt)主路由器的状态,两个backup优先级相同的IP地址较大者为master,接管虚拟IP。
双机高可用一般是通过虚拟IP(飘移IP)方法来实现的,基于Linux/Unix的IP别名技术。
双机高可用方法目前分为两种:
- 双机主从模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
- 双机主主模式:即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠,非常适合于当前架构环境。
今天在此分享下Nginx+keepalived实现高可用负载均衡的主从模式的操作记录:
二、环境说明
操作系统:centos7 64位
master: 192.168.202.144(nginx/keepalived)
slave:192.168.202.145(nginx/keepalived)
web应用1:192.168.202.146
web应用2:192.168.202.147 //注意nginx和tomcat应用不要放在同一机器!
vip:192.168.202.22 //负载均衡器上配置的域名都解析到这个VIP上
三、安装
两台接入服务器分别安装NginX和keepalived:
-
准备依赖包:
yum install -y make wget yum -y install gcc pcre-devel zlib-devel openssl-devel
-
下载
wget http://nginx.org/download/nginx-1.9.5.tar.gz wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
-
安装NginX
tar zxvf nginx-1.9.5.tar.gz cd nginx-1.9.5 ./configure --with-http_stub_status_module make && make install
-
启动nginx服务
cd /usr/local/nginx/sbin/ ./nginx
修改nginx的html文件,(NGINX_HOME/html/index.html),来标识它属于哪台虚拟机。如下所示:
-
安装keepalived
tar zxvf keepalived-1.2.7.tar.gz cd keepalived-1.2.7 ./configure make && make install cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/sbin/keepalived /usr/sbin/
-
加入启动服务
echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local echo "/etc/init.d/keepalived start" >> /etc/rc.local
-
启动keepalived服务
service keepalived start|stop|restart
-
修改配置文件
vim /etc/keepalived/keepalived.conf
# 主 192.168.202.144 global_defs { ## 设置lvs的id,在一个网络内唯一 router_id LVS_DEVEL } vrrp_instance VI_1 { ## 主机配置,从机为BACKUP state MASTER ## 网卡名称 interface eno16777736 virtual_router_id 51 ## 权重值,值越大,优先级越高,backup设置比master小,这样就能在master宕机后讲backup变为master,而master回复后就可以恢复. priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { ## 同一网段虚拟IP 192.168.202.22 } } virtual_server 192.168.202.22 80 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.202.144 80 { weight 1 TCP_CHECK{ connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
# 从 192.168.202.145 global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eno16777736 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.202.22 } } virtual_server 192.168.202.22 80 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.202.145 80 { weight 1 TCP_CHECK{ connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
重启keepalived
分别重启两台虚拟机的keepalived,当我们访问上面配置同一网段的虚拟IP地址: 192.168.202.22访问的就是主服务器:192.168.202.144
service keepalived restart
并且当我们关闭掉主机也就是192.168.202.144的keepalived时,就会访问从机的nginx服务
四、配置keepalived的日志
-
修改/etc/sysconfig/keepalived
“-D” 就是输出日志的选项
这里的“-S 0”表示local0.* 具体的还需要看一下/etc/syslog.conf文件vim /etc/sysconfig/keepalived 修改为: KEEPALIVED_OPTIONS="-D -d -S 0"
-
**修改/etc/rsyslog.conf
vim /etc/rsyslog.conf 添加: local0.* /var/log/keepalived.log
-
重新启动keepalived和rsyslog服务
service rsyslog restart service keepalived restart
-
然后就可以查看keepalived的日志了
tail -f /var/log/keepalived.log
五、Nginx心跳检测
当我们配置了keepalived,当主keepalived的宕机了。会自动更改路由到backup的keepalived,但是如果nginx挂掉的话,keepalived就会找不到nginx服务这样还是会造成nginx服务不可用。那么我们就可以在keepalived中添加心跳script,用来检测nginx心跳,如果检测不到nginx服务,就关闭掉keepalived的进程。这样从机的keepalive服务就可以被调用。
-
下面是检测nginx心跳的脚本
/usr/local/ngin/sbin/check_nginx_alive.sh
#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ] then echo 'nginx server is died' /etc/init.d/keepalived stop fi
-
然后再在修改/etc/keepalived/keepalived.conf文件:
! Configuration File for keepalived vrrp_script check_nginx_alive { script "/usr/local/nginx/sbin/check_nginx_alive.sh" interval 3 weight -10 } 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 LVS_DEVEL } 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.202.22 } track_script { check_nginx_alive } } virtual_server 192.168.202.22 { delay_loop 6 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.202.144 80 { weight 1 TCP_CHECK{ connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
上面是主机192.168.64.128的配置,可以看到一共新添加了两个地方,主要是添加了一个shell脚本用于检测nginx是否存活,然后再在keepalived的配置文件中,添加这个这个检测心跳的文件。这个是主机的配置,那么从机也需要做相应的修改。那么不管是keepalived宕机还是nginx宕机都会切换到可以热备的机器中去,这样就达到了nginx的可高用。
六、防坑指南
- 首先关于VIP生成的问题,这个VIP需要2台服务器之间能相互ping通。具体生成见文档http://blog.chinaunix.net/uid-186064-id-2823297.html,本人只做了前三步,etho为网卡ID,通过ifconfig对应修改 。
- keepalived配置文件修改一定要细心,多查看日志分析原因。默认日志是在/var/log/message中。
- 我测试的时候不同网段,但是网络互通,也无法进行动态切换;另外从服务不能单独运行。