【Keepalived+haproxy+nginx 常用案例】

介绍

1. HAProxy

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理(mode : http or tcp )。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进当前的架构中, 同时可以保护web服务器不被暴露到网络上。

2. Keepalived

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现。

3. VRRP协议

在现实的网络环境中,两台需要通信的主机大多数情况下并没有直接的物理连接。对于这样的情况,它们之间路由怎样选择?主机如何选定到达目的主机的下一跳路由,这个问题通常的解决方法有两种:

3.1 在主机上使用动态路由协议(RIP、OSPF等)

3.2 在主机上配置静态路由

很明显,在主机上配置动态路由是非常不切实际的,因为管理、维护成本以及是否支持等诸多问题。配置静态路由就变得十分流行,但路由器(或者说默认网关default gateway)却经常成为单点故障。VRRP的目的就是为了解决静态路由单点故障问题,VRRP通过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。

业务场景的瓶颈

keepalived+nginx 搭建

本次需要准备两台虚拟机,和3个ip地址. 两台机器分别担任 master 和backup 的角色

vip

192.168.182.155

master

192.168.182.150

backup

192.168.182.152

  说明:Keepalived是服务器一种高性能且轻量级的高可用或热备解决方案,通过VRRP协议(虚拟路由冗余协议)来防止服务器静态路由单点故障的发生,结合Nginx可以实现WEB前端服务的高可用。

  1. 基础

    A. 用途

      故障转移:实现负载均衡中MASTER主机BACKUP主机之间的故障转移和自动切换;

      心跳检测:负载均衡定期检查RS服务器的可用性决定是否给其分发请求;

    B. VRRP(Vritrual Router Redundancy Protocol)协议:是一种容错协议,为了解决静态路由的单点故障;是通过一种竞选协议机制来将路由任务交给某台VRRP路由器,通过优先级来确定MASTER和BACKUP;保证当主机的下一条路由器出现故障时,由另一台路由器来替代出现故障的路由器进行工作,从而保证网络通信的连续性和可靠性,而且自身使用了加密协议;

    C. 故障切换转移原理:在Keepalived正常工作时,MASTER节点会不断的向BACKUP节点发送心跳消息,用来告诉BACKUP节点自己还活着,当MASTER节点发生故障时,BACKUP节点就无法继续检测到MASTER节点的心跳,进而调用自身的接管程序,接管MASTER节点的IP资源和服务,当MASTER节点恢复故障时,BACKUP节点会释放MASTER节点故障时自身接管的IP资源和服务,恢复到原来的自身的备用角色;

    D. 工作方式分类

      抢占式(默认模式):MASTER以组播方式不断的向虚拟路由器组内发送自己的心跳报文,一旦BACKUP在设定时间内没有收到心跳信息的次数超过了限定次数,则会将MASTER的所有权转移到优先级最高的BACKUP;

      非抢占模式:指只有在主节点完全故障时才能将BACKUP变为MASTER

2.Keepalived搭建(150和152都需执行以下操作)

本次是为了,使用配置 ,安装采用的yum 方式简单.生产中可以自行替换成源码包安装.

1.安装keepalived:yum -y install keepalived

  1. 修改配置,指定vip和网卡

master 150 :

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
 
global_defs {
   router_id server1            #需要改,设备的id号,可以随意写,单主备不能一样
}
 
vrrp_script  check_ngx {
#    script "killall -0  nginx"
    script "/etc/keepalived/nginx_check.sh"
 
    interval  1  #间隔时间1s检测一次
    weight  -20
}
vrrp_instance VI_2 {
    state MASTER                #可能要改,是否是主master,从backup
    nopreempt         #非抢占模式
    interface ens33             #需要改, 写对应主机的网卡
    virtual_router_id 66        #不需要修改,主备必须保持一直
    priority 105                #可能要改
    unicast_src_ip  192.168.182.150#需要改,本设备ip地址
    unicast_peer {
       192.168.182.152          #需要,对端的ip地址
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.182.155/24      #需要改,所虚拟出来的vrrp ip
    }
    track_script {
        check_ngx
    }
}

backup 152 :

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id server2            #需要改,设备的id号,可以随意写,单主备不能一样
}

vrrp_script  check_ngx {
#    script "killall -0  nginx"
    script "/etc/keepalived/nginx_check.sh"
    interval  1  #间隔时间1s检测一次
    weight  -20
}
vrrp_instance VI_2 {
    state BACKUP                #可能要改,是否是主master,从backup
    nopreempt         #非抢占模式
    interface ens33             #需要改, 写对应主机的网卡
    virtual_router_id 66        #不需要修改,主备必须保持一直
    priority 100                #可能要改
    unicast_src_ip  192.168.182.152#需要改,本设备ip地址
    unicast_peer {
       192.168.182.150          #需要,对端的ip地址 
    }
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.182.155/24      #需要改,所虚拟出来的vrrp ip
    }
    track_script {
        check_ngx
    }
}

