淘先锋技术网

首页 1 2 3 4 5 6 7

架构图

在这里插入图片描述

环境

  • HAproxy1 192.168.100.10
  • HAproxy2 192.168.100.11
  • html1 192.168.100.12
  • html2 192.168.100.13
  • PHP1 192.168.100.14
  • PHP2 192.168.100.15
  • VIP 192.168.100.16

html1和html2与php1和php2配置

为了实验方便,全部使用httpd服务

[root@html1 ~]# yum -y install httpd
[root@html1 ~]# echo html1 > /var/www/html/index.html
[root@html1 ~]# systemctl start httpd

[root@html2 ~]# yum -y install httpd
[root@html2 ~]# echo html2 > /var/www/html/index.html
[root@html2 ~]# systemctl start httpd

[root@PHP1 ~]# yum -y install httpd
[root@PHP1 ~]# echo PHP1 > /var/www/html/index.php
[root@PHP1 ~]# systemctl start httpd

[root@PHP2 ~]# yum -y install httpd
[root@PHP2 ~]# echo PHP2 > /var/www/html/index.php
[root@PHP2 ~]# systemctl start httpd

HAproxy配置

HAproxy1上

安装相关软件

[root@haproxy1 ~]# yum -y install haproxy keepalived

修改haproxy配置文件

[root@haproxy1 ~]# vim /etc/haproxy/haproxy.cfg

配置内容:

global                                              #全局配置
    log 127.0.0.1 local3 info                       #日志配置
    maxconn 4096                                    #最大连接限制(优先级低),同时服务多少连接
    user nobody                                     #用户
    group nobody                                    #用户组
    daemon                                          #守护进程运行
    nbproc 1                                        #haproxy进程数,设置应该和服务器本身核心数一样,过多的进程数可能导致经常崩溃
    pidfile /run/haproxy.pid                        #进程id存储位置
defaults                                            #针对(listen和backend块进行设置如果块中没设置,则使用默认设置)默认设置
    log global										#日志使用全局配置
    mode    http                                    #模式7层LB
    maxconn 2048                                    #最大连接数(优先级中)
    retries 3                                       #健康检查。三次连接失败就认为连接不可用
    option  redispatch                              #服务不可用后的操作,重定向到其他健康服务器
    timeout connect 5000                            #(重传计时器)定义haproxy将用户端!!!请求!!!转发至后端服务器,所等待的时间时长
    timeout client 50000                            #(向后长连接)haproxy作为客户,和后端服务器之间!!!空闲连接!!!的超时时间,到时候发送fin指令
    timeout server 50000                            #(向前长连接)haproxy作为服务器,和用户之间空闲连接的超时时间,到时候发送fin指令
    option abortonclose                             #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
    stats uri /admin?stats                          #设置统计页面的uri为/admin?stats
    stats realm Private lands                       #设置统计页面认证时的提示内容
    stats auth admin:password                       #设置统计页面的用户名和密码,如果要设置多个,另起一行写入即可
    stats hide-version                              #隐藏统计页面上的haproxy版本信息
frontend http-in                                    #前端用户块,面对用户侧
    bind 0.0.0.0:80                                 #监听的端口
    mode http                                       #http模式的负载均衡(七层)
    log global                                      #日志类型跟随全局
    option httplog                                  #日志类型http日志格式
    option httpclose                                #打开支持主动关闭功能,每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟这种模式的实现        
    acl php url_reg -i \.php$                       #acl<ACL名字><类型><大小写><规则>
    acl html url_reg -i \.html$                     #html:访问控制列表的名称 url_reg:用户输入的url地址可以被reg正则服>-i:忽略大小写 \.html$:匹配规则,>上同
    use_backend php-server if php                   #use_backend <服务器组> if <ACL名字>
    use_backend html-server if html                 #如果满足ACL html规则,则推送给后端服务器后台,html-server,上同
    default_backend html-server                     #负载均衡的方式
backend php-server                                  #后端服务器统称
    mode http                                       #http模式(七层)
    balance roundrobin                              #负载均衡的方式(轮询)
    option httpchk GET /index.php                   #健康检查(访问后端服务器网页,如果访问到则说明是好的,配合前面的尝试三次)
    cookie SERVERID insert indirect nocache         #客户端的cookie信息,将真实服务器ID回复给客户的消息中
    server php-A 192.168.100.14:80 weight 1 cookie 1 check inter 2000 rise 2 fall 5
    server php-B 192.168.100.15:80 weight 1 cookie 2 check inter 2000 rise 2 fall 5
    #wegit 1 权重为1
    #cookie 1 标识serverid为1
    #check inter 2000 检测心跳频率
    #rise 2 2次正确认为服务器可用
    #fall 5 5次失败认为服务器不可用
backend html-server
    mode http
    balance roundrobin
    option httpchk GET /index.html
    cookie SERVERID insert indirect nocache
    server html-A 192.168.100.12:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
    server html-B 192.168.100.13:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
[root@haproxy1 ~]# systemctl start haproxy
[root@haproxy1 ~]# systemctl status haproxy

HAproxy2上

HAproxy2一样的配置

中段测试

在浏览器中访问:
http://192.168.100.10
http://192.168.100.11
http://192.168.100.10/index.php
http://192.168.100.11/index.php
如果能访问到相应的内容,则继续

Keepalived配置

HAproxy1上

更改配置位置

[root@HAproxy1 ~]# vim /etc/keepalived/keepalived.conf

配置如下:

! Configuration File for keepalived             #配置文件声明,前面不得有空行或者空格
global_defs {
        router_id 1                             #设备在组中的标识
}

vrrp_script chk_haproxy {                         #检查健康
        script "/etc/keepalived/ck_ha.sh"       #检查脚本
        interval 2                              #检查频率(秒)
        weight -5                               #降低优先级
        fall 3                                  #失败三次
}

vrrp_instance VI_1 {                            #VI_1。实例名两台路由器相同。注意区分
        state MASTER                            #主或者从状态
        interface ens32                         #监控网卡
        mcast_src_ip 192.168.100.10             #心跳源IP
        virtual_router_id 55                    #虚拟路由编号,主备要一致,注意区分
        priority 100                            #优先级
        advert_int 1                            #心跳间隔

        authentication {                        #秘钥认证(1-8位)
                auth_type PASS
                auth_pass 123456
        }

        virtual_ipaddress {                     #VIP
                192.168.100.16/24
        }

        track_script {                          #引用脚本
                chk_haproxy
        }
}

编写监控http服务脚本

[root@haproxy1 ~]# vim /etc/keepalived/ck_ha.sh

内容如下:

#!/bin/bash
#检查haproxy进程是否存在
counter=$(ps -C haproxy --no-heading | wc -l)
if [ "${counter}" = "0" ];then
        #尝试启动一次haproxy,停止5秒后再次检测
        service haproxy start
        sleep 5
        counter=$(ps -C haproxy --no-heading | wc -l)
        if [ "${counter}" = "0" ];then
                #如果没有启动成功,就杀掉keepalived触发主备切换
                service keepalived stop
        fi
fi

添加执行权限

[root@haproxy1 ~]# chmod +x /etc/keepalived/ch_ha.sh
[root@haproxy1 ~]# systemctl start keepalived.service

HAproxy2上

HAproxy2的配置相同,只有keepalived的配置文件中稍作改动

router_id 2
state BACKUP
mcast_src_ip 192.168.100.11
priority 99

测试

在浏览器中访问:
http://192.168.100.16
http://192.168.100.16/index.php

将HAproxy1的haproxy服务stop掉,会发现隔5秒内会自动启动
将keepalived服务stop掉会发现VIP飘到了HAproxy2上