实践:在CentOS7.3部署 keepalived 高可用nginx负载均衡

背景:

既然有了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)

拓扑

spacer.gif

b99635652a623d2b48bcb4da7f1fe025.jpg

注:

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

3、配置nginx proxy1和2 负载均衡

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,有兴趣的同学可以玩一下,有什么问题,还请批评指正。


参考博文:

http://www.jb51.cc/article/p-vmlmapln-eo.html

http://www.178linux.com/75428

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


linux下开机自启: 在/etc/init.d目录下新建文件elasticsearch 并敲入shell脚本: 注意, 前两行必须填写,且要注释掉。 第一行为shell前行代码,目的告诉系统使用shell。 第二行分别代表运行级别、启动优先权、关闭优先权,且后面添加开机服务会用到。 shell脚本
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2、赋予脚本可执行权限假设/usr/local/script/autostart.sh是你的脚本路径,给予执行权限 chmod +x /usr
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用ls -ll,会显示成字节大小,而ls- lh会以KB、MB等为单位进行显示,这样比较直观一些。 通过命令du -h –max-depth=1 *,可以查看当前目录下各文件、文件夹的大小,这个比较实用。 查询当前目录总大小可以使用d
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一但shell关闭网站也就关闭了,所以要配置守护进程, 用的是Supervisor,本文主要记录配置的过程和过程遇到的问题 安装Supervisor&#160;1 yum install python-setuptools
设置时区(CentOS 7) 先执行命令timedatectl status|grep &#39;Time zone&#39;查看当前时区,如果不是时区(Asia/Shanghai),则需要先设置为中国时区,否则时区不同会存在时差。 #已经是Asia/Shanghai,则无需设置 [root@xia
vim&#160;/etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO=&quot;static&quot; ONBOOT=yes IPADDR=192.168.8.106 NETMASK=255.255.252.0 GATEWAY=192.168.
一、安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装 [root@localhost local]# yum install -y gcc 二、下载并解压安装包 [root@localhost local
第一步 On CentOS/RHEL 6.*: $ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm On CentOS/RHEL 7: $
/// &lt;summary&gt; /// 取小写文件名后缀 /// &lt;/summary&gt; /// &lt;param name=&quot;name&quot;&gt;文件名&lt;/param&gt; /// &lt;returns&gt;返回小写后缀,不带“.”&lt;/ret
which nohup .bash_profile中并source加载 如果没有就安装吧 yum provides */nohup nohup npm run start &amp; nohup ./kibana &amp;
1.1 MySQL安装 1.1.1 下载wget命令 yum -y install wget 1.1.2 在线下载mysql安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 1.1.3 安装My
重启 reboot shutdown -r now init 6 关闭 init 0 shutdown -h now shutdown -h 20:25 #8点25关机查看内存 free CPU利用率 top 日期 date 设置时间 date 033017002015 #月日时间年 日历 cal
1、firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : systemctl disable firewalld 开机启用 :
1 下载并安装MySQL官方的&#160;Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 使用上面的命令就直接下载了安装用的Yum Repository,大概
CentOS6.x CentOS6中转用Upstrat代替以前的init.d/rcX.d的线性启动方式。 一、相关命令 通过initctl help可以查看相关命令 [root@localhost ~]# initctl help Job commands: start Start job. sto
1、使用命令:df -lk 找到已满磁盘 2、使用命令:du --max-depth=1 -h 查找大文件,删除
ifconfig:查看网卡信息 网卡配置文件位置: /etc/sysconfig/network-scripts/文件夹 nmtui:配置网卡 netstat -tlunp:查看端口信息 端口信息存储位置: /etc/services文件 route:查看路由信息 wget:下载网路文件,例如 wg
ps -ef:查看所有进程,&#160;ps -ef |grap firewalld 查看与firewalld相关的进程 which :查看进程:which firewalld kill 进程id:杀掉进程 kill 640,强制杀:kill -9 640 man:查看帮助,例如 man ps 查看
useradd:添加用户 useradd abc,默认添加一个abc组 vipw:查看系统中用户 groupadd:添加组groupadd ccna vigr:查看系统中的组 gpasswd:将用户abc添加到ccna组 gpasswd -a abc ccna groups abc:查看用户abc属