一、haproxy和keepalived的解释及本次实验的拓扑图:

1、haproxy:haproxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。

2、haproxy的特性:客户端侧的长连接(client-side keep-alive);TCP加速(TCP speedups); 响应池(response buffering);RDP协议;基于源的粘性(source-based stickiness);更好的统计数据接口(a much better stats interfaces);更详细的健康状态检测机制(more verbose health checks);基于流量的健康评估机制(traffic-based health);支持HTTP认证;服务器管理命令行接口(server management from the CLI);基于ACL的持久性(ACL-based persistence);日志分析器;内容交换(content switching):基于任何请求标准挑选服务器池;ACL:编写内容交换规则;负载均衡算法(load-balancing algorithms):更多的算法支持;内容探测(content inspection):阻止非授权协议;透明代理(transparent proxy):在Linux系统上允许使用客户端IP直接连入服务器;内核TCP拼接(kernel TCP splicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率;分层设计(layered design):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力;快速、公平调度器(fast and fair scheduler):为某些任务指定优先级可实现理好的QoS;会话速率限制(session rate limiting):适用于托管环境。

3、keepalived:Keepalived的作用是检测服务器的状态,如果有一台服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。haproxy主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。

4、实验拓扑图:

haproxy和keepalived需要配置 haproxy和keepalived区别_服务器

拓扑图说明:

haproxy1和haproxy2都同时提供反向代理服务(haproxy服务),基于keepalived服务让客户端能够使用不同的虚拟IP访问后端的静态网站(web1)和动态网站(web2)。

二、配置haproxy实现网站的负载均衡:

1、node1和node2都安装httpd,php,php-mysql:



[root@node1 ~]# yum -y install httpd php php-mysql
 
  
[root@node2 ~]# yum -y install httpd php php-mysql



2、为node1和node2提供静态和动态网页:



[root@node1 ~]# ls /var/www/html/
index.html  index.php
[root@node2 ~]# ls /var/www/html/
index.html  index.php



3、node1和node2启动httpd服务:



[root@node1 ~]# service httpd start
Starting httpd:                                            [  OK  ]
[root@node2 ~]# service httpd start
Starting httpd:                                            [  OK  ]



4、验证node1和node2的静态和动态网站:

haproxy和keepalived需要配置 haproxy和keepalived区别_php_02

haproxy和keepalived需要配置 haproxy和keepalived区别_服务器_03

haproxy和keepalived需要配置 haproxy和keepalived区别_服务器_04

haproxy和keepalived需要配置 haproxy和keepalived区别_php_05


5、在haproxy1和haproxy2主机上分别安装haproxy程序包:



yum -y install haproxy



6、在haproxy1编辑haproxy的主配置文件:



说明:


--全局配置



-- 定义日志服务器为本机(127.0.0.1),日志级别为local2



--禁锢haproxy用户的目录



--定义haproxy服务的pid文件



-- 单进程的并发连接数



--以haproxy用户的身份运行服务



--以haproxy组的身份运行服务



--让haproxy以守护进程的方式工作于后台



--启用统计页面输出




--默认配置



--工作模式为http



--使用全局配置中定义的日志服务器



--启用记录HTTP请求、会话状态和计时器的功能



--日志不能为空



--启用httpd的服务器端关闭的功能



--允许在发往服务器的请求首部中插入“X-Forwarded-For”首部,除了本机



--某一上游服务器宕机时,能够将客户端的会话请求重新派发给其它upstreat  server



--重试次数



--http请求的超时时间



--等待队列的超时时间



--将客户端请求转发给后端服务器而等待的时间



--客户端非活动状态的超时时长



--客户端等待服务器端非活动状态的超时时间



--保持连接的超时时长



--在健康状态检测时的超时时长



--每个server的最大并发连接数




--监听的名称为stats,用于统计页面输出



-- stats的工作模式为http



--绑定在所有地址的8009端口



--启用stats,可以在浏览器中显示后端服务器信息和整个haproxy的信息



--隐藏haproxy的版本



--stats的网页访问路径



--认证时显示的账号密码的提示信息



--stats认证的账号和密码



--如果认证通过就启用stats的管理接口




--前端服务器名称为http-in



--绑定在所有地址的80端口上



--工作模式为http



--使用全局配置中定义的日志服务器



--启用被动httpd连接关闭功能



   option logasap



--日志不能为空



--捕获请求首部为host,首部长度为20



--记录请求报文中的跳转,长度为60



--定义的访问控制列表为静态服务器



--定义的访问控制列表为静态服务器



--定义的访问控制列表为动态服务器



--在静态页面中使用的后端服务器组(指定使用的条件式后端)



--在动态页面中使用的后端服务器组(指定使用的条件式后端)



--默认后端服务器为动态服务器组




--定义的静态后端服务器



--算法为轮询



--具体的静态后端服务器,检测服务器健康状态,服务器接收的最大并发连接6000




--定义的动态后端服务器



--node为cookie名称,insert为直接插入cookie信息,nocache指后端是缓存服务器时,不用保持cookie信息



--算法为轮询



--具体的动态后端服务器,检测服务器健康状态,服务器接收的最大并发连接1000




7、把haproxy1主机上haproxy主配置文件复制一份到haproxy2主机上:



[root@haproxy1 ~]# scp /etc/haproxy/haproxy.cfg haproxy2:/etc/haproxy/ haproxy.cfg 100% 4190 4.1KB/s 00:00



8、在haproxy1主机和haproxy2主机上都编辑rsyslog的主配置文件,然后启动rsyslog服务:

haproxy和keepalived需要配置 haproxy和keepalived区别_后端服务_06

haproxy和keepalived需要配置 haproxy和keepalived区别_服务器_07



[root@haproxy1 ~]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]



