rhel6-HAproxy+keepalived

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

HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。


1.环境设置:

HA节点:

haproxy+keepalived192.168.122.34 desk34

haproxy+keepalived192.168.122.33 desk33

WEB节点:

动态节点:192.168.122.3 desk3

192.168.122.82 desk82

静态节点:192.168.122.160 server60


.服务器的安装配置

1.haproxy的安装

1rpm方式安装

[[email protected] ~]# yum -yinstall rpm-build

[[email protected] ~]# rpmbuild-tb haproxy-1.4.23.tar.gz

error:Failed build dependencies:

pcre-develis needed by haproxy-1.4.23-1.x86_64

[[email protected] ~]# yum -yinstall pcre-devel

[[email protected] ~]# cd/root/rpmbuild/RPMS/x86_64/

[[email protected] x86_64]# rpm-ivh haproxy-1.4.23-1.x86_64.rpm

两个节点上均安装

2)源码方式:

tar zxfhaproxy-1.4.23.tar.gz

cd haproxy-1.4.23

make TARGET=linux26ARCH=x86_64 USE_PCRE=1 PREFIX=/usr/local/haproxy

make install

2.配置文件修改


    1. haproxy的配置文件详解

      配置文件的位置:/etc/haproxy/haproxy.cfg

      配置文件内容如下:

# thisconfig needs haproxy-1.1.28 or haproxy-1.2.1

global //全局配置

log 127.0.0.1 local0 //日志服务器

log127.0.0.1 local1 notice //指定日志类型,还有err,warning,debug

#log loghost local0 info

maxconn 4096 //单个进程的最大并发数

chroot /usr/share/haproxy //chroot路径,用于安全配置

uid 99 //所属运行的用户UId

gid 99

daemon //以服务(后台)形式运行haproxy

#debug //debug日志调试

#quiet

nbproc 1 // 工作的进程数,增加进程数可以提高性能

pidfile/var/run/haproxy.pid //haproxypid存放路径,启动进程的用户必须有权限访问此文件

ulinit -n 65535 //ulimit的数量限制


defaults

log global //表示读取global中对于日志文件的定义

mode http //工作模式(默认使用http七层,tcp:为4层)

option httplog //日志模式,http日志模式

option dontlognull //不记录空键链接

option httpclose //每次请求完毕后主动关闭http通道

option forwardfor //如果后端服务器需要得到客户端的实际ip需要配置的参数,

可以从httphearder中获得客户端的ip

option redispatch //client连接到挂掉的设备时,强制分配到健康的主机

option abortonclose //当服务器负载较高时,自动结束掉已经处理比较比较久的连接

stats refresh //统计页面刷新的间隔

retries 3 //重试3次失败,确定服务器不可用

maxconn 2000 //当前所开启的最大链接数,如果不设置,则会以global中的最大链接数为限

contimeout 5000 // 链接超时,单位为ms

clitimeout 50000 //客户端链接超时时间

srvtimeout 50000 //服务器链接超时时间

timeout check 2000 //心跳检测超时时间

timeouthttp-request 10s //http的请求超时时间

timeouthttp-keep-alive 10s //持久链接超时时间

timeoutqueue 1m //排队超时时间

listenstats //定义监控页面

modehttp //四层工作模式

bind0.0.0.0:8080 //指定IP地址及端口

statsenable //开启haproxy统计状态

statsrefresh 3s //统计页面刷新时间3s

statshide-version //状态页面不显示版本号

statsuri /status //统计页面的uri为“/status”即访问:192.168.122.34:8080/status

statsrealm Haproxy\ status //访问提示信息

statsauth admin:admin //访问的认证用户及密码

statsadmin if TRUE //启用或禁止状态页面


frontendweb //定义前端服务器

bind *:80 //监听端口建议使用bind*:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。

acl url_static path_end -i .html .jpg .jpf //定义acl访问规则“.html/.jsp/.jpf”结尾的页面将会定义到url_static -i忽略大小写

acl url_dynamic path_end -i .php .jsp //.php .jsp结尾的定义到url_dynamic

use_backend dynamic if url_dynamic //调用后端服务器检查acl属性如果是url_dynamic则调用到dynamic后端服务器

default_backend webserviers //如果没有符合的acl属性则会访问到默认服务器


backendwebserviers //定义默认的后端服务器

balance roundrobin //定义负载均衡算法;简单轮循

server web1 192.168.122.3:80 check rise 2 fall 1 weight 2

server web2 192.168.122.82:80 check rise 2 fall 1 weight 2

//check:启动对后端server的健康状态检测;rise:离线的server转换到正常状态成功检查的次数;fall:确认server从正常状态转换为不可用状态需要检查的次数;weight:权重,数量越大,权重越高

backend dynamic

balance source //调度算法,源地址hash运算

server lamp 192.168.122.160:80 check rise 2 fall 1

