8.9. Haproxy+keepalived主从-主主高可用架构

8.9.1. Haproxy介绍

1)HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
2)HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
3)HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
4)HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

8.9.2. Haproxy与LVS的异同

1.两者都是软件负载均衡产品,但是LVS是基于Linux操作系统实现的一种软负载均衡,
而Haproxy是基于第三应用实现的软负载均衡

2.LVS是基于四层的IP负载均衡技术,而HAProxy是基于四层和七层技术,
可以提供TCP和HTTP应用的负载均衡综合解决方案

3.LVS工作在ISO模型的第四层,其状态监控功能单一,而HAProxy在状态检测方面
功能强大,可支持端口、URL、脚本等多种状态检测方式

4.虽然HAProxy功能强大,整体的性能低于四层负载均衡模式的LVS,而LVS拥有
接近硬件设备的网络吞吐和连接负载均衡能力

HAProxy和LVS各有优缺点,没有好坏之分,选择哪个作为负载均衡器,要以实际的应用环境来决定

8.9.3. 快速安装HAProxy集群软件

#安装haproxy
yum install haproxy -y

[root@haproxy02 etc]# which haproxy
/usr/sbin/haproxy
[root@haproxy02 etc]# whereis haproxy
haproxy: /usr/sbin/haproxy /etc/haproxy /usr/share/haproxy /usr/share/man/man1/haproxy.1.gz

[root@haproxy02 etc]# haproxy -v
HA-Proxy version 1.5.18 2016/05/10

8.9.4. Haproxy 主备机器配置文件详细如下

root@haproxy01 haproxy]# cat haproxy.cfg

global
   log 127.0.0.1 local3 info         #在本机记录日志
   maxconn 65535                     #每个进程可用的最大连接数
   chroot /var/lib/haproxy           #haproxy 安装目录
   uid 99                            #运行haproxy的用户uid(cat /etc/passwd 查看,这里是nobody的uid)
   gid 99                            #运行haproxy的用户组id(cat /etc/passwd 查看,这里是nobody组id)
   daemon                            #以后台守护进程运行
  # nbproc 2                 #进程数
   pidfile     /var/run/haproxy.pid

defaults
   log global
   mode http                         #运行模式 tcp、 http、 health
   retries 3                         #三次连接失败,则判断服务不可用
   option redispatch                 #如果后端有服务器宕机,强制切换到正常服务器
   stats uri /haproxy                #统计页面 URL 路径
   stats refresh 30s                 #统计页面自动刷新时间
   stats realm haproxy-status        #统计页面输入密码框提示信息
   stats auth admin:dxInCtFianKtL]36   #统计页面用户名和密码
   stats hide-version                 #隐藏统计页面上 HAProxy 版本信息
   maxconn 65535                     #每个进程可用的最大连接数
   timeout connect 5000              #连接超时
   timeout client 50000              #客户端超时
   timeout server 50000              #服务器端超时

listen admin_stats
    bind 0.0.0.0:8099 #监听端口
    mode http         #http的7层模式
    option httplog    #采用http日志格式
    #log 127.0.0.1 local0 err
    maxconn 10
    stats refresh 30s #统计页面自动刷新时间
    stats uri /stats #统计页面url
    stats realm XingCloud\ Haproxy #统计页面密码框上提示文本
    stats auth admin:admin #统计页面用户名和密码设置
    stats auth admin1:admin1 #统计页面用户名和密码设置
    stats hide-version #隐藏统计页面上HAProxy的版本信息
    stats admin if TRUE

frontend http-in                        #接收请求的前端虚拟节点
       bind *:80
       mode    http
       option  httplog
       log     global
       default_backend web-server        #静态服务器池


backend web-server
   mode http
   balance roundrobin                #设置负载均衡模式,source 保存 session 值,roundrobin 轮询模式
   cookie SERVERID insert indirect nocache
   option httpclose
   option forwardfor
   server web01 192.168.1.106:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
   server web02 192.168.1.107:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5

8.9.5. 配置haproxy记录日志

[root@Haproxy_Keepalived_Master ~]# vim /etc/rsyslog.conf
.......
$ModLoad imudp                       #取消注释 ,这一行不注释,日志就不会写
$UDPServerRun 514                    #取消注释 ,这一行不注释,日志就不会写
.......
local0.*                                                /var/log/haproxy.log      #这一行可以没有,可以不用写
local3.*                                                /var/log/haproxy.log      #这一行必须要写

