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

一、keepalived简介

Keepalived是基于vrrp协议的一款高可用软件。Keepailived有一台主服务器和多台备份服务器,在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟IP地址对外提供服务,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器。

VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议),VRRP是为了解决静态路由的高可用。VRRP的基本架构
虚拟路由器由多个路由器组成,每个路由器都有各自的IP和共同的VRID(0-255),其中一个VRRP路由器通过竞选成为MASTER,占有VIP,对外提供路由服务,其他成为BACKUP,MASTER以IP组播(组播地址:224.0.0.18)形式发送VRRP协议包,与BACKUP保持心跳连接,若MASTER不可用(或BACKUP接收不到VRRP协议包),则BACKUP通过竞选产生新的MASTER并继续对外提供路由服务,从而实现高可用。

二、配置简介

主机架构:

系统环境:CentOS6.8

前端两台主机承担负载均衡任务,ip分别为192.168.10.137和192.168.10.138,对外暴露ip代理后端nginx的内容。

后端两台主机为实际访问内容,ip分别为192.168.10.145和192.168.10.146,只允许前端两台主机对80端口的访问。

实验步骤:

1.配置keepalived

2.配置haproxy

3.配置nginx

4.配置iptables规则

三、配置keepalived

配置之前关闭selinux

# setenforce 0 

为实验简洁,我这里直接采用yum安装

# yum -y install epel-release #安装epel拓展源

# yum -y install keepalived #安装keepalived

更改配置文件内容

# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #更改初始设置文件,可以直接删除

# vim /etc/keepalived/keepalived.conf #更改配置内容

ip为192.168.10.137的配置内容如下:

! Configuration File for keepalived

global_defs { #global_defs区域,主要是配置故障发生时的通知对象以及机器标识
    notification_email { #notification_email 故障发生时给谁发邮件通知。
        testmail@qq.com
}
    notification_email_from testmail@qq.com  #notification_email_from 通知邮件从哪个地址发出。
    smtp_server 127.0.0.1 #smpt_server 通知邮件的smtp地址。
    smtp_connect_timeout 30 #smtp_connect_timeout 连接smtp服务器的超时时间。
    router_id nginx1  #router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。
}

vrrp_instance VI_1 { #vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。
    state BACKUP  #可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
    virtual_router_id 102 #virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播。
    interface eth2 #节点固有IP(非VIP)的网卡,用来发VRRP包。
    mcast_src_ip 192.168.10.137 #mcast_src_ip 修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的)
    priority 100 #用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)。
    advert_int 1 #advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。
    nopreempt  #nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动。故障恢复时不抢占。
    authentication {  #authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
        auth_type PASS
        auth_pass 1234
    }

virtual_ipaddress { #vip,虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。
    192.168.10.101
    }
}

ip为192.168.10.138的配置内容如下:

! Configuration File for keepalived

global_defs {
    notification_email {
        testmail@qq.com
}
    notification_email_from testmail@qq.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id nginx2
}

vrrp_instance VI_1 {
    state BACKUP
    virtual_router_id 102 #同一组播中的id相同
    interface eth2
    mcast_src_ip 192.168.10.138 #本机地址
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }

virtual_ipaddress {
    192.168.10.101
    }
}

两台主机之间的iptables访问规则配置

192.168.10.137上

# iptables -I INPUT -s 192.168.10.138/24 -d 224.0.0.18 -j ACCEPT  #允许组播地址通信

# iptables -I INPUT -s 192.168.10.138/24 -p vrrp -j ACCEPT   #允许VRRP(虚拟路由器冗余协)通信

192.168.10.138上

# iptables -I INPUT -s 192.168.10.137/24 -d 224.0.0.18 -j ACCEPT  #允许组播地址通信

# iptables -I INPUT -s 192.168.10.137/24 -p vrrp -j ACCEPT   #允许VRRP(虚拟路由器冗余协)通信

如果没设置好容易脑裂,要注意哦!

设置好之后可以两台主机都启动keepalived查看配置是否正确

192.168.10.137先启动keepalived,否则另一台主机会先抢占VIP

# service keepalived start 

192.168.10.137的eth2网卡已经绑定VIP

192.168.10.138的eth2网卡未抢占VIP

当192.168.10.137上关闭keepalived服务时

# service keepalived stop

192.168.10.137的eth2网卡VIP消失

192.168.10.138的eth2网卡抢占VIP

三、配置haproxy

详细参数说明请看本人的HAProxy安装与配置(实现nginx负载均衡)

两台主机安装haproxy

# yum -y install haproxy 

配置文件路径为/etc/haproxy/haproxy.cfg

配置文件内容除globaldefaults下的设置其余的都可以注释掉

192.168.10.137添加以下内容

############WEB服务配置##################
listen webha80 #监听名称自定义
bind 0.0.0.0:80 #监听80端口
mode http #模式为http
option httplog #记录访问日志
log global #日志记录为全局的设置
maxconn 3000 #最大的连接数为3000
balance roundrobin #负载均衡模式为轮询
server nginx1 192.168.10.145:80 weight 2 rise 2 fall 3 #nginx1权重为2, 连续2次请求正常加入负载,失败3次即判定服务器宕机
server nginx2 192.168.10.146:80 weight 1 rise 2 fall 3 #nginx2权重为1, 连续2次请求正常加入负载,失败3次即判定服务器宕机

192.168.10.138添加以下内容

############WEB服务配置##################
listen webha80 #监听名称自定义
bind 0.0.0.0:80 #监听80端口
mode http #模式为http
option httplog #记录访问日志
log global #日志记录为全局的设置
maxconn 3000 #最大的连接数为3000
balance roundrobin #负载均衡模式为轮询
server nginx1 192.168.10.145:80 weight 1 rise 2 fall 3 #nginx1权重为1, 连续2次请求正常加入负载,失败3次即判定服务器宕机
server nginx2 192.168.10.146:80 weight 2 rise 2 fall 3 #nginx2权重为2, 连续2次请求正常加入负载,失败3次即判定服务器宕机

配置差别以便在发生故障时切换辨认主机,实际生产环境配置一般情况下请保持一致。

启动haproxy

# service haproxy start

启动完毕后查看端口监听状态,确定配置正确

# netstat -tnlp #80端口被haproxy占用

四、配置nginx

# yum -y install epel-release 

# yum -y install nginx 

# service nginx start

nginx1上 

# echo "this is nginx111111111111111" > /usr/share/nginx/html/index.html  #修改index.html以便验证轮询效果

#  iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 80 -j ACCEPT #允许haproxy对80端口的访问

nginx2上

# echo "this is nginx22222222222222" > /usr/share/nginx/html/index.html 

# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 80 -j ACCEPT

五、配置前端iptables规则

192.168.10.137和192.168.10.138上添加规则

# iptables -I INPUT -p tcp --dport 80 -j ACCEPT #允许所有的80端口请求

前端代理主机iptables规则表:

后端nginx主机iptables规则表:

六、访问测试

当正常情况下,192.168.10.137因为优先级高于192.168.10.138,此时它的eth2网卡绑定VIP,用浏览器对VIP--192.168.10.101进行访问,每三次访问页面出现“this is nginx111111111111111”为2次,“this is nginx22222222222222”为1次。而当关闭137主机上的keepalived时(模拟服务器故障),138主机抢占VIP--192.168.10.101,则每三次访问页面出现“this is nginx111111111111111”为1次,“this is nginx22222222222222”为2次。

 

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值