针对上一篇博客的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各一次,正常