请选择 进入手机版 | 继续访问电脑版
  • 关注官方微信 微信公众号 添加方式:
    1:搜索微信号(gogolinux
    2:扫描左侧二维码
  • 登录 注册
  • 一起学LINUX - GOGOLINUX

    查看: 474|回复: 0

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

    [复制链接]

    3162

    主题

    3168

    帖子

    9878

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    9878
    发表于 2019-6-20 16:14:47 | 显示全部楼层 |阅读模式
    一、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

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

    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次。
    ---------------------
    作者:草莓甜甜圈
    来源:CSDN
    原文:https://blog.csdn.net/qq_39626154/article/details/84542236
    版权声明:本文为博主原创文章,转载请附上博文链接!
    分享到:
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    官方微博:

    官方头条号:

    官方微信

    手机访问:

    官方微信

    QQArchiver 手机版 小黑屋 一起学LINUX - GOGOLINUX 闽ICP备18025837号-1 Discuz! X3.4 Powered by © 2001-2013 Comsenz Inc. 

    本站资源均来自互联网或会员发布,如果侵犯了您的权益请与我们联系,我们将在24小时内删除!谢谢!

    快速回复 快速发帖 返回顶部 返回列表