实践:在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://ljohn.blog.51cto.com/11932290/1980547

废话不多说开始构建 keppalived+nginx 高可用集群

1、首先还是要准备环境

四台机器

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台机器时间同步
# ntpdate IP(ntp时钟服务器自行搭建不多介绍)
*/5 * * * * root /usr/sbin/ntpdate 192.168.1.99 &>/dev/null;hwclock -w
2、为了操作的方便后面配置对所有参与机器进行免密处理
# ssh-keygen -t rsa -P ‘‘ -f "/root/.ssh/id_rsa"
# for i in 56 57 58 59;do ssh-copy-id -i .ssh/id_rsa.pub [email protected]$i;done

2、配置realserver(web1和web2)

a、安装web程序

注意这里的realserver 可以是任何web容器(tomcat、jetty、httpd、nginx..),因为是学习,所以这里使用httpd来演示

#yum install httpd -y
#systemctl restart httpd
# netstat -nultp| grep httpd##确保httpd启动
tcp6       0      0 :::80                   :::*                    LISTEN      4619/httpd
配置页面
web1:
# echo "<h1>The page from web1(58)</h1>" > /var/www/html/index.html
web2:
# echo "<h1>The page from web1(59)</h1>" > /var/www/html/index.html

b、设置VIP及内核参数

# cat setka.sh
#!/bin/bash
vip=192.168.0.100
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
;;
stop)
ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
esac
# bash setka.sh start#运行该脚本设置相关内核参数及VIP地址。
# cat /proc/sys/net/ipv4/conf/lo/arp_ignore##内核参数设置成功
1
# cat /proc/sys/net/ipv4/conf/all/arp_announce
2
# ifconfig lo:0#VIP设置成功
lo:0      Link encap:Local Loopback
inet addr:192.168.137.10  Mask:255.255.255.255
UP LOOPBACK RUNNING  MTU:65536  Metric:1
# scp setka.sh [email protected]:/root #拷贝一份给RS2并执行
setka.sh                                                                                         100%  547     0.5KB/s   00:00

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

a、两台proxy都安装nginx

yum install -y nginx

b、配置nginx proxy

vim /etc/nginx/nginx.conf
upstream backserver {
server 192.168.0.58:80 weight=1 max_fails=3 fail_timeout=3s;
server 192.168.0.59:80 weight=2 max_fails=3 fail_timeout=3s;
}
server {
listen       80;
server_name  localhost;
location / {
root   html;
index  index.html index.htm;
proxy_pass http://backserver;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

复制一份至另一台proxy(nginx)

# scp /etc/nginx/nginx.conf [email protected]:/etc/nginx/nginx.conf
# systemctl restart nginx;ssh 192.168.0.57 ‘systemctl restart nginx’

c、测试访问

# for i in {1..10};do curl http://192.168.0.56;done
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(58)</h1>
# for i in {1..10};do curl http://192.168.0.57;done
<h1>The page from web1(59)</h1>
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>

#注:这里可以看出,每台proxy(nginx) 都完成了负载均衡配置,且实现了负载均衡调度。细心的同学发现后端real server 配置的权重1:2,调度大致请求调度返回也为1:2

4、配置keepalived 高可用nginx

a、每台proxy安装httpd 和keepalived

# yum install -y httpd keepalived

每台proxy 配置Sorry页面,这里一旦后端服务器同时无法访问,会自动调用本地的httpd服务

# echo "<h1>Sorry,Under maintances(56).</h1>" >/var/www/html/index.html
# echo "<h1>Sorry,Under maintances(57).</h1>" >/var/www/html/index.html
# 编辑各个proxy 的 nginx.conf,添加在upstream下添加
server 127.0.0.1:8080 backup;
或者:# sed -i ‘/server 192.168.0.59:80 weight=2 max_fails=3 fail_timeout=3s;/a\server 127.0.0.1:8080 backup;‘ /etc/nginx/nginx.conf

b、编辑配置文件

proxy1:

# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]    #定义邮箱报警的邮箱地址
}
notification_email_from [email protected] #定义发送报警信息的地址
smtp_server 127.0.0.1 #定义发送邮件的邮件服务器地址
smtp_connect_timeout 30 #定义发送邮件的超时时间
router_id ha_nginx #全局标识
}
vrrp_script chk_nginx {    #定义检查nginx服务的脚本
script "/etc/keepalived/chk_nginx.sh"  #脚本重启nginx,如果进程还是无法检测到,则强制停止keepalived
interval 2 #检查的间隔时间
weight -2 #检查失败的话权重减2
fall 2 #检查失败2次才认为是真正的检查失败
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100  #备用机器的keepalived的权重要小于这个权重,并且当nginx服务挂掉后100-2要小于备用机器的权重。
advert_int 1
smtp_alert #比较重要 定义使用邮件发送,不然上面的邮件定义都是没有用的,使用了这个当状态发生改变就会发送邮件报警
authentication {
auth_type PASS
auth_pass 1111
}
track_script {    #定义使用哪个脚本来检查。
chk_nginx
}
virtual_ipaddress {
192.168.0.100/16 dev=ens33
}
}

