您的位置:首页 > 运维架构 > 网站架构

Haproxy+keepalived实现高可用负载均衡

2016-04-27 16:29 197 查看
最近在测试一个分布式锁问题,想研究下是redis的好,还是zookeeper的好,无奈测试环境没有部署集群环境,只好硬着头皮自己从头到尾搭建了一个。留作以后翻阅!一、简介HAProxy简介:HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作Keepalived简介:KeepAlived 是一个类似于layer3, 4 & 5交换机制的软件, 是一个高可用解决方案,通过虚拟IP地址和心跳检测对方状态来实现高可用功能。Keepalived是由两台服务器分别指定Master与Backup两个角色,而指定Master的优先级比Backup的高;所以默认情况下虚拟IP会绑定到Master服务器上,对外提供服务。而Master、Backup服务器会在一定的时间间隔向对方发送心跳信息来检测对方的存活状态,时间间隔一般为2秒钟可以修改,如果Backup发现Master宕机,那么Backup会发送ARP包到网关,然后把虚拟IP绑定到自己的网卡上,此时Backup对外提供服务,实现了自动化的故障转移,当Master恢复的时会重新接管所有资源vip:192.168.10.16主Haproxy:192.168.10.141主Haproxy:192.168.10.142realserver1: 192.168.10.157realserver2:192.168.10.42二、haproxy环境搭建1、关闭SElinux、配置防火墙vi /etc/selinux/config#SELINUX=enforcing #注释掉#SELINUXTYPE=targeted #注释掉SELINUX=disabled #增加:wq! #保存退出setenforce 0 #使配置立即生效2、创建HAProxy运行账户和组groupadd haproxy #添加haproxy组useradd -g haproxy haproxy -s /bin/false #创建nginx运行账户haproxy并加入到haproxy组,不允许haproxy用户直接登录系统3、下载安装依赖包yum install gcc gcc-c++ openssl-devel popt-devel下载安装haproxywget http://pkgs.fedoraproject.org/repo/pkgs/haproxy/haproxy1.4.24.tar.gz/86422620faa9759907563d5e0524b98c/ haproxy-1.4.24.tar.gz上传haproxy-1.4.24.tar.gz到/usr/local/srctar -xvzf haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make install
4、设置HAProxy
mkdir -p  /usr/local/haproxy/conf  #创建配置文件目录mkdir -p /etc/haproxy  #创建配置文件目录cp /usr/local/src/haproxy-1.4.24/examples/haproxy.cfg  /usr/local/haproxy/conf/haproxy.cfg  #拷贝配置模板文件ln -s  /usr/local/haproxy/conf/haproxy.cfg   /etc/haproxy/haproxy.cfg  #添加配置文件软连接cp -r  /usr/local/src/haproxy-1.4.24/examples/errorfiles  /usr/local/haproxy/errorfiles  #拷贝错误页面ln -s  /usr/local/haproxy/errorfiles  /etc/haproxy/errorfiles  #添加软连接mkdir -p  /usr/local/haproxy/log  #创建日志文件目录touch  /usr/local/haproxy/log/haproxy.log  #创建日志文件ln -s  /usr/local/haproxy/log/haproxy.log  /var/log/haproxy.log  #添加软连接cp /usr/local/src/haproxy-1.4.24/examples/haproxy.init  /etc/rc.d/init.d/haproxy  #拷贝开机启动文件chmod +x  /etc/rc.d/init.d/haproxy  #添加脚本执行权限chkconfig haproxy on  #设置开机启动ln -s  /usr/local/haproxy/sbin/haproxy  /usr/sbin  #添加软连接5、配置haproxy.cfg参数
vi  /usr/local/haproxy/conf/haproxy.cfg  #编辑,修改
########################################################################################################################################### this config needs haproxy-1.1.28 or haproxy-1.2.1globallog         127.0.0.1 local0 info  ##指定日志类型,还有 err warning debuglog         127.0.0.1 local3 err#log loghost    local0 infomaxconn 65535   #每个进程可用的最大连接数chroot /usr/local/haproxy  #haproxy安装目录uid 503  #运行haproxy的用户uid(cat /etc/passwd查看)gid 503  #运行haproxy的组uid(cat /etc/group查看)daemon   #以后台守护进程运行pidfile /usr/local/haproxy/haproxy.pid  #将所有进程写入pid文件#debug   #调试模式#quiet   #安装模式defaultsmode                    tcplog                     globaloption                  dontlognulloption   redispatchoption  abortonclosemaxconn  65535#    balance sourceretries                 3timeout connect         5000timeout client          50000timeout server          5000timeout check           2000#192.168.10.140 这个一定要向运维申请这个IP,不然IP被占用了是没法监听的listen  server_http 192.168.10.140:81mode    httpoption    httplogoption  originaltooption   httpcloseoption   http-server-closeoption   forwardfor  except 127.0.0.0/8option  http-pretend-keepaliveoption  forcecloseoption  accept-invalid-http-requeststats enablestats refresh 30s                      #统计页面自动刷新时间stats uri /status                      #统计页面urlstats hide-version                     #隐藏统计页面上HAProxy的版本信息stats auth admin:admin                 #统计页面用户名和密码设置#balance   source        #本机测试此项注释,上线需打开#option  httpchk /index.php  #检测服务器此文件是否存在,如果没有,则认为服务器连接异常,此参数可以不设置server     192.168.10.157  192.168.10.157:8105   check  inter  2000  rise 3  fall  3  weight 100   #inter  2000 心跳检测时间;rise 3 三次连接成功,表示服务器正常;fall  3 三次连接失败,表示服务器异常; weight 100 权重设置server     192.168.10.42  192.168.10.42:8105   check  inter  2000  rise 3  fall  3  weight 100listen  server_tcpbind  192.168.10.140:80mode tcpoption tcplogtcp-request inspect-delay 5soption tcpkaoption srvtcpkaoption clitcpka#balance   source#option  httpchk /index.php  #检测服务器此文件是否存在,如果没有,则认为服务器连接异常,此参数可以不设置server     192.168.10.157  192.168.10.157:19208   check  inter  2000  rise 3  fall  3  weight 100   #inter  2000 心跳检测时间;rise 3 三次连接成功,表示服务器正常;fall  3 三次连接失败,表示服务器异常; weight 100 权重设置server     192.168.10.42  192.168.10.42:19208   check  inter  2000  rise 3  fall  3  weight 100errorfile 403 /etc/haproxy/errorfiles/403.httperrorfile 500 /etc/haproxy/errorfiles/500.httperrorfile 502 /etc/haproxy/errorfiles/502.httperrorfile 503 /etc/haproxy/errorfiles/503.httperrorfile 504 /etc/haproxy/errorfiles/504.http#####################################################################
:wq! #保存退出
service haproxy start #启动
service haproxy stop  #关闭
service haproxy restart  #重启
注意:备服务器此配置一样
6、设置HAProxy日志
vi  /etc/syslog.conf  #编辑,在最下边增加# haproxy.loglocal0.*          /var/log/haproxy.loglocal3.*          /var/log/haproxy.log:wq! #保存退出vi  /etc/sysconfig/syslog   #编辑修改SYSLOGD_OPTIONS="-r -m 0"   #接收远程服务器日志:wq! #保存退出service syslog restart  #重启syslog
三、Keepalived 环境搭建yum -y install keepalived
vi /etc/keepalived/keepalived.conf
配置keepalived.conf:
主:
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id Haprxoy_Master}vrrp_script check_haproxy {script "/etc/keepalived/check_haproxy.sh"interval 4weight 2}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 101   #主机的优先级,主机优先级一定要大于备机advert_int 1
    unicast_src_ip  192.168.10.141  #使用单播发送vrrp心跳,本地ip地址unicast_peer {192.168.10.142   #(对端IP地址)}authentication {auth_type PASSauth_pass 1111}track_script {check_haproxy}virtual_ipaddress {192.168.10.16/24 broadcast 192.168.10.255 dev eth0 label eth0:vip}notify_master "/etc/keepalived/clean_arp.sh  192.168.10.16"  #更新虚拟服务器(VIP)地址的arp记录到网关}备:
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id Haprxoy_Master}vrrp_script check_haproxy {script "/etc/keepalived/check_haproxy.sh"interval 4weight 2}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 100advert_int 1
advert_int 1
    unicast_src_ip  192.168.10.142  #使用单播发送vrrp心跳,本地ip地址unicast_peer {192.168.10.141   #(对端IP地址)}