8、在haproxy1主机上启动haproxy服务:


[root@haproxy1 ~]# service haproxy start
Starting haproxy:                                          [  OK  ]


9、访问haproxy的统计页面:

haproxy和keepalived需要配置 haproxy和keepalived区别_php_08

haproxy和keepalived需要配置 haproxy和keepalived区别_php_09


10、访问静态服务器:

haproxy和keepalived需要配置 haproxy和keepalived区别_php_10

11、访问动态服务器:

haproxy和keepalived需要配置 haproxy和keepalived区别_服务器_11

12、关闭haproxy1主机上的haproxy服务:


[root@haproxy1 ~]# service haproxy stop
Stopping haproxy:                                          [  OK  ]


三、配置keepalived为实现haproxy高可用的双主模型:

1、在haproxy1主机和haproxy2主机上都安装keepalived程序包:



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


2、在haproxy1和haproxy2上写一个脚本,定义主haproxy的启动、辅haproxy的停止即给管理员的邮件通知机制:



[root@haproxy1 keepalived]# pwd
/etc/keepalived
[root@haproxy1 keepalived]# vim notify.sh
#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# description: An example of notify script
#
vip=172.16.35.35
contact='root@localhost'
notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
/etc/rc.d/init.d/haproxy start
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/haproxy stop
exit 0
;;
fault)
notify fault
/etc/rc.d/init.d/haproxy stop
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
esac



3、在haproxy1主机上编辑keepalived的主配置文件:


[root@haproxy1 keepalived]# pwd
/etc/keepalived
[root@haproxy1 keepalived]# vim keepalived.conf
global_defs {
   notification_email {
        root@localhost
   }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
   notification_email_from kaadmin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 1
        weight -2
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12168
    }
    virtual_ipaddress {
        172.16.35.35
    }
        track_script {
                chk_haproxy
}
        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 69
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 22168
    }
    virtual_ipaddress {
        172.16.35.135
    }
        track_script {
                chk_haproxy
}
        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
}

说明:

global_defs {                                                 --全局定义
   notification_email {                                       --通知邮件
        root@localhost                                        --通知的收件人为本机的管理员   }

   notification_email_from kaadmin@localhost                  --通知的发件人
   smtp_server 127.0.0.1                                      --发件服务器为本机的邮件服务器
   smtp_connect_timeout 30                                    --连接邮件服务器的超时时间--路由器的标识
}


vrrp_script chk_haproxy {                                     --定义haproxy服务的追踪脚本为chk_haproxy
        script "killall -0 haproxy"                           --探测haproxy服务是否在线
        interval 1                                            --每隔1S探测一次
        weight -2                                             --如果haproxy服务不在线该节点权重就减二
}