3.启动haproxy服务并测试:

[[email protected]]# /etc/init.d/haproxy start

并启动以上所有的后端服务器的httpd服务

访问http//192.168.122.34

rhel6-HAproxy+keepalived

rhel6-HAproxy+keepalived

默认访问到webserviers


当访问动态页面时:

rhel6-HAproxy+keepalived

http://192.168.122.34/index.php



可见动态的页面调度到了server60

4.监控页面访问测试

http//192.168.122.34:8080/status


rhel6-HAproxy+keepalived

rhel6-HAproxy+keepalived


.keepalived的安装配置


1.keepalived原理

keepalived是基于vrrp协议的HA辅助工具,提供故障切换(failover)和健康检查(healthchecking)功能,判段集群节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入群集,防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生。

keepalived双机会定时想对方发送心跳,以确保对方的可用性。挡在一定的时间方位内收不到对方的心跳,slaves主机就会发送ARP请求将VIP绑定到自己的主机上,向外界提供服务。当Master主机的keepalived启动后将会再将VIP绑定到主机上。


2.vrrp协议原理

VRRPVirtualRouterRedundancyProtocol,虚拟路由冗余协议)是一种容错协议。通常,一个网络内的所有主机都设置一条缺省路由,这样,主机发出的目的地址不在本网段的报文将被通过缺省路由发往路由器RouterA,从而实现了主机与外部网络的通信。当路由器RouterA坏掉时,本网段内所有以RouterA为缺省路由下一跳的主机将断掉与外部的通信产生单点故障。VRRP就是为解决上述问题而提出的,它为具有多播组播或广播能力的局域网(如:以太网)设计。


关于详细的vrrp的讲解请参见:http://wangziyin.blog.51cto.com/6948950/1302369


3.keepalived的安装

[[email protected]~]#yum install openssl-devel popt-devel libnl-devel -y

[[email protected]~]#rpmbuild -tb keepalived-1.1.20.tar.gz


不过建议采用源码安装,易于迁移


[[email protected]~]#tar zxf keepalived-1.1.20.tar.gz

[[email protected]~]#cd keepalived-1.1.20

[[email protected]]#./configure

[[email protected]]#./configure --prefix=/usr/local/keepalived

[[email protected]]#make && make i

[[email protected]~]#ln -s /usr/local/keepalived/etc/keepalived/ /etc/

[[email protected]~]#ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

[[email protected]~]#ln -s /usr/local/keepalived/sbin/keepalived /sbin/

[[email protected]~]#ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/


4.keepalived的配置


HA1desk34的配置:

[[email protected]~]#vim /etc/keepalived/keepalived.conf

global_defs{

notification_email {

[email protected]

}

[email protected]

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}


vrrp_scriptcheck_process {

script "killall -0 haproxy"

interval 1

weight -2

}


/////以上的配置为主主模式。采用的为两个VIP地址,互为主辅,在两个节点均正常运行的时候,两个主机上均汇出现不同的设置的vip地址。但是如果一个主机宕机后两个vip将会出现同一台主机上,提供不停的服务。主要用到将两个vip定义到不同的域名上如www.westos.com p_w_picpath.westos.com以提供不同服务。


以下的配置建议使用主辅的模式,只用将对应的vrrp_instanceha_2 { 删掉。采用主主的haproxyacl属性最好使用域名的acl控制。

vrrp_instanceha_1 {

state MASTER //ha_1为主节点对应的desk33上的为slaves节点

interface eth0

virtual_router_id 51 //desk33上的配置id相同

priority 100 //优先级

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.122.200

}

track_script{

check_process

}

}


vrrp_instanceha_2 {

state BACKUP

interface eth0

virtual_router_id 52 //同样不能与ha_1的冲突

priority 50

advert_int 1

authentication {

auth_type PASS

auth_pass 1112 //认证端口与ha_1的配置不同要与desk33上的配置相同

}

virtual_ipaddress {

192.168.122.201

}

}




主主的域名的haproxyacl控制:


aclweb hdr(host) -i www.westos.com
#acl
后面是规则名称,-i是要访问的域名,如果访问www.westos.com这个域名就分发到下面的webserver的作用域。
acl imghdr(host) -i p_w_picpath.westos.com
#
如果访问img.linuxidc.com就分发到imgserver这个作用域。

use_backendwebserver if web
use_backend dynamic if img



desk33上做相同的安装:

scp/etc/keepalived/keepalived.conf desk33:/etc/keepalived/


HA2desk33的配置:

global_defs{

notification_email {

[email protected]

}

[email protected]

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}


vrrp_scriptcheck_process {

script "killall -0 haproxy"

interval 1

weight -2

}


vrrp_instanceha_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 50

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.122.200

}


track_script

check_process

}

}


vrrp_instanceha_2 {

state MASTER

interface eth0

virtual_router_id 52

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1112

}