##拷贝配置文件至proxy2

# scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/keepalived.conf

proxy2:

修改keepalived.conf 如下两个参数:

state BACKUP

priority 99

#这里贴出我实验的配置

# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
notification_email {
[email protected]    #定义邮箱报警的邮箱地址
}
notification_email_from [email protected] #定义发送报警信息的地址
smtp_server 127.0.0.1 #定义发送邮件的邮件服务器地址
smtp_connect_timeout 30 #定义发送邮件的超时时间
router_id ha_nginx #全局标识
}
vrrp_script chk_nginx {    #定义检查nginx服务的脚本
script "/etc/keepalived/chk_nginx.sh" #脚本重启nginx,如果进程还是无法检测到,则强制停止keepalived
interval 2 #检查的间隔时间
weight -2 #检查失败的话权重减2
fall 2 #检查失败2次才认为是真正的检查失败
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 99  #备用机器的keepalived的权重要小于这个权重,并且当nginx服务挂掉后100-2要小于备用机器的权重。
advert_int 1
smtp_alert #比较重要 定义使用邮件发送,不然上面的邮件定义都是没有用的,使用了这个当状态发生改变就会发送邮件报警
authentication {
auth_type PASS
auth_pass 1111
}
track_script {    #定义使用哪个脚本来检查。
chk_nginx
}
virtual_ipaddress {
192.168.0.100/16 dev=ens33
}
}

c、nginx检测脚本

#脚本先判断是否有nginx进程,然后如果没有,则会重启nginx,如果进程还是无法检测到,则强制停止keepalived,启用备用节点的作为master。

#该脚本可以有效防止HA脑裂,发现无发启动nginx尝试重启,不行再将keepalived关闭,彻底移除此节点。

#cat /etc/keepalived/chk_nginx.sh
#!/bin/bash
N=`ps -C nginx --no-header|wc -l`
if [ $N -eq 0 ];then
systemctl restart keepalived
sleep 1
if [ `ps -C nginx --no-header|wc -l` -eq 0 ];then
systemctl stop keepalived
fi
fi

d、启动keepalived及nginx

# systemctl restart nginx;ssh 192.168.0.57 ‘systemctl restart nginx‘
# systemctl restart keepalived.service;ssh 192.168.0.57 ‘systemctl restart keepalived.service‘

5、测试

1、查看地址是否在proxy1上:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d6:84:65 brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.56/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
  inet 192.168.0.100/16 scope global ens33:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed6:8465/64 scope link
valid_lft forever preferred_lft forever

测试网页是否能够打开。

# for i in {1..5};do curl http://192.168.0.100;done
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>

这里能够正常访问,测试通过。

2、关闭主节点的keepalived测试VIP是否能够漂移至备用节点

