背景:
既然有了Lvs+keepalived这样高性能的组合,那为何还要有Nginx+keepalived呢,keepalived的初衷就是为了Lvs而设计的,我们都知道Lvs是一个四层的负载均衡设备,虽然有着高性能的优势,但同时它却没有后端服务器的健康检查机制,keepalived为lvs设计了一系列的健康检查机制TCP_CHECK,UDP_CHECK,HTTP_GET等。同时lvs也可以自己写健康检查脚脚本。或者结合ldirectory来实现后端检测。但是固LVS始终无法摆脱它是一个四层设备,无法对上层协议进行解析。Nginx不一样,Nginx是一个七层的设备可以对七层协议进行解析,可以对一些请求进行过滤,还可以对请求结果进行缓存。这些都是Nginx独有的优势。但是keepalived并没有为Nginx提供健康检测。需要自己去写一些脚步来进行健康检测。关于keepalived+lvs的构建可参考我的另一篇博文:
http://www.jb51.cc/article/p-seilqokz-bqt.html
废话不多说开始构建 keppalived+Nginx 高可用集群
1、首先还是要准备环境
四台机器(CentOS7.3)
192.168.0.56 ---> proxy1 (Nginx)
192.168.0.57 ---> proxy2 (Nginx)
192.168.0.58 ---> web1 (httpd)
192.168.0.59 ---> web1 (httpd)
拓扑
注:
1、这里需要保持4台机器时间同步 #ntpdateIP(ntp时钟服务器自行搭建不多介绍) */5****root/usr/sbin/ntpdate192.168.1.99&>/dev/null;hwclock-w 2、为了操作的方便后面配置对所有参与机器进行免密处理 #ssh-keygen-trsa-P''-f"/root/.ssh/id_rsa" #foriin56575859;dossh-copy-id-i.ssh/id_rsa.pubroot@192.168.0.$i;done
2、配置realserver(web1和web2)
a、安装web程序
注意这里的realserver 可以是任何web容器(tomcat、jetty、httpd、Nginx..),因为是学习,所以这里使用httpd来演示
#yuminstallhttpd-y #systemctlrestarthttpd #netstat-nultp|grephttpd##确保httpd启动 tcp600:::80:::*LISTEN4619/httpd 配置页面 web1: #echo"<h1>Thepagefromweb1(58)</h1>">/var/www/html/index.html web2: #echo"<h1>Thepagefromweb1(59)</h1>">/var/www/html/index.html
b、设置VIP及内核参数
#编写脚本如下: #catsetka.sh #!/bin/bash vip=192.168.0.100 case$1in start) echo1>/proc/sys/net/ipv4/conf/all/arp_ignore echo1>/proc/sys/net/ipv4/conf/lo/arp_ignore echo2>/proc/sys/net/ipv4/conf/all/arp_announce echo2>/proc/sys/net/ipv4/conf/lo/arp_announce ifconfiglo:0$vipbroadcast$vipnetmask255.255.255.255up ;; stop) ifconfiglo:0down echo0>/proc/sys/net/ipv4/conf/all/arp_ignore echo0>/proc/sys/net/ipv4/conf/lo/arp_ignore echo0>/proc/sys/net/ipv4/conf/all/arp_announce echo0>/proc/sys/net/ipv4/conf/lo/arp_announce ;; esac #bashsetka.shstart#运行该脚本设置相关内核参数及VIP地址。 #cat/proc/sys/net/ipv4/conf/lo/arp_ignore#内核参数设置成功 1 #cat/proc/sys/net/ipv4/conf/all/arp_announce 2 #ifconfiglo:0#VIP设置成功 lo:0Linkencap:LocalLoopback inetaddr:192.168.137.10Mask:255.255.255.255 UPLOOPBACKRUNNINGMTU:65536Metric:1 #scpsetka.shroot@192.168.0.59:/root#拷贝一份给web2并执行 setka.sh100%5470.5KB/s00:00
a、两台proxy都安装Nginx
yuminstall-yNginx
b、配置Nginx proxy
vim/etc/Nginx/Nginx.conf upstreambackserver{ server192.168.0.58:80weight=1max_fails=3fail_timeout=3s; server192.168.0.59:80weight=2max_fails=3fail_timeout=3s; } server{ listen80; server_namelocalhost; location/{ roothtml; indexindex.htmlindex.htm; proxy_passhttp://backserver; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; }
复制一份至另一台proxy(Nginx)
#scp/etc/Nginx/Nginx.confroot@192.168.0.57:/etc/Nginx/Nginx.conf #systemctlrestartNginx;ssh192.168.0.57‘systemctlrestartNginx’
c、测试访问
#foriin{1..10};docurlhttp://192.168.0.56;done <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(58)</h1> #foriin{1..10};docurlhttp://192.168.0.57;done <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1>
#注:这里可以看出,每台proxy(Nginx) 都完成了负载均衡配置,且实现了负载均衡调度。细心的同学发现后端real server 配置的权重1:2,调度大致请求调度返回也为1:2
4、配置keepalived 高可用Nginx
a、每台proxy安装httpd 和keepalived
#yuminstall-yhttpdkeepalived
每台proxy 配置Sorry页面,这里一旦后端服务器同时无法访问,会自动调用本地的httpd服务
#echo"<h1>Sorry,Undermaintances(56).</h1>">/var/www/html/index.html #echo"<h1>Sorry,Undermaintances(57).</h1>">/var/www/html/index.html
#编辑各个proxy的Nginx.conf,添加在upstream下添加 server127.0.0.1:8080backup; 或者:#sed-i'/server192.168.0.59:80weight=2max_fails=3fail_timeout=3s;/a\server127.0.0.1:8080backup;'/etc/Nginx/Nginx.conf
b、编辑配置文件
proxy1:
#cat/etc/keepalived/keepalived.conf !ConfigurationFileforkeepalived global_defs{ notification_email{ root@localhost#定义邮箱报警的邮箱地址 } notification_email_fromroot@localhost#定义发送报警信息的地址 smtp_server127.0.0.1#定义发送邮件的邮件服务器地址 smtp_connect_timeout30#定义发送邮件的超时时间 router_idha_Nginx#全局标识 } vrrp_scriptchk_Nginx{#定义检查Nginx服务的脚本 script"/etc/keepalived/chk_Nginx.sh"#脚本重启Nginx,如果进程还是无法检测到,则强制停止keepalived interval2#检查的间隔时间 weight-2#检查失败的话权重减2 fall2#检查失败2次才认为是真正的检查失败 } vrrp_instanceVI_1{ stateMASTER interfaceens33 virtual_router_id51 priority100#备用机器的keepalived的权重要小于这个权重,并且当Nginx服务挂掉后100-2要小于备用机器的权重。 advert_int1 smtp_alert#比较重要定义使用邮件发送,不然上面的邮件定义都是没有用的,使用了这个当状态发生改变就会发送邮件报警 authentication{ auth_typePASS auth_pass1111 } track_script{#定义使用哪个脚本来检查。 chk_Nginx } virtual_ipaddress{ 192.168.0.100/16devens33labelens33:1 } }
##拷贝配置文件至proxy2
#scp/etc/keepalived/keepalived.confroot@192.168.0.57:/etc/keepalived/keepalived.conf
proxy2:
修改keepalived.conf 如下两个参数:
state BACKUP
priority 99
#这里贴出我实验的配置
# cat /etc/keepalived/keepalived.conf
!ConfigurationFileforkeepalived global_defs{ notification_email{ root@localhost#定义邮箱报警的邮箱地址 } notification_email_fromroot@localhost#定义发送报警信息的地址 smtp_server127.0.0.1#定义发送邮件的邮件服务器地址 smtp_connect_timeout30#定义发送邮件的超时时间 router_idha_Nginx#全局标识 } vrrp_scriptchk_Nginx{#定义检查Nginx服务的脚本 script"/etc/keepalived/chk_Nginx.sh"#脚本重启Nginx,如果进程还是无法检测到,则强制停止keepalived interval2#检查的间隔时间 weight-2#检查失败的话权重减2 fall2#检查失败2次才认为是真正的检查失败 } vrrp_instanceVI_1{ stateBACKUP interfaceens33 virtual_router_id51 priority99#备用机器的keepalived的权重要小于这个权重,并且当Nginx服务挂掉后100-2要小于备用机器的权重。 advert_int1 smtp_alert#比较重要定义使用邮件发送,不然上面的邮件定义都是没有用的,使用了这个当状态发生改变就会发送邮件报警 authentication{ auth_typePASS auth_pass1111 } track_script{#定义使用哪个脚本来检查。 chk_Nginx } virtual_ipaddress{ 192.168.0.100/16devens33labelens33:1 } }
c、Nginx检测脚本
#脚本先判断是否有Nginx进程,然后如果没有,则会重启Nginx,如果进程还是无法检测到,则强制停止keepalived,启用备用节点的作为master。
#该脚本可以有效防止HA脑裂,发现无发启动Nginx尝试重启,不行再将keepalived关闭,彻底移除此节点。
#cat/etc/keepalived/chk_Nginx.sh #!/bin/bash N=`ps-CNginx--no-header|wc-l` if[$N-eq0];then systemctlrestartkeepalived sleep1 if[`ps-CNginx--no-header|wc-l`-eq0];then systemctlstopkeepalived fi fi
d、启动keepalived及Nginx
#systemctlrestartNginx;ssh192.168.0.57'systemctlrestartNginx' #systemctlrestartkeepalived.service;ssh192.168.0.57'systemctlrestartkeepalived.service'
5、测试
1、查看地址是否在proxy1上:
#ipa 1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWNqlen1 link/loopback00:00:00:00:00:00brd00:00:00:00:00:00 inet127.0.0.1/8scopehostlo valid_lftforeverpreferred_lftforever inet6::1/128scopehost valid_lftforeverpreferred_lftforever 2:ens33:<BROADCAST,MULTICAST,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000 link/ether00:0c:29:d6:84:65brdff:ff:ff:ff:ff:ff inet192.168.0.56/24brd192.168.0.255scopeglobalens33 valid_lftforeverpreferred_lftforever inet192.168.0.100/16scopeglobalens33:1 valid_lftforeverpreferred_lftforever inet6fe80::20c:29ff:fed6:8465/64scopelink valid_lftforeverpreferred_lftforever
测试网页是否能够打开。
#foriin{1..5};docurlhttp://192.168.0.100;done <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1>
这里能够正常访问,测试通过。
2、关闭主节点的keepalived测试VIP是否能够漂移至备用节点
[root@node2keepalived]#ipa 1:lo:<LOOPBACK,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000 link/ether00:0c:29:7c:92:aebrdff:ff:ff:ff:ff:ff inet192.168.0.57/24brd192.168.0.255scopeglobalens33 valid_lftforeverpreferred_lftforever inet192.168.0.100/16scopeglobalens33:1 valid_lftforeverpreferred_lftforever inet6fe80::20c:29ff:fe7c:92ae/64scopelink valid_lftforeverpreferred_lftforever
查看VIP是否能正常访问
#foriin{1..5};docurlhttp://192.168.0.100;done <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1>
这里能够正常访问,测试通过。
5、由于我们配置的抢占模式,一旦主节点恢复,则VIP会直接漂回去。
[root@node1~]#systemctlstartkeepalived [root@node1~]#ipa 1:lo:<LOOPBACK,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000 link/ether00:0c:29:d6:84:65brdff:ff:ff:ff:ff:ff inet192.168.0.56/24brd192.168.0.255scopeglobalens33 valid_lftforeverpreferred_lftforever inet192.168.0.100/16scopeglobalens33:1 valid_lftforeverpreferred_lftforever inet6fe80::20c:29ff:fed6:8465/64scopelink valid_lftforeverpreferred_lftforever
测试VIP访问
#foriin{1..5};docurlhttp://192.168.0.100;done <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(58)</h1> <h1>Thepagefromweb1(59)</h1> <h1>Thepagefromweb1(59)</h1>
VIP地址又被主节点抢回来,服务正常访问,通过测试
最后我们来看下一下备用节点的在主节点keepalived关闭时,系统到底做了什么
##查看日志,观察VIP漂移的整个过程
1、传递MASTER的状态
2、设置自己为MASTER状态,
3、设置VIP 虚拟地址
4、发送ARP广播地址 ,地址为:192.168.0.100 #告诉大家我现在叫MASTER,对外提供服务了。
备用节点上/var/log/messages:
Nov 13 16:46:02 localhost Keepalived_vrrp[12348]: VRRP_Instance(VI_1) Transition to MASTER STATE
Nov 13 16:46:03 localhost Keepalived_vrrp[12348]: VRRP_Instance(VI_1) Entering MASTER STATE
Nov 13 16:46:03 localhost Keepalived_vrrp[12348]: VRRP_Instance(VI_1) setting protocol VIPs.
Nov 13 16:46:03 localhost Keepalived_vrrp[12348]: Sending gratuitous ARP on ens33 for 192.168.0.100
Nov 13 16:46:03 localhost Keepalived_vrrp[12348]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.0.100
Nov 13 16:46:03 localhost Keepalived_vrrp[12348]: Sending gratuitous ARP on ens33 for 192.168.0.100
Nov 13 16:46:03 localhost Keepalived_vrrp[12348]: Sending gratuitous ARP on ens33 for 192.168.0.100
Nov 13 16:46:03 localhost Keepalived_vrrp[12348]: Sending gratuitous ARP on ens33 for 192.168.0.100
Nov 13 16:46:03 localhost Keepalived_vrrp[12348]: Sending gratuitous ARP on ens33 for 192.168.0.100
Nov 13 16:46:03 localhost Keepalived_vrrp[12348]: Remote SMTP server [127.0.0.1]:25 connected.
FAQ:
Q:再/var/log/messages日志中发现:Unable to access script `killall`
A:因为centos7精简安装,没有killall命令,需要安装一下
# yum install psmisc -y
至此在CentOS7.3上完成了:keepalived 高可用Nginx,有兴趣的同学可以玩一下,有什么问题,还请批评指正。
参考博文:
原文链接:https://www.f2er.com/centos/375295.html