• Keepalived+HAproxy实现高可用负载均衡


    总概:

          Keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器

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

    这里我利用HAproxy对多台redis服务器进行负载,然后用Keepalived对HAproxy进行监控:

         (主)服务器A:10.10.51.231

         (从)服务器B:10.10.51.232

          VIP:10.10.51.230

          Keepalived监控A、B上的HAproxy,利用Keepalived的VIP漂移技术,若A、B上的HAprox都工作正常,则VIP与优先级别高的服务器(主服务器)绑定,当主服务器当掉时,则与从服务器绑定,而VIP则是暴露给外部访问的ip;HAproxy利用Keepalived生产的VIP对多台redis(从)进行读负载,当某台redis当掉,则将其移除,回复后加入集群。

     

    一、安装keepalived

    1、下载后解压 tar zxvf keepalived-1.2.7.tar.gz 到任意目录

    [root@Centos-Server ~]# tar zxvf keepalived-1.2.7.tar.gz -C /usr/local/keepalived

    解压后,进入keepalived目录

    [root@Centos-Server ~]# cd /usr/local/keepalived
    [root@Centos-Server ~]# ./configure
    [root@Centos-Server ~]# make && make install

    注:若这里报错提示没有装openssl,则执行[root@Centos-Server ~]# yum –y install openssl-devel安装,若还有其他的包没装,则执行yum命令进行安装。

    2、配置keepalived

    [root@Centos-Server ~]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
    [root@Centos-Server ~]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
    [root@Centos-Server ~]# mkdir /etc/keepalived
    [root@Centos-Server ~]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
    [root@Centos-Server ~]# ln -s /usr/local/sbin/keepalived /usr/sbin/
    [root@Centos-Server ~]# vi /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    global_defs {
       router_id LVS_DEVEL
    }
    
    vrrp_script chk_haproxy {                        #Haproxy服务启动
       script "/etc/keepalived/check_haproxy.sh"     #监控haproxy进程的脚本, 根据自己的实际路径放置
       interval 2
       weight -4
    }
    vrrp_instance VI_1 { state MASTER
    #主机为MASTER,备机为BACKUP interface eth0 #监测网络端口,用ipconfig查看 virtual_router_id 51 #主备机必须相同 priority 150 #主备机取不同的优先级,主机要大。从服务器上改为120 advert_int 1 #VRRP Multicast广播周期秒数 authentication { auth_type PASS #VRRP认证方式 auth_pass 1111 #VRRP口令 主备机密码必须相同 }
    track_script {
    #调用haproxy进程检测脚本 chk_haproxy } virtual_ipaddress { 10.10.51.230 #VIP 漂移地址 即集群IP地址 } }
    [root@Centos-Server ~]# vim /etc/keepalived/check_haproxy.sh
    
    #!/bin/bash
    if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
       /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
       sleep 3
    if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then /etc/init.d/keepalived stop fi fi

    此文件root组读写权限,并且允许程序执行此文件。

    [root@Centos-Server ~]# chmod 777 /etc/keepalived/check_haproxy.sh

    三、安装HAproxy

    1、下载后解压 tar zxvf haproxy-1.4.24.tar.gz 到任意目录

    解压后,进入Haproxy目录

    [root@Centos-Server ~]# cd /usr/local/haproxy-1.4.24
    [root@Centos-Server ~]# make TARGET=linux26 PREFIX=/usr/local/haproxy                               
    [root@Centos-Server ~]# make install PREFIX=/usr/local/haproxy        #将Haproxy安装到/usr/local/haproxy

    2、配置HAproxy

    [root@Centos-Server ~]# cd /usr/local/haproxy
    [root@Centos-Server ~]# vim haproxy.cfg

    注:这里是没有haproxy.cfg文件的,可以回到安装文件目录下将examples下的haproxy.cfg拷贝到usr/local/haproxy下。

    [root@Centos-Server haproxy-1.5.11]# cp /usr/local/mypackages/haproxy-1.5.11/examples/haproxy.cfg /usr/local/haproxy
    ####################HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
    #global  :参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
    #defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
    #frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
    #backend :后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
    #listen  :Frontend和Backend的组合体。
    
    global
        log 127.0.0.1 local0    #日志输出配置,所有日志都记录在本机,通过local0输出
        maxconn 4096            #限制单个进程的最大连接数
        chroot /usr/local/haproxy                 #Haproxy安装目录
        uid 99            #所属运行用户,默认99为nobody
        gid 99            #所属运行用户组,默认99为nobody
        daemon            #让进程作为守护进程在后台运行
        nbproc 1          #指定作为守护进程运行时的进程数
        pidfile /usr/local/haproxy/haproxy.pid    #将所有进程写入pid文件
    
    defaults
        log global
        mode tcp                  #所处理的类别,默认采用http模式,可配置成tcp作4层消息转发
        maxconn 4096              #限制单个进程的最大连接数
        option httplog            #http 日志格式 
        option dontlognull        #不记录空连接
        option forwardfor         #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
        option httpclose          #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
        option abortonclose       #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 
        option redispatch         #在连接失败或断开的情况下,允许当前会话被重新分发
        retries 3                 #设置在一个服务器上链接失败后的重连次数
        balance source            #表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法。
        timeout client 30s        #设置客户端的最大超时时间(毫秒)
        timeout connect 5s        #设置等待连接到服务器成功的最大时间
        timeout server 30s        #设置服务器端的最大超时时间
        timeout check 5s          #心跳检测时间
    
    #前端代理 Redis
    frontend Redis
        bind *:6379
        default_backend RedisServer
    
    #后端分发 Redis
    backend RedisServer
        mode tcp
        balance source
        server redis-233 10.10.51.233:6379 check inter 2000 fall 5
        server redis-234 10.10.51.234:6379 check inter 2000 fall 5
        server redis-235 10.10.51.235:6379 check inter 2000 fall 5
    
    
    #前端代理 Web
    frontend WebSite
        bind 10.10.51.230:80                            #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
        acl WwwSite hdr(host) -i www.ccav.com           #acl后面是规则名称,-i是要访问的域名,如果访问www.zhirs.com这个域名就分发到下面的webserver 的作用域。
        acl ImgSite hdr(host) -i res.ccav.com           #如果访问img.baison.com.cn就分发到imgserver这个作用域。
        use_backend WwwSiteServer if WwwSite
        use_backend ImgSiteServer if ImgSite
    
    #后台分发 Web
    backend WwwSiteServer
        mode http
        balance source                    #banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等
        option httpchk /index.html        #检测文件,如果分发到后台index.html 访问不到就不再分发给它
        server web01 10.10.51.241:80  check inter 2000 fall 3 weight 30
        server web02 10.10.51.242:80  check inter 2000 fall 3 weight 20
     
    backend ImgSiteServer
        mode http
        option httpchk /index.html
        balance roundrobin
        server web03 10.10.51.243:80  check inter 2000 fall 3 weight 10
    
    
        # weight - 调节服务器的负重
        # check - 允许对该服务器进行健康检查
        # inter - 设置连续的两次健康检查之间的时间,单位为毫秒(ms),默认值 2000(ms)
        # rise - 指定多少次连续成功的健康检查后,可认定该服务器处于可操作状态,默认值 2
        # fall - 指定多少次不成功的健康检查后,认为服务器为当掉状态,默认值 3
        # maxconn - 指定可被发送到该服务器的最大并发连接数
    
    #状态检测
    listen status 10.10.51.231:8080        #监控页面的端口
        mode http
        stats enable
        stats refresh 10s                  #统计页面自动刷新时间
        stats uri /haproxy-admin           #监控页面的访问地址
        stats realm Haproxy Statistics    #统计页面密码框上提示文本
        stats auth ccav:123456             #统计页面用户名和密码设置
        stats hide-version                 #隐藏统计页面上HAProxy的版本信息

    3、加上日志支持

    [root@Centos-Server ~]# vim /etc/rsyslog.conf
    
    #在最下边增加
    local3.* /var/log/haproxy.log
    local0.* /var/log/haproxy.log
    [root@Centos-Server ~]# vim /etc/sysconfig/rsyslog
    修改: SYSLOGD_OPTIONS="-r -m 0" 
    
    [root@Centos-Server ~]# service rsyslog restart        #重启日志服务

     

    三、测试

    1、启动Keepalived:

    [root@Centos-Server ~]# /usr/local/keepalived/bin/keepalived -D -f /etc/keepalived/keepalived.conf  #指定启动配置文件
    
    正在启动 keepalived: [确定]
    #说明:Keepalived启动后会去检查HAproxy,若HAproxy未启动,则启动HAproxy,若启动HAproxy失败,则关闭Keepalived

    2、启动Haproxy

    [root@Centos-Server ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg  #启动
    [root@Centos-Server ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid`  #重启
    [root@Centos-Server ~]# killall haproxy  #停止

    PS:haproxy启动故障:Starting proxy cluster: cannot bind socket

    [root@Centos-Server ~]# /etc/sysctl.conf        #修改内核参数
    net.ipv4.ip_forward = 1
    net.ipv4.ip_nonlocal_bind=1                     #没有就新增此条记录
    
    [root@Centos-Server ~]# sysctl -p               #保存结果,使结果生效。

    3、查看keepalived状况:

    [root@alex]# service keepalived status
    
    keepalived (pid  5420) 正在运行...

    4、查看HAproxy状况:

    [root@alex]# ps -aux|grep haproxy
    
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
    nobody   5430  0.0  0.0  11980   944 ?  Ss  16:37   0:00 /usr/local/haproxy/sbin/haproxy –f /usr/local/haproxy/haproxy.conf
    nobody   5431  0.0  0.0  11980   944 ?  Ss  16:37   0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
    root      5618  0.0  0.0 103252   844 pts/2    S+   16:38   0:00 grep haproxy

    Keepalived启动后自动将HAproxy启动了。

    5、查看Keepalived生成的VIP是否与主服务器绑定

    [root@alex]# ip addr
    
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
        link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
        inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
        inet 10.10.51.230/32 scope global eth5
        inet6 fe80::a00:27ff:fe42:712d/64 scope link
        valid_lft forever preferred_lft forever

    VIP绑定OK!

    6、打开HAproxy的图形管理界面:

    浏览器输入http://localhost:8080/haproxy-admin

    用户名:ccav   密码:123456

    这时候我们Kill掉HAproxy,Keepalived检查到后会重新将HAproxy启动。

    [root@alex sysconfig]# killall haproxy

    刷新页面,可以看到HAproxy的pid改变了。

    7、这时我们将主服务器上的keepalived当掉,看VIP是否漂移到了从服务器上,从服务器接管服务。

    A、主服务器上:

    [root@Centos-Server ~]# killall keepalived
    [root@Centos-Server ~]# ip addr
    
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
        link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
        inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
        inet6 fe80::a00:27ff:fe42:712d/64 scope link
        valid_lft forever preferred_lft forever

    B、从服务器上:

    [root@Centos-Server ~]# ip addr
    
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
        link/ether 08:00:27:be:47:90 brd ff:ff:ff:ff:ff:ff
        inet 10.10.51.232/24 brd 192.168.4.255 scope global eth6
        inet 10.10.51.230/32 scope global eth6
        inet6 fe80::a00:27ff:febe:4790/64 scope link
        valid_lft forever preferred_lft forever

    VIP漂移OK!

    8、这时候重启主服务器的Keepalived,查看VIP是否漂移回来。

    [root@Centos-Server ~]# service keepalived start
    正在启动 keepalived:                                      [确定]
    
    [root@Centos-Server ~]# ip addr
    
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
        link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
        inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
        inet 10.10.51.230/32 scope global eth5
        inet6 fe80::a00:27ff:fe42:712d/64 scope link
        valid_lft forever preferred_lft forever

    VIP漂移到主服务器!

  • 相关阅读:
    svg 画地图
    小议 localStorage
    .NET Core 的缓存篇之MemoryCache
    .NET Core Session的简单使用
    .NET Core 使用NLog日志记录
    .NET Core 技巧汇总篇
    .NET Core 获取自定义配置文件信息
    微信支付教程系列之公众号支付
    微信支付教程系列之扫码支付
    微信支付教程系列之现金红包
  • 原文地址:https://www.cnblogs.com/hunttown/p/5451743.html
Copyright © 2020-2023  润新知