virtual_ipaddress {

192.168.122.201

}


track_script

check_process

}

}


5.启动keepalived并测试


[[email protected]]# /etc/init.d/keepalived start

[[email protected]]# /etc/init.d/keepalived start

启动后的网卡信息如下:

[[email protected]]# ip addr show eth0

2:eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdiscpfifo_fast state UP qlen 1000

link/ether52:54:00:4e:c6:2f brd ff:ff:ff:ff:ff:ff

inet192.168.122.34/24 brd 192.168.122.255 scope global eth0

inet192.168.122.200/32 scope global eth0

inet192.168.122.201/32 scope global eth0

inet6fe80::5054:ff:fe4e:c62f/64 scope link

valid_lftforever preferred_lft forever


#####在启动的时候主机的上边正常情况应该只有inet192.168.122.200/32 scope global eth0 而不会出现201VIP,但是不明白为什么启动的时候会出现192.168.122.201/32VIP,但是不影响正常的服务访问#########如果有人测试请指教@@@@@@@@@@


[[email protected]]# ip addr show eth0

2:eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdiscpfifo_fast state UP qlen 1000

link/ether52:54:00:d0:fe:21 brd ff:ff:ff:ff:ff:ff

inet192.168.122.33/24 brd 192.168.122.255 scope global eth0

inet192.168.122.201/32 scope global eth0

inet6fe80::5054:ff:fed0:fe21/64 scope link

valid_lftforever preferred_lft forever


测试:

rhel6-HAproxy+keepalived

rhel6-HAproxy+keepalived

rhel6-HAproxy+keepalived

rhel6-HAproxy+keepalived

当然上面的一组是由desk34调度的。下面是有desk33调度的。但是因为上面desk34上出现两个vip则无法判断是否一定是有desk33提供的调度

关闭desk34keepalived,后desk34上的vip182.168.122.200将会切换到desk33上:

rhel6-HAproxy+keepalived

[[email protected]]# /etc/init.d/keepalived stop

但是如果关闭haproxy服务keepalived将不会调度切换,因为keepalived本身不对外界的服务做健康检查,但是我们可以自己定义脚本,keepalived自动调用,实现happroxy的将康性检查;


6.实现haproxy的健康性检查


检查脚本:

[[email protected]]# vim /usr/local/keepalived/check-haproxy.sh

#!/bin/bash

if[ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then

/etc/init.d/haproxystart

fi

sleep2

if[ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then

/etc/init.d/keepalived stop

fi

[[email protected]]# chmod a+x check-haproxy.sh


将定义的脚本添加到keepalived的配置文件*keepalived自动调用:

HA_1节点:

[[email protected]~]# vim /etc/keepalived/keepalived.conf

添加:

vrrp_scriptcheck-haproxy {

script"/usr/local/keepalived/check-haproxy.sh"

interval2

weight2

}


ha_1MASTER(当然BACKUP中也可以添加上)节点的定义块里添加:

track_script{

check-haproxy

}


配置文件如下:


vrrp_instanceha_1 {

stateMASTER

interfaceeth0

virtual_router_id51

priority100

advert_int1

authentication{

auth_typePASS

auth_pass1111

}

virtual_ipaddress{

192.168.122.200

}

track_script{

check_process

}

track_script{

check-haproxy

}

}

在另一个keepalived+haproxy的节点上做以上的相同配置:

测试:

关闭keepalivedhaproxy服务;

1)开启keepalievd查看haproxy是否自动启动:

[[email protected]]# /etc/init.d/keepalived stop

Stoppingkeepalived: [ OK ]

[[email protected]]# /etc/init.d/haproxy stop

Shuttingdown haproxy: [ OK ]

[[email protected]]# /etc/init.d/keepalived start

Startingkeepalived: [ OK ]

[[email protected]]# /etc/init.d/haproxy status

haproxy(pid 11787) is running...

脚本调用成功!!!!!!1


2)关闭haproxy服务检查是否会正常重启动

[[email protected]]# /etc/init.d/haproxy stop

Shuttingdown haproxy: [ OK ]

[[email protected]]# /etc/init.d/haproxy status

haproxy(pid 12612) is running...

其实,检测脚本还可以这样写哦:

#!/bin/bash

/etc/init.d/haproxystatus &> /dev/null || /etc/init.d/haproxy restart

&>/dev/null

if[ $? -ne 0 ];then

/etc/init.d/keepalivedstop &> /dev/null

fi

#!/bin/bash

[-f /var/run/haproxy.pid ] || /etc/init.d/haproxy restart &>/dev/null

if[ $? -ne 0 ];then

/etc/init.d/keepalivedstop &> /dev/null

fi

如果有人测试,发现不正确或是有什么更好的配置或方法!请不要吝惜自己的笔墨哦!留言相告,谢谢!

西安石油大学计算机学院

王兹银 904483782