haproxy集群+keepalived

针对上一篇博客的karaf集群,在项目中的计划是需要部署一个对外提供http接口的插件(两台karaf中各部署一个http).

那么就有一个问题,对于两台服务器上的集群,怎么通过一个地址实现对集群中接口的轮询访问?  --负载均衡

 

1.haproxy

选择nginx和haproxy都可以.

简介:

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

安装:

下载 haproxy-2.1.4.tar.gz

yum install gcc     --虚拟机是最小安装,所以需要手动安装c环境

tar -zxvf haproxy-2.1.4.tar.gz   --解压缩

cd haproxy-2.1.4   --进入haproxy目录

make TARGET=linux310    编译, 注意一定要在haproxy-2.1.4文件夹内, 里面有markfile文件,否则会报错make: *** 没有指明目标并且找不到 makefile。 停止。

make install PREFIX=/usr/local/haproxy   --安装

mkdir /usr/local/haproxy/conf   

cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg   --拷贝源码中的配置文件,用来配置haproxy

 

配置haproxy.cfg:

#进程,安全配置,性能调整,Debug参数
global
        log 127.0.0.1 local0 debug  #日志输出配置,所有日志都记录在本机,通过local0输出 info日志级别
        maxconn 4096 #每个HAproxy进程的最大连接并发数
        user root  #用户
        group nobody  #组
        daemon  ##以后台形式运行ha-proxy
        nbproc 1  #启动3个ha-proxy进程,可以设置多个进程提高性能
        pidfile /usr/local/haproxy/logs/haproxy.pid  ##pid文件位置
#为frontend, listen, backend提供默认配置
defaults
        #log  global            #集成全局配置中的日志格式
        log 127.0.0.1 local0 info
        mode http  #所处理的类别(#7层 http;4层tcp) tcp模式一般用于,SSL,SSH,SMTP,MySQL等应用
        retries 3  #3次连接失败就认为该服务不可用
        balance  roundrobin               # rr 轮询负载均衡
        timeout connect 10s #连接超时
        timeout client 20s #客户端超时
        timeout server 30s #后端服务器超时
        timeout check 5s #设置对后端服务器的检测超时时间,默认单位是毫秒
        timeout http-request 10s  # 请求报文的超时时长

#此部分用于设置接收用户请求的前端虚拟节点,并根据ACL规则直接指定要使用的后端backend
frontend www
        bind 0.0.0.0:8008
        mode    http
        option  httplog ##启用日志记录http请求
        option  forwardfor #通过X-Forwarded-For信息,来记录客户端来源IP
        option  httpclose #表示在客户端和服务器端完成一次连接请求后,HAproxy将主动关闭此TCP连接
        log     global
        default_backend htmpool

#此部分用于设置群集后端服务集群的配置,处理前端用户的请求,添加真实的服务器
backend htmpool
        mode    http
        option  redispatch #如果后端服务器发生故障,会通过此参数,将客户的请求强制定向到另外一台健康的后端服务器上,以保证服务正常
        option  abortonclose #此参数可以在服务器负载很高的情况下,自动结束当前队列中处理时间比较长的连接
        balance roundrobin #定义负载均衡算法
        cookie  SERVERID #表示允许向cookie插入serverid
        #option httpchk GET /index.html  #启用http的服务状态检测功能
        #option  httpchk HEAD /index.html  HTTP/1.1\r\nHost:\ www.xxx.com  # 头部检测格式
        server  web1 192.168.147.129:8001 cookie server1 weight 6 check inter 2000 rise 2 fall 3
        server  web2 192.168.147.130:8001 cookie server2 weight 6 check inter 2000 rise 2 fall 3
#       注释如下:
        #服务器定义web1,cookie表示serverid为web1
        #check  inter  2000 检测心跳频率
        #rise 3 是三次正确认为服务器可用  fall 3  是三次失败认为服务器不可用
        #weight代表权重,backup为备份节点

#用来设置haproxy代理服务页面,监听整个后端集群状态       
listen admin_stats
        bind 0.0.0.0:9188
        mode http
        log global
        stats refresh 30s #设置HAproxy监控统计页面自动刷新时间
        stats uri /haproxy-status #设置HAproxy监控统计页面的URL路径
        stats realm welcome login\ Haproxy #设置登录HAproxy监控统计页面时,密码框上的文本提示信息
        stats auth admin:admin123 #设置登录HAproxy统计页面的用户名和密码,可以为监控页面设置多个用户名和密码,每行一个
        stats hide-version #用来隐藏统计页面上HAproxy的版本信息
        stats admin if TRUE #可以在监控页面上手工启用或禁用后端真实服务器
        #balance roundrobin
        #server system_01 192.168.147.129:8001 check inter 2000 rise 3 fall 3
        #server system_02 192.168.147.130:8001 check inter 2000 rise 3 fall 3

 
要转发的后端地址可以在backend,也可以在listen中配置:

1.frontend+backend: frontend监听某端口,拦截对该端口的请求,转发到backend

2.listen:直接监听某端口,定义负载均衡算法(共7种),绑定后端地址

 

启动:

/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg

 