vrrp_instance VI_1 {                                          --定义虚拟路由的实例名称为VI_1--在VI_1实例中haproxy1主机这个节点为主节点
    interface eth0                                            --所有的通告通过eth0接口进行--虚拟路由ID为66
--节点优先级为100(优先级范围0-255,数字越大,优先级越大)
-- 初始化通告的个数
-- 认证机制
--认证的类型为明文密码认证
--认证的密码为12168
    }
    virtual_ipaddress {                                       --定义虚拟地址,即VIP地址--VIP地址为172.16.35.35   
    }
        track_script {
                chk_haproxy                                   --在实例中定义追踪的脚本时chk_haproxy
}
        notify_master "/etc/keepalived/notify.sh master"      --当本节点为主节点时的邮件通知脚本
        notify_backup "/etc/keepalived/notify.sh backup"      --当本节点为backup节点时的邮件通知脚本--当本节点为fault时的邮件通知脚本
}

vrrp_instance VI_2 {                                          --定义虚拟路由的实例名称为VI_2

--在VI_2实例中haproxy1主机这个节点为从节点

--所有的通告通过eth0接口进行

--虚拟路由ID为69

--节点优先级为99(优先级范围0-255,数字越大,优先级越大)

--初始化通告的个数

--认证机制

--认证的类型为明文密码认证

--认证的密码为22168

}
    virtual_ipaddress {                                       --定义虚拟地址,即VIP地址--VIP地址为172.16.35.35
    }
        track_script {                                        
                chk_haproxy                                   --在实例中定义追踪的脚本时chk_haproxy}
        notify_master "/etc/keepalived/notify.sh master"      --当本节点为主节点时的邮件通知脚本

--当本节点为backup节点时的邮件通知脚本

--当本节点为fault时的邮件通知脚本

}

4、在haproxy2主机上编辑keepalived的主配置文件:


[root@haproxy2 keepalived]# pwd
/etc/keepalived
[root@haproxy2 keepalived]# vim keepalived.conf
global_defs {
   notification_email {
        root@localhost
   }
                                                                                                                                                                                                                                                                                                                                                                                                 
   notification_email_from kaadmin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                                                                 
vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 1
        weight -2
}
                                                                                                                                                                                                                                                                                                                                                                                                 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12168
    }
    virtual_ipaddress {
        172.16.35.35
    }
            track_script {
                chk_haproxy
}
         notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
}
                                                                                                                                                                                                                                                                                                                                                                                                 
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 69
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 22168
    }
    virtual_ipaddress {
        172.16.35.135
    }
            track_script {
                chk_haproxy
}
         notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
}


5、在haproxy1主机和haproxy2主机上同时启动keepalived服务和haproxy服务:



[root@haproxy1 ~]# ssh haproxy2 'service keepalived start';service keepalived start
Starting keepalived: [  OK  ]
Starting keepalived:                                       [  OK  ]



[root@haproxy1 ~]# ssh haproxy2 'service haproxy start';service haproxy start
Starting haproxy: [  OK  ]
Starting haproxy:                                          [  OK  ]



6、在haproxy1主机上查看获得的VIP地址为172.16.35.35,haproxy2主机上获得的VIP地址是172.16.35.135:

haproxy和keepalived需要配置 haproxy和keepalived区别_php_12

haproxy和keepalived需要配置 haproxy和keepalived区别_后端服务_13

7、使用2个VIP都能访问后端静态和动态网站:

haproxy和keepalived需要配置 haproxy和keepalived区别_服务器_14

haproxy和keepalived需要配置 haproxy和keepalived区别_php_15

haproxy和keepalived需要配置 haproxy和keepalived区别_php_16

haproxy和keepalived需要配置 haproxy和keepalived区别_php_17

8、在haproxy1主机上关闭haproxy服务,发现VIP:172.16.35.35转移到haproxy2主机上去了,但仍然能够反向代理到后端服务器而提供web服务:


[root@haproxy1 ~]# service haproxy stop
Stopping haproxy:                                          [  OK  ]


haproxy和keepalived需要配置 haproxy和keepalived区别_服务器_18

四、实验总结:

本次实验结合keepalived实现了haproxy反向代理的高可用,让两个haproxy都能同时为客户端提供反向代理服务,同时也实现了web站点的负载均衡,实现了网站访问的动静分离机制。。。


转载于:https://blog.51cto.com/yanhai/1405840