q987654 发表于 2018-12-29 07:24:14

rhel6

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


1.环境设置:
HA节点:
haproxy+keepalived:192.168.122.34 desk34
haproxy+keepalived:192.168.122.33 desk33
WEB节点:
动态节点:192.168.122.3desk3
192.168.122.82 desk82
静态节点:192.168.122.160 server60


二.服务器的安装配置
1.haproxy的安装
(1)rpm方式安装
# yum -yinstall rpm-build
# rpmbuild-tb haproxy-1.4.23.tar.gz
error:Failed build dependencies:
pcre-develis needed by haproxy-1.4.23-1.x86_64
# yum -yinstall pcre-devel
# cd/root/rpmbuild/RPMS/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.配置文件修改



[*]
[*]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
nbproc1      //工作的进程数,增加进程数可以提高性能
pidfile/var/run/haproxy.pid //haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
ulinit -n 65535       //ulimit的数量限制


defaults
logglobal   //表示读取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中的最大链接数为限
contimeout5000// 链接超时,单位为ms
clitimeout50000//客户端链接超时时间
srvtimeout50000//服务器链接超时时间
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服务并测试:
# /etc/init.d/haproxy start
并启动以上所有的后端服务器的httpd服务
访问http://192.168.122.34
http://blog.运维网.com/attachment/201310/112425911.png
http://blog.运维网.com/attachment/201310/112427260.png
默认访问到webserviers


当访问动态页面时:
http://blog.运维网.com/attachment/201310/112538639.png
http://192.168.122.34/index.php




可见动态的页面调度到了server60上
4.监控页面访问测试
http://192.168.122.34:8080/status


http://blog.运维网.com/attachment/201310/112442355.png
http://blog.运维网.com/attachment/201310/112517264.png


三.keepalived的安装配置


1.keepalived原理
keepalived是基于vrrp协议的HA辅助工具,提供故障切换(failover)和健康检查(healthchecking)功能,判段集群节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入群集,防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生。
keepalived双机会定时想对方发送心跳,以确保对方的可用性。挡在一定的时间方位内收不到对方的心跳,slaves主机就会发送ARP请求将VIP绑定到自己的主机上,向外界提供服务。当Master主机的keepalived启动后将会再将VIP绑定到主机上。


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


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


3.keepalived的安装
#yum install openssl-devel popt-devel libnl-devel -y
#rpmbuild -tb keepalived-1.1.20.tar.gz


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


#tar zxf keepalived-1.1.20.tar.gz
#cd keepalived-1.1.20
#./configure
#./configure --prefix=/usr/local/keepalived
#make && make i
#ln -s /usr/local/keepalived/etc/keepalived/ /etc/
#ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
#ln -s /usr/local/keepalived/sbin/keepalived /sbin/
#ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/


4.keepalived的配置


HA1desk34的配置:
#vim /etc/keepalived/keepalived.conf
global_defs{
notification_email {
root@localhost
}
notification_email_fromkeepalived@desk34.example.com
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 image.westos.com以提供不同服务。


以下的配置建议使用主辅的模式,只用将对应的vrrp_instanceha_2 { 删掉。采用主主的haproxy的acl属性最好使用域名的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
}
}






主主的域名的haproxy的acl控制:


aclweb hdr(host) -i www.westos.com
#acl后面是规则名称,-i是要访问的域名,如果访问www.westos.com这个域名就分发到下面的webserver的作用域。
acl imghdr(host) -i image.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 {
root@localhost
}
notification_email_fromkeepalived@desk34.example.com
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并测试


# /etc/init.d/keepalived start
# /etc/init.d/keepalived start
启动后的网卡信息如下:
# ip addr show eth0
2:eth0: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 而不会出现201的VIP,但是不明白为什么启动的时候会出现192.168.122.201/32的VIP,但是不影响正常的服务访问#########如果有人测试请指教@@@@@@@@@@


# ip addr show eth0
2:eth0: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


测试:
http://blog.运维网.com/attachment/201310/112519985.png
http://blog.运维网.com/attachment/201310/112926880.png
http://blog.运维网.com/attachment/201310/112928778.png
http://blog.运维网.com/attachment/201310/112930228.png
当然上面的一组是由desk34调度的。下面是有desk33调度的。但是因为上面desk34上出现两个vip则无法判断是否一定是有desk33提供的调度
关闭desk34的keepalived,后desk34上的vip182.168.122.200将会切换到desk33上:
http://blog.运维网.com/attachment/201310/112932372.png
# /etc/init.d/keepalived stop
但是如果关闭haproxy服务keepalived将不会调度切换,因为keepalived本身不对外界的服务做健康检查,但是我们可以自己定义脚本,keepalived自动调用,实现happroxy的将康性检查;


6.实现haproxy的健康性检查


检查脚本:
# 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
# chmod a+x check-haproxy.sh


将定义的脚本添加到keepalived的配置文件中供keepalived自动调用:
HA_1节点:
# vim /etc/keepalived/keepalived.conf
添加:
vrrp_scriptcheck-haproxy {
script"/usr/local/keepalived/check-haproxy.sh"
interval2
weight2
}


在ha_1的MASTER(当然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的节点上做以上的相同配置:
测试:
关闭keepalived和haproxy服务;
(1)开启keepalievd查看haproxy是否自动启动:
# /etc/init.d/keepalived stop
Stoppingkeepalived:          [ OK ]
# /etc/init.d/haproxy stop
Shuttingdown haproxy:          [ OK ]
# /etc/init.d/keepalived start
Startingkeepalived:          [ OK ]
# /etc/init.d/haproxy status
haproxy(pid 11787) is running...
脚本调用成功!!!!!!1


(2)关闭haproxy服务检查是否会正常重启动
# /etc/init.d/haproxy stop
Shuttingdown haproxy:          [ OK ]
# /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


附件:http://down.运维网.com/data/2363654

页: [1]
查看完整版本: rhel6