authentication { auth_type PASS auth_pass 1111 } track_script { check_haproxy } virtual_ipaddress { 192.168.10.16/24 broadcast 192.168.10.255 dev eth0 label eth0:vip } notify_master "/etc/keepalived/clean_arp.sh 192.168.10.16" #更新虚拟服务器(VIP)地址的arp记录到网关}设置HAproxy服务监控脚本vi /etc/keepalived/check_haproxy.sh #编辑,添加以下代码##########################################################!/bin/bashA=`ps -C haproxy --no-header | wc -l`if [ $A -eq 0 ]then service haproxy startsleep 3if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ]then service keepalived stopfifi#########################################################:wq! #保存退出chmod +x /etc/keepalived/check_haproxy.sh #添加执行权限设置更新虚拟服务器(VIP)地址的arp记录到网关脚本vi /etc/keepalived/clean_arp.sh #编辑,添加以下代码#!/bin/shVIP=$1GATEWAY=192.168.21.2 #网关地址/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &>/dev/null:wq! #保存退出chmod +x /etc/keepalived/clean_arp.sh #添加脚本执行权限service keepalived start #启动service keepalived stop #关闭service keepalived restart #重启测试HAProxy+Keepalived是否正常运行进入 http://192.168.10.16/haproxy-status
输入用户名,密码admin123456
在192.168.10.141上:
发现VIP:192.168.10.16指向192.168.10.141
service keepalived stop 后
在192.168.10.142上:
发现VIP:192.168.10.16指向192.168.10.142
说明keepalived主备生效了!!!


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: