博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
keepalived+haproxy实现高可用
阅读量:4625 次
发布时间:2019-06-09

本文共 8624 字,大约阅读时间需要 28 分钟。

  1. 实验环境:
    1. 2centos 6.5作为keepalived+haproxy的高可用,3centos6.5配置httpd作为后端server,haproxy的轮询采用rr调度算法。vip:192.168.8.199

ha1:eth1:192.168.8.41,keepalived+haproxy

ha3:eth1:192.168.8.43,keepalived+haproxy

 rs1:192.168.8.21.httpd

rs2:192.168.8.22.httpd

rs3:192.168.8.23.httpd

  1. ha1,ha2上安装keepalived+haproxy

yum -y install keepalived haproxy

  1. rs1,rs2,rs3上安装httpd,并更改默认首页。

yum -y install httpd

关闭rs1,rs2,rs3的防火墙,或者开发80端口,这里做实验方便一些,直接关闭防火墙。

service iptables stop

更改各自的首页,以便于识别是由哪个 rs提供服务的。

rs1: echo "rs1" > /var/www/html/index.html

rs2:echo "rs2" > /var/www/html/index.html

rs3:echo "rs3" > /var/www/html/index.html

启动httpd服务,在rs1,rs2,rs3:service httpd start

  1. 验证httpd是否正常,在ha1上运行:

curl http://192.168.8.21 看是否获取到rs1的内容,同样

curl http://192.168.8.22

curl http://192.168.8.23

  1. haproxy的配置:

上面的配置,保证了后端服务器提供服务的能力,这里我们要配置haproxy作为http反向代理服务器的配置。

ha1

cat /etc/haproxy/haproxy.cfg

你会看到默认配置文件。

首先更改日志到本地日志系统里面去。由于centos 6.5使用的是rsyslog,所以vi /etc/sysconfig/rsyslog

更改为:

SYSLOGD_OPTIONS="-c 5 -r"

然后重启rsyslog

[root@ha3 ~]# service rsyslog restart

关闭系统日志记录器:                                       [确定]

启动系统日志记录器:-r option only supported in compatibility modes 0 to 2 - ignored

提示错误,将5改成2,使用兼容模式。

然后在/etc/rsyslog.conf里面添加:  local2.*                       /var/log/haproxy.log进去,并且要启

# Provides UDP syslog reception

$ModLoad imudp

$UDPServerRun 514这两个参数。

用重启rsyslog service rsyslog restart

.更改后配置文件如下:

[root@ha1 ~]# cat /etc/haproxy/haproxy.cfg

global

    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon

    log         127.0.0.1 local2

    # turn on stats unix socket

    stats socket /var/lib/haproxy/stats

 

#---------------------------------------------------------------------

# common defaults that all the 'listen' and 'backend' sections will

# use if not designated in their block

#---------------------------------------------------------------------

defaults

    mode                    http

    log                     global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 3000

 

#---------------------------------------------------------------------

# main frontend which proxys to the backends

#---------------------------------------------------------------------

frontend http

        mode http

        bind *:80

        option httpclose

        option logasap

        option  dontlognull

        capture request header Host len 20

        capture request header Referer len 60

        default_backend servers

backend servers

        balance roundrobin

        server websrv1 192.168.8.21:80 check maxconn 2000

        server websrv2 192.168.8.22:80 check maxconn 2000

        server websrv3 192.168.8.23:80 check maxconn 2000

[root@ha1 ~]#service haproxy start

启动haproxy,则用curl 127.0.0.1 多用几次则可以发现在调度。

[root@ha1 ~]# cat /etc/haproxy/haproxy.cfg

#---------------------------------------------------------------------

# Example configuration for a possible web application.  See the

# full configuration options online.

#

#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt

#

#---------------------------------------------------------------------

 

#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

    # to have these messages end up in /var/log/haproxy.log you will

    # need to:

    #

    # 1) configure syslog to accept network log events.  This is done

    #    by adding the '-r' option to the SYSLOGD_OPTIONS in

    #    /etc/sysconfig/syslog

    #

    # 2) configure local2 events to go to the /var/log/haproxy.log

    #   file. A line like the following can be added to

    #   /etc/sysconfig/syslog

    #

    #    local2.*                       /var/log/haproxy.log

    #

    log         127.0.0.1 local2

 

    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon

 

    # turn on stats unix socket

    stats socket /var/lib/haproxy/stats

 

#---------------------------------------------------------------------

# common defaults that all the 'listen' and 'backend' sections will

# use if not designated in their block

#---------------------------------------------------------------------

defaults

    mode                    http

    log                     global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 3000

 

#---------------------------------------------------------------------

# main frontend which proxys to the backends

#---------------------------------------------------------------------

frontend  main *:5000

    acl url_static       path_beg       -i /static /images /javascript /stylesheets

    acl url_static       path_end       -i .jpg .gif .png .css .js

 

    use_backend static          if url_static

    default_backend             app

 

#---------------------------------------------------------------------

# static backend for serving up images, stylesheets and such

#---------------------------------------------------------------------

backend static

    balance     roundrobin

    server      static 127.0.0.1:4331 check

 

#---------------------------------------------------------------------

# round robin balancing between the various backends

#---------------------------------------------------------------------

backend app

    balance     roundrobin

    server  app1 127.0.0.1:5001 check

    server  app2 127.0.0.1:5002 check

    server  app3 127.0.0.1:5003 check

    server  app4 127.0.0.1:5004 check

 

[root@ha1 ~]#

ha3上同样配置如上内容。

可以使用scp命令直接把配置文件传送过去

ha1:scp /etc/haprxoy/haproxy.conf 192.168.8.43:/etc/haproxy

然后手动修改ha3上面的rsyslog的相关配置。

手动使用curl检测是否配置OK。。

  1. keepalived配置

通过上面的配置,两个haproxy已经配置OK,后端rs也准备就绪。把两个haproxy配置成高可用。

编辑ha1/etc/keepalived/keepalived.conf

由于我们这里只有一个实例,并且没有使用lvs的功能,故vrrp_groupvitrual_server都不需要定义。

配置文件:

ha1:

ha3:

[root@ha1 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

 

vrrp_instance keepalived {

    state MASTER

    interface eth1

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.8.199/24

    }

}

 

 

[root@ha1 ~]#

[root@ha3 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

 

vrrp_instance keepalived {

    state BACKUP

    interface eth1

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.8.199/24

    }

}

 

 

[root@ha3 ~]#

结合日志和curl的工具,确定最先开始由ha1提供服务,将ha1,keepalived停掉后切换到ha3上面了。证明高可用成功。

  1. 结合状态检测,当haproxy出现故障时候自动切换。

要实现haproxy出现故障时自动切换,两种方案:一种利用vrrp_script 来监控业务状态。进行权重减值。另外一种,直接利用脚本监控haproxy的状态,OK后就开启keepalived,失败后就停用keepalived

  1. 利用vrrp_script来监控业务状态,进行权重减值。既然要监控haproxy的状态,我们可以直接调用haproxy的状态页面来进行确认。其调用方法为:不能定义在frontend字段里面。可以定义在其他字段

backend private_monitoring

        stats enable

        stats uri     /admin?stats

        stats refresh 5s

说明:

stats enable

  Enable statistics reporting with default settings

  May be used in sections :   defaults | frontend | listen | backend

                                 yes   |    no    |   yes  |   yes

开启haproxy的监控页面。将上面参数添加到backend里面去。然后重启haproxy,利用curl 127.0.0.1:80/admin?stats就可以查看是否正常开启监控页面。这里监控页面已经打开,那么编写vrrp_scrpit来监控业务状态。

curl  -m 5  -I  localhost:80/admin?stats -o /dev/null -s 用来检测是否正常,正常情况下#?的值为0,异常为>0

 

keepalivedglobal_def之后紧跟着定义vrrp_script 脚本

vrrp_script check_haproxy {

script "/usr/bin/curl -m 5  -I  localhost:80/admin?stats -o /dev/null -s"

interval 6

weight -20

}

interval 6 代表,代表6秒运行一次。

weight -20 表示当script返回值为非0时,权重减去对应的值。

如果weight为正值,表示script返回值=0时,权值加值。

上面的优先级不会不停的降低。

 

keepalived vrrp_instance keepalived 里面添加如下内容:

track_script

{

check_haproxy

}

即可。这样当haproxy挂掉后,会自动切换到backup上面去。当masterhaproxy挂掉后,自动恢复到master

  1. 直接利用脚本,间隔运行监控haproxy的状态,当haproxy状态异常的时候,直接停用keepalived,其状态恢复后,启用keepalived,这样也可以实现业务层面的异常后切换。并且这个还需要识别是人工停用,还是手动停用的keepalived,人工由于配置等原因停用的keepalived则,不处理。保持其状态。

#!/bin/bash

touchfile=/tmp/keepalived_check_status.txt

haproxy_http_stats=`curl -I -m5 -o /dev/numm localhost:80/admin?stats -s -w %{http_stats] `

if [ "$haproxy_http_stats != 200 ] ;

then

ps -A | grep haproxy | grep -v grep | grep keepalived> /dev/null && service keepalived stop && touch $touchfile

else

ps -A | grep haproxy | grep -v grep | grep keepalived> /dev/null || [ -f $touchfile ] && service keepalived start && rm -r $touchfile

fi

然后放到定时任务里面 ,每分钟执行一次即可。

 

 

 

 

转载于:https://www.cnblogs.com/LKad/p/5357096.html

你可能感兴趣的文章
记录:一次数据库被恶意修改配置文件的问题
查看>>
redis 持久化
查看>>
解决Jupyter notebook[import tensorflow as tf]报错
查看>>
Windows平台下使用ffmpeg和segmenter实现m3u8直播点播
查看>>
python网络画图——networkX
查看>>
ubuntu16.04文件形式安装mongodb
查看>>
SpringBoot------ActiveMQ安装
查看>>
详细了解 int? 类型
查看>>
字符串匹配 ?kmp : hash
查看>>
mongod.service: control process exited, code=exited status=1
查看>>
c# 发送邮件、附件 分类: C# 2014-12-...
查看>>
对360来说,江湖上再无“搜狗”这个传说
查看>>
composer
查看>>
OpenCV特征点检测——ORB特征
查看>>
mysql的csv数据导入与导出
查看>>
leetcode笔记:Pascal's Triangle
查看>>
ASP.NET性能优化之构建自定义文件缓存
查看>>
Shell——windows上写完放入linux的时候需要注意的问题
查看>>
65条常用的正则表达式
查看>>
Vscode断点调试PHP
查看>>