后端没开启监听的服务,所以会报没有可用服务,先开启一个服务

listen中配置了一个前端服务页面: ip:9188/haproxy-status  

可以看到一个服务开启,一个服务关闭

查看haproxy的日志:

可以在配置文件中看到关于日志的设置 log 127.0.0.1 local0 debug ,需要在系统日志进行设置

vim /etc/rsyslog.conf 

添加

local0.*     /var/log/haproxy/haproxy.log     #日志位置

重启 service rsyslog restart

2.haproxy集群和keepalived

部署一个haproxy解决了对karaf集群的负载均衡,如果haproxy挂了呢?是不是就没法访问后台两个服务.

解决 :在每台服务器上部署haproxy+keepalived搭建高可用集群

思路: 两台keepalived会抢占虚拟ip100, 当主服务器master挂掉, 虚拟ip会自动漂移到备服务器,保证后台服务的高可用.

keepalived简介

KeepAlived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,  VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行.所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能.

keepalived安装

1.yum安装

不推荐, 我第一次这么安装的, 版本太低,导致后期出现了bug,调不通

2.安装包安装

版本: keepalived-2.0.18.tar.gz

源码目录: /usr/local/keep

安装目录: /usr/local/keepalived

源码目录下:

[root@localhost keep]# ls
keepalived-2.0.18  keepalived-2.0.18.tar.gz
[root@localhost keep]# cd keepalived-2.0.18
[root@localhost keepalived-2.0.18]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-2.0.18]# make && make install

./configure后出现的问题:

报错:OpenSSL is not properly installed on your system
解决:yum -y install openssl-devel

报错:this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS
解决:yum -y install libnl libnl-devel

编译后:

[root@localhost local]# cd /usr/local/keepalived/
[root@localhost keepalived]# ls
bin  etc  sbin  share

安装目录下会自动生成文件:
/usr/local/etc/keepalived/keepalived.conf
/usr/local/etc/sysconfig/keepalived
/usr/local/sbin/keepalived

设置服务启动:

[root@localhost keepalived]# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/keepalived
[root@localhost keepalived]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
[root@localhost keepalived]# cp /usr/local/keep/keepalived-2.0.18/keepalived/etc/init.d/keepalived  /etc/init.d/keepalived
[root@localhost keepalived]# mkdir /etc/keepalived
[root@localhost keepalived]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf 

keepalived启动/状态/停止: systemctl  start/status/stop keepalived

keepalived配置

[root@localhost keepalived]# vim /etc/keepalived/keepalived.conf

!Configuration File for keepalived

global_defs
{
#   notification_email {       #发生故障时,接受信息的邮箱地址
#    [email protected]
#    [email protected]
#     [email protected]
#   }
#   notification_email_from [email protected]

   script_user root
 #  enable_script_security
   smtp_server 127.0.0.1
   smtp_connect_timeout 30 #连接超时时间
   router_id LVS_DEVEL #服务器名称
#   vrrp_skip_check_adv_addr
#   vrrp_strict
#   vrrp_garp_interval 0
#   vrrp_gna_interval 0
}

vrrp_script chk_haproxy
{
   script "/etc/keepalived/check_ha.sh"  #对haproxy的检测脚本
   interval 2  #时间间隔/s
   weight 2
}

vrrp_instance VI_1 {
    state MASTER    #主
    interface ens33  #监听接口
    virtual_router_id 51
    priority 100  #优先级
    advert_int 1  #检查间隔
    authentication {
        auth_type PASS #认证类型
        auth_pass 1111 #认证密码
    }
    virtual_ipaddress {
        192.168.147.100  #虚拟ip,可以设置多个
    }
    track_script {
        chk_haproxy
    }
}

vrrp_script定义了haproxy的检测脚本位置以及检测时间间隔

脚本check_ha.sh:

#!/bin/bash
echo "start check"
A=`ps -C haproxy --no-header |wc -l` ## 查看是否有 haproxy进程 把值赋给变量A
if [ $A -eq 0 ];then ## 如果没有进程值得为 零
#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
#sleep 3
#if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
#service keepalived stop
systemctl stop keepalived
fi
#fi

备服务器上修改配置文件,其他的都不变:

state BACKUP    #备
       priority 90  #优先级

启动日志: /var/log/messages

报错: Unsafe permissions found for script '/etc/keepalived/check_ha.sh' - disabling.
Disabling track script chk_haproxy due to insecure
解决: --global_defs 中不要使用enable_script_security,而应该使用user root.正如上面给出的keepalived.conf一样

问题: 如果出现systemctl stop keepalived关闭不了keepalived进程
解决: vim /usr/lib/systemd/system/keepalived.service
      注释掉 #KillMode=process
      systemctl daemon-reload

 

演示:

1.启动129,130上的karaf

2.启动129,130上的haproxy

3.启动129,130上的keepalived,可以看到目前虚拟ip在129上

4.postman请求接口两次,轮询,访问到129,130的karaf各一次

5.手动关闭129的haproxy,可以看到虚拟ip已经漂移到130上

6.postman请求接口两次,轮询,访问到129,130的karaf各一次,正常

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章