[[email protected] keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:7c:92:ae brd ff:ff:ff:ff:ff:ff
   inet 192.168.0.57/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
 inet 192.168.0.100/16 scope global ens33:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe7c:92ae/64 scope link
valid_lft forever preferred_lft forever

查看VIP是否能正常访问

# for i in {1..5};do curl http://192.168.0.100;done
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>

这里能够正常访问,测试通过。

5、由于我们配置的抢占模式,一旦主节点恢复,则VIP会直接漂回去。

[[email protected] ~]# systemctl  start  keepalived
[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d6:84:65 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.56/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
  inet 192.168.0.100/16 scope global ens33:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed6:8465/64 scope link
valid_lft forever preferred_lft forever

测试VIP访问

# for i in {1..5};do curl http://192.168.0.100;done
<h1>The page from web1(59)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(58)</h1>
<h1>The page from web1(59)</h1>
<h1>The page from web1(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://forlinux.blog.51cto.com/8001278/1404936

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

时间: 2024-10-17 21:06:11

实践:在CentOS7.3部署 keepalived 高可用nginx(负载均衡)的相关文章

4、keepalived高可用nginx负载均衡

keepalived: HTTP_GET        //使用keepalived获取后端real server健康状态检测 SSL_GET(https)  //这里以为这后端使用的是http协议 TCP_CHECK 下面演示基于TCP_CHECK做检测 # man keepalived    //查看TCP_CHECK配置段 # TCP healthchecker TCP_CHECK { # ======== generic connection options # Optional IP

Haproxy+keepalived高可用、负载均衡安装部署方案

1     环境说明 前端两台haproxy+keepalived互为主从,提供高可用:另外基于不同域名访问不同的虚拟ip实现负载均衡 1.1     环境描述 服务器A(主.从):eth0:10.241.51.245   eth1:192.168.1.9 服务器B(从.主):eth2:10.241.51.246   eth1:192.168.1.10 服务器C(web01):eth0:10.241.51.247 服务器D(web02):eth0:10.241.51.248 VIP1:10.24

keepalived实现nginx的高可用 + nginx负载均衡

前言 使用集群是网站解决高并发.海量数据问题的常用手段.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求.这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力.通过负载均衡调度服务器,将来自浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈. 摘自<大型网站技术架构_核心原理与案例分析>

keepalived高可用lvs-dr 负载均衡httpd

这次实践主要是尝试:keepalived高可用lvs,完成对后端主机的负载均衡.lvs使用最为常用的DR模型,DIP,RIPs使用内网地址,节省公网IP的使用. 一.实验要求 要求任何一台代理服务器不可用时,不影响正常访问,任何一台真实主机服务不可用时,不影响正常访问. 二.实验环境 这里假设192.168.0.0/24作为外网地址(因为它确实能连接外网),192.168.100.0/24作为内网网络,前端代理放置在外网,真实服务器放在内网.这样设计可以使用更少的IP完成架构.这里要注意的是:1

lvs+keepalived 高可用及负载均衡

一.环境准备 VIP:10.18.43.30 dr1:10.18.43.10 dr2:10.18.43.20 web1:10.18.43.13 web2:10.18.43.14 结构图 (一).预处理 (1).关闭所有机器selinux, vim /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: #

部署keepalived高可用服务

keepalived服务概念说明 keepalived软件能干什么?Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能 Keepalived软件主要是通过VRRP协议实现高可用功能的. VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写, VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时, 整个网络可以不间断地

Centos7+Lvs+keeplived实现Apache高可用的负载均衡

近期一直在练习Linux相关的服务部署,前面文章也介绍了一部分Linux的相关日常服务,今天我们就介绍Centos7+Lvs+keeplived实现Apache高可用的负载均衡,其实该功能对于一个企业运维人员来说是必须要掌握的技能,而且要熟悉相关负载均衡及高可用的相关参数,这样才可以部署出一个属于特殊环境的配置应用,我们都知道lvs.nginx.haproxy可以实现应用的负载均衡,但是不能实现单点故障,所以我们还需要借助一个应用就是keepalived,当然我们见的最多的就是lvs+keepa

高可用集群技术之keepalived实现lvs高可用并负载均衡web服务

Keepalived概述: Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器. keepalived实现lvs高可用并负载均衡web服务: 准备工作: 2台keepalived节点为: node1.samlee.com

(tengine+keepalived)+(apache+tomcat)+memcached+mysql实现高可用、负载均衡、可扩展架构

目录 1.高可用.负载均衡.可扩展架构的需要背景 2.系统架构 3.系统规划及说明 4.系统部署及测试 5.总结 1.高可用.负载均衡.可扩展架构的需要背景 从互联网诞生以来,网站架构随着互联网的快速发展发生着巨大的变化,现今,数据每天都在以爆炸式的增长,大数据.云计算等概念被业内炒得沸沸扬扬,这些前沿技术也在各行各业落地开花.每一种新技术的提出几乎都会或多或少影响着IT的基础架构,面对数据的快速增长.我们急需一套高可用.负载均衡.可扩展的架构来作为支撑. 2.系统架构 此次博文介绍一套高可用.