一、软件的安装
1.ip分配
192.168.242.110 VIP
192.168.242.36 haproxy+keepalived
192.168.242.37 haproxy+keepalived
192.168.242.38 tomcat
192.168.242.39 tomcat
2.软件安装
# yum install -y haproxy keepalived
# systemctl enable haproxy
# systemctl enable keepalived
二、配置haproxy
1 配置haproxy
HAProxy配置中分五大部分:
global:全局配置参数,进程级的,用来控制Haproxy启动前的一些进程及系统设置
defaults:配置一些默认的参数,可以被frontend,backend,listen段继承使用
frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理
backend:定义后端服务器集群,以及对后端服务器的一些权重、队列、连接数等选项的设置
listen:为frontend和backend的组合体
Haproxy有8种负载均衡算法(balance),分别如下:
1.balance roundrobin # 轮询,软负载均衡基本都具备这种算法
2.balance static-rr # 根据权重,建议使用
3.balance leastconn # 最少连接者先处理,建议使用
4.balance source # 根据请求源IP,建议使用
5.balance uri # 根据请求的URI
6.balance url_param # 根据请求的URl参数'balance url_param' requires an URL parameter name
7.balance hdr(name) # 根据HTTP请求头来锁定每一次HTTP请求
8.balance rdp-cookie(name) # 根据据cookie(name)来锁定并哈希每一次TCP请求
配置如下
# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 info #日志输出配置,所有日志都记录在本机,通过local0输出
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
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 # mode语法mode {http|tcp|health} http是七层模式 tcp是四层模式 health是健康检测返回OK
log global # 应用全局的日志配置
option httplog # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志,默认的日志格式很简单
option dontlognull # 启用该项,日志中将不会记录空连接
option httpclose # 使用该参数,每处理完一个request时,haproxy都会去检查http头中的Connection的值,如果该值不是close,haproxy将会将其删除
# 如果该值为空将会添加为:Connection:close 使每个客户端和服务器端在完成一次传输后都会主动关闭TCP连接
# 与该参数类似的另外一个参数是“option forceclose”,该参数的作用是强制关闭对外的服务通道,
# 因为有的服务器端收到Connection:close时,也不会自动关闭TCP连接,如果客户端也不关闭,连接就会一直处于打开,直到超时
option http-server-close # 在使用长连接时,为了避免客户端超时没有关闭长连接,此功能可以使服务器端关闭长连接
option forwardfor except 127.0.0.0/8 # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch # 在后端某一个server宕机,允许当前会话被重新分发
option abortonclose # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
retries 3 # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
# balance source # 表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法
timeout http-request 10s # http请求超时时间
timeout queue 1m # 一个请求在队列里的超时时间
timeout connect 10s # 连接超时
timeout client 180s # 设置客户端的最大超时时间
timeout server 1m # 设置服务器端的最大超时时间
timeout http-keep-alive 10s # 设置http-keep-alive的超时时间
timeout check 10s # 心跳检测时间
maxconn 4096 # 限制单个进程的最大连接数
listen status 0.0.0.0:8888 #监控页面的端口
mode http
stats enable
stats refresh 10s #统计页面自动刷新时间
stats uri /haproxy-admin #监控页面的访问地址
stats realm Haproxy\ Statistics #统计页面密码框上提示文本
stats auth admin:123456 #统计页面用户名和密码设置
stats hide-version #隐藏统计页面上HAProxy的版本信息
frontend tomcat_frontend
bind *:8080
mode tcp
option tcplog #tcp日志格式
default_backend tomcat_backend
backend tomcat_backend
mode tcp
balance source
server tomcat01 192.168.242.38:8080 check inter 2000 fall 3 weight 30
server tomcat02 192.168.242.39:8080 check inter 2000 fall 3 weight 30
2 haproxy的日志输出: 默认输出到/var/log/messages 现在我们使之输出到/var/log/haproxy.log
# 修改rsyslog配置
# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp #将这两行的注释去掉
$UDPServerRun 514
local2.* /var/log/haproxy.log #最后添加一行
# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r" #加选项 -r
# 修改ha配置
# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 info
# 重启服务
# systemctl restart rsyslog
# systemctl restart haproxy
# ls /var/log/haproxy.log #查看下 会出现日志
/var/log/haproxy.log
三、配置keepalived
# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
script "/etc/keepalived/chk_haproxy.sh"
interval 2
weight -4
}
vrrp_instance VI_1 {
state BACKUP # MASTER
interface ens34
virtual_router_id 51
priority 90 # master的优先级 大于 backup 的优先级
advert_int 1
mcast_src_ip 192.168.242.37 # 本机ip
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.242.110
}
unicast_peer {
192.168.242.36 #另外几台keepalived服务器地址
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/send_mail.sh master"
notify_down "/etc/keepalived/send_mail.sh down"
notify_backup "/etc/keepalived/send_mail.sh backup"
}
#检测haproxy的脚本
# cat /etc/keepalived/chk_haproxy.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
echo "here11"
systemctl start haproxy
sleep 3
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
echo "here22"
systemctl stop keepalived
fi
fi
# 当keepalived的状态改变时 发邮件
# cat send_mail.sh
#!/bin/bash
stat="$1"
ip=`ip addr |grep -w inet|grep -v 127.0.0.1 |awk '{print $2}' |head -1`
d=`date`
case $stat in
"master")
echo "$d: backup --> master $ip !" >> /root/mail.txt
;;
"baskup")
echo "$d: master --> backup $ip !" >> /root/mail.txt
;;
"down")
echo "$d: something wrong in $ip !" >> /root/mail.txt
;;
esac