[root@Haproxy_Keepalived_Master ~]# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r -m 0"           #接收远程服务器日志

[root@Haproxy_Keepalived_Master ~]# service rsyslog restart

统计页面信息

http://192.168.1.111:8099/stats
用户名:admin 密码:admin

image0

haproxy 启动命令

# 检查配置文件语法
haproxy -c -f /etc/haproxy/haproxy.cfg

# 以daemon模式启动,以systemd管理的daemon模式启动
haproxy -D -f /etc/haproxy/haproxy.cfg [-p /var/run/haproxy.pid]
haproxy -Ds -f /etc/haproxy/haproxy.cfg [-p /var/run/haproxy.pid]

# 启动调试功能,将显示所有连接和处理信息在屏幕
haproxy -d -f /etc/haproxy/haproxy.cfg

8.9.6. Haproxy+keepalived主从

环境介绍

image1

haproxy主机keepalived配置

[root@haproxy01 sh]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    notification_email {
        root@localhost      #健康检查报告通知邮箱
    }
    notification_email_from keepalived@localhost         #发送邮件的地址
    smtp_server 127.0.0.1       #邮件服务器
    smtp_connect_timeout 30
    route_id LVS_DEVEL
}
vrrp_script check_haproxy
{
    script "/data/sh/check_haproxy.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 151
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        check_haproxy
    }
    virtual_ipaddress {
        192.168.1.200/24
    }

}

haproxy备机keepalived配置

[root@haproxy02 sh]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    notification_email {
        root@localhost      #健康检查报告通知邮箱
    }
    notification_email_from keepalived@localhost         #发送邮件的地址
    smtp_server 127.0.0.1       #邮件服务器
    smtp_connect_timeout 30
    route_id LVS_DEVEL
}
vrrp_script check_haproxy
{
    script "/data/sh/check_haproxy.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 151
    priority 90
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        check_haproxy
    }
    virtual_ipaddress {
        192.168.1.200/24
    }

}

主备机 check_haproxy检测脚本

[root@haproxy02 sh]# cat /data/sh/check_haproxy.sh
#!/bin/bash
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ];then
    /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
    sleep 3
    if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ];then
        /etc/init.d/keepalived stop
    fi
fi

8.9.7. Haproxy+keepalived主主

image2

haproxy主机keepalived配置

 [root@haproxy01 sh]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    notification_email {
        root@localhost      #健康检查报告通知邮箱
    }
    notification_email_from keepalived@localhost         #发送邮件的地址
    smtp_server 127.0.0.1       #邮件服务器
    smtp_connect_timeout 30
    route_id LVS_DEVEL
}
vrrp_script check_haproxy
{
    script "/data/sh/check_haproxy.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
        interface eth0
        state MASTER
        nopreempt
        priority 100
        virtual_router_id 240
        lvs_sync_daemon_interface eth0
        advert_int 5             #健康检测频率
        garp_master_delay 1

        authentication {
            auth_type PASS
            auth_pass abcdefghijklmn
        }

        track_interface {
           eth0
        }

        virtual_ipaddress {
            192.168.1.200/24
        }

        track_script {
           check_haproxy
        }
    }

#VIP2
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    lvs_sync_daemon_interface eth0
    virtual_router_id 152
    priority 90
    advert_int 5
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.1.201/24
    }
    track_script {
        check_haproxy
    }
}

haproxy备机keepalived配置

 [root@haproxy02 sh]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    notification_email {
        root@localhost      #健康检查报告通知邮箱
    }
    notification_email_from keepalived@localhost         #发送邮件的地址
    smtp_server 127.0.0.1       #邮件服务器
    smtp_connect_timeout 30
    route_id LVS_DEVEL
}
vrrp_script check_haproxy
{
    script "/data/sh/check_haproxy.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
        interface eth0
        state BACKUP
        nopreempt
        priority 90
        virtual_router_id 240
        lvs_sync_daemon_interface eth0
        advert_int 5             #健康检测频率
        garp_master_delay 1

        authentication {
            auth_type PASS
            auth_pass abcdefghijklmn
        }

        track_interface {
           eth0
        }

        virtual_ipaddress {
            192.168.1.200/24
        }

        track_script {
           check_haproxy
        }
    }

#VIP2
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    lvs_sync_daemon_interface eth0
    virtual_router_id 152
    priority 100
    advert_int 5
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.1.201/24
    }
    track_script {
        check_haproxy
    }
}