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

最近在测试一个分布式锁问题,想研究下是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.142

real server1: 192.168.10.157

realserver2: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

下载安装haproxy 

wget 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/src

tar -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.1


global


log         127.0.0.1 local0 info  ##指定日志类型,还有 err warning debug
log         127.0.0.1 local3 err


#log loghost    local0 info


maxconn 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   #安装模式


defaults
    mode                    tcp    
    log                     global   
    option                  dontlognull
    option   redispatch
    option  abortonclose 
    maxconn  65535 
#    balance source 
    retries                 3         
    timeout connect         5000          
    timeout client          50000      
    timeout server          5000      
    timeout check           2000


 
#192.168.10.140 这个一定要向运维申请这个IP,不然IP被占用了是没法监听的
listen  server_http 192.168.10.140:81
mode    http
option    httplog
option  originalto  
option   httpclose                   
option   http-server-close   
option   forwardfor  except 127.0.0.0/8     
option  http-pretend-keepalive  
option  forceclose    
option  accept-invalid-http-request 
stats enable
stats refresh 30s                      #统计页面自动刷新时间
stats uri /status                      #统计页面url
stats 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 100






listen  server_tcp 
 bind  192.168.10.140:80


mode tcp
option tcplog 
tcp-request inspect-delay 5s  
option tcpka         
option srvtcpka         
option 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 100




errorfile 403 /etc/haproxy/errorfiles/403.http


errorfile 500 /etc/haproxy/errorfiles/500.http


errorfile 502 /etc/haproxy/errorfiles/502.http


errorfile 503 /etc/haproxy/errorfiles/503.http


errorfile 504 /etc/haproxy/errorfiles/504.http


#####################################################################
:wq! #保存退出
service haproxy start #启动
service haproxy stop  #关闭
service haproxy restart  #重启


注意:备服务器此配置一样

6、设置HAProxy日志

vi  /etc/syslog.conf  #编辑,在最下边增加

# haproxy.log

local0.*          /var/log/haproxy.log

local3.*          /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 keepalived


global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Haprxoy_Master
}


vrrp_script check_haproxy {
  script "/etc/keepalived/check_haproxy.sh"
  interval 4
  weight 2
}


vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101   #主机的优先级,主机优先级一定要大于备机
    advert_int 1
    unicast_src_ip  192.168.10.141  #使用单播发送vrrp心跳,本地ip地址
    unicast_peer {
                  192.168.10.142   #(对端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记录到网关
}



备:
! Configuration File for keepalived


global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Haprxoy_Master
}


vrrp_script check_haproxy {
  script "/etc/keepalived/check_haproxy.sh"
  interval 4
  weight 2
}


vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_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/bash

A=`ps -C haproxy --no-header | wc -l`

if [ $A -eq 0 ]

then service haproxy start

sleep 3

if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ]

then service keepalived stop

fi

fi

#########################################################

:wq! #保存退出

chmod +x /etc/keepalived/check_haproxy.sh   #添加执行权限

设置更新虚拟服务器(VIP)地址的arp记录到网关脚本

vi  /etc/keepalived/clean_arp.sh  #编辑,添加以下代码

#!/bin/sh

VIP=$1

GATEWAY=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
 
  

输入用户名,密码

admin

123456

 在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主备生效了!!!
 
  
 
  
 
  
 
  

 
  


你可能感兴趣的:(分布式与集群)