3.Nginx 搭建

自行安装吧,最小化即可,起到测试功能.nginx 安装网上很多,源码包安装也很快.

场景:

keepalived脑裂现象

    A. 现象:脑裂指由于某些原因(如网络差、防火墙开启等),导致多台keepalived的服务器在指定时间内无法检测到对方存活心跳信息(事实上服务器还是存活状态),从而导致相互抢占对方的资源和服务所有权的现象;

    B. keepalived监控nginx:Nginx宕机会导致用户请求失败,但是keepalived不会进行切换,故需要编写检测nginx是否存活的脚本,shell脚本无固定格式,可以按照场景编写.

书写上面定义好的 检测脚本(这个是简化的,可根据公司场景自行编写)

vim /etc/keepalived/nginx_check.sh

#!/bin/sh
# 判断nginx是否关闭
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
    #systemctl stop keepalived
    pkill keepalived
fi

给对应的脚本,赋予执行权限

chmod +x /etc/keepalived/nginx_check.sh

4.启动服务,验证

启动 nginx 服务,(请提前编辑可区分的 index.html ,便于区分转发请求).

启动keepalived:systemctl start keepalived;

5.验证

定义的 vip 地址 是 192.168.182.155 ,端口是默认的80 转发.

可以在浏览器上访问,http://192.168.182.155

也可以在linux 里面访问: curl 192.168.182.155/index.html

停掉 150 上的 nginx 检查 ip 是否跳转到了 152 主机上,并进行访问请求,验证访问内容是否跳转.

haproxy+nginx 搭建

介绍:

这里使用 haproxy 替代 keepalived 进行负载的转发.实现高可用.

场景概述:

这里依旧沿用上个实验分配的角色和主机ip地址.把 keepalived 停掉即可.vip 本次不使用

systemctl stop keepalived.service #el7 停keepalived 服务

systemctl status keepalived.service #查实

1.安装 haporxy (150 和 152 都需要执行以下操作)

采用最简化方式安装,旨在介绍调度功能的使用,生产中建议使用源码包安装.安装方式这里不在记录

yum install haproxy -y

2.HAProxy配置/etc/haproxy/haproxy.cfg

vim /etc/haproxy/haproxy.cfg #默认,建议修改即备份

master 150 主机:

global
#全区日志配置 使用rsyslog的local3设备
log 127.0.0.1 local3 info
#工作目录(安全)
chroot /var/lib/haproxy
#pid文件存储目录
pidfile /var/run/haproxy.pid
#后台进程数量
nbproc 1
#每个进程最大并发数
maxconn 40000
user haproxy
group haproxy
#后台程序模式工作
daemon
 
defaults
#mode 指定是7层还是4层(tcp  or  http)
mode http
#后端连接重试次数,超出标识不可用
retries 3
#连接服务器最长等待时间
timeout connect 10s
#客户端发送请求最长等待时间
timeout client 30s
#服务器会复客户端最长等待时间
timeout server 30s
#对后端服务器的检测超时时间
timeout check 10s
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
option abortonclose
#定义HAProxy监控页面
listen admin_stats
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local3 err
#HAProxy监控页面统计自动刷新时间。
stats refresh 30s
#设置监控页面URL路径。 http://IP:9188/haproxy-status可查看
stats uri /haproxy-status
#统计页面密码框提示信息
stats realm welcome login\ Haproxy
#登录统计页面用户和密码
stats auth admin:123456
#隐藏HAProxy版本信息
stats hide-version
#设置TURE后可在监控页面手工启动关闭后端真实服务器
stats admin if TRUE
 
#定义前端虚拟节点,名称可以自定义,只是一个标识作用,www
frontend www
#监听端口,1.1.1.1:80 | 0.0.0.0:80 | *.80
bind *:8080
mode http
#启用日志记录HTTP请求。
option httplog
#启用后后端服务器可以获得客户端IP
option forwardfor
#客户端和服务器完成一次连接请求后,HAProxy主动关闭TCP链接(优化选项)
option httpclose
#使用全局日志配置
log global
 
#acl 访问控制列表,和 nginx 的 rewrite 功能类似,html 是自定义的,表示这个规则的标签
acl html url_reg -i \.html$
#判断如果满足 定义的 html acl 访问控制,就转发到后端服务器组, htmppol 集群组上
use_backend htmpool if html
#指定后端服务池(backend定义htmpool)
default_backend htmpool
 
#定义后端真实服务器(定义后端转发的一个标签,上面default 模块指定)
backend htmpool
mode http
#用于cookie保持环境。(如后端服务器故障,客户端cookie不会刷新,用此来把用户请求强制定向到正常服务器)
option redispatch
#负载均衡很高时,自动结束当前队列处理时间长的连接
option abortonclose
#负载均衡算法
balance roundrobin
#允许向cookie插入SERVERID.下面server可以使用cookie定义,也可以加上 insert indirect nocache ,作用是返回给用户的回复信息最中
cookie SERVERID
#启用HTTP服务状态检测功能 (后端服务器一定要存在此文件,不然haproxy认为其故障),就上面定义校验三次使用的方式
option httpchk GET /index.html
#后端服务设置,web1 ,web2 定义服务器再haporyx 的名称;
server web1 192.168.182.150:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server web2 192.168.182.152:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3

backup 152 主机:

global
#全区日志配置 使用rsyslog的local3设备
log 127.0.0.1 local3 info
#工作目录(安全)
chroot /var/lib/haproxy
#pid文件存储目录
pidfile /var/run/haproxy.pid
#后台进程数量
nbproc 1
#每个进程最大并发数
maxconn 40000
user haproxy
group haproxy
#后台程序模式工作
daemon
 
defaults
#mode 指定是7层还是4层(tcp  or  http)
mode http
#后端连接重试次数,超出标识不可用
retries 3
#连接服务器最长等待时间
timeout connect 10s
#客户端发送请求最长等待时间
timeout client 30s
#服务器会复客户端最长等待时间
timeout server 30s
#对后端服务器的检测超时时间
timeout check 10s
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
option abortonclose
#定义HAProxy监控页面
listen admin_stats
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local3 err
#HAProxy监控页面统计自动刷新时间。
stats refresh 30s
#设置监控页面URL路径。 http://IP:9188/haproxy-status可查看
stats uri /haproxy-status
#统计页面密码框提示信息
stats realm welcome login\ Haproxy
#登录统计页面用户和密码
stats auth admin:123456
#隐藏HAProxy版本信息
stats hide-version
#设置TURE后可在监控页面手工启动关闭后端真实服务器
stats admin if TRUE
 
#定义前端虚拟节点,名称可以自定义,只是一个标识作用,www
frontend www
#监听端口,1.1.1.1:80 | 0.0.0.0:80 | *.80
bind *:8080
mode http
#启用日志记录HTTP请求。
option httplog
#启用后后端服务器可以获得客户端IP
option forwardfor
#客户端和服务器完成一次连接请求后,HAProxy主动关闭TCP链接(优化选项)
option httpclose
#使用全局日志配置
log global
 
#acl 访问控制列表,和 nginx 的 rewrite 功能类似,html 是自定义的,表示这个规则的标签
acl html url_reg -i \.html$
#判断如果满足 定义的 html acl 访问控制,就转发到后端服务器组, htmppol 集群组上
use_backend htmpool if html
#指定后端服务池(backend定义htmpool)
default_backend htmpool
 
#定义后端真实服务器(定义后端转发的一个标签,上面default 模块指定)
backend htmpool
mode http
#用于cookie保持环境。(如后端服务器故障,客户端cookie不会刷新,用此来把用户请求强制定向到正常服务器)
option redispatch
#负载均衡很高时,自动结束当前队列处理时间长的连接
option abortonclose
#负载均衡算法
balance roundrobin
#允许向cookie插入SERVERID.下面server可以使用cookie定义,也可以加上 insert indirect nocache ,作用是返回给用户的回复信息最中
cookie SERVERID
#启用HTTP服务状态检测功能 (后端服务器一定要存在此文件,不然haproxy认为其故障),就上面定义校验三次使用的方式
option httpchk GET /index.html
#后端服务设置,web1 ,web2 定义服务器再haporyx 的名称;
server web1 192.168.182.150:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server web2 192.168.182.152:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3

3.服务的启停

systemctl stop haproxy.service #停 el7

systemctl start haproxy.service #启 el7

systemctl status haproxy.service #查 el7

4.开启日志 (可选项)

(日志如果在主机性能较弱的情况下,最好关闭)

vim /etc/rsyslog.d/haproxy.conf

$ModLoad imudp

$UDPServerRun 514

local3.* /var/log/haproxy

systemctl restart rsyslog

如果没有开启,就在 linux系统日志里查看相应的日志, less /var/log/messages

5.开启防火墙策略(可选)

(一般直接内网访问的,直接就把软放给关掉了,如果有特殊场景在外网暴漏,可按需求放开指定ip和端口)

firewall-cmd --permanent --add-port=80/tcp

firewall-cmd --permanent --add-port=9188/tcp

firewall-cmd --reload

setsebool -P haproxy_connect_any=on

#getsebool -a | grep haproxy 查看

6.haproxy 前端管理页面

http://192.168.182.152:9188/haproxy-status #ip 根据自己实际ip 访问.

7.验证

watch -n 0.5 'curl 192.168.182.152:8080' #因为这里定义的是监听了 8080 端口

watch -n 0.5 'curl 192.168.182.150:8080'

可以把其中一台的nginx 关掉,看看还能不能访问,跳转是否符合预期.

keepalived+haproxy+nginx 高可用

后续更新....

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值