使用 haproxy 实现 Rabbitmq 负载均衡集群记录

撸代码的王 后端 2020-10-27
  • 安装haproxy
tar -zxvf haproxy-1.7.9.tar.gz
cd haproxy-1.7.9/ 
uname -r #查看内核版本
make TARGET=linux-glibc PREFIX=/usr/local/haproxy

#解决依赖
yum -y install make gcc gcc-c++ openssl-devel
make install PREFIX=/usr/local/haproxy 


#如果没有修改 Makefile 配置文件中 PREFIX 变量的值,
#就必须在此重新对,PREFIX=/usr/local/haproxy 赋值,
#否则直接执行 make install 时,make install 会直接读取Makefile 文件中 PREFIX 的变量值。
 ls /usr/local/haproxy/

 没有生成配置文件,自己手动写一个 HAproxy 配置文件
mkdir /usr/local/haproxy/etc
vim /usr/local/haproxy/etc/haproxy.cfg #手动创建配置文件


内容如下:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local0
chroot /usr/local/haproxy # 改变当前工作目录
pidfile  /usr/local/haproxy/run/haproxy.pid # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
maxconn 4000 # 最大连接数,默认4000
uid 65534 # 默认用户
gid 65534 # 默认组
daemon # 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为daemon
#stats socket /var/lib/haproxy/stats # 创建监控所用的套接字目录
#---------------------------------------------------------------------
# defaults settings
#---------------------------------------------------------------------
# 注意:因为要使用tcp的负载,屏蔽掉与http相关的默认配置
defaults
mode http # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
log global
log 127.0.0.1 local3 #日志文件的输出定向。产生的日志级别为 local3. 系统中local1-7,用户自己定义
# option httplog # 采用http日志格式
option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
# option http-server-close # 每次请求完毕后主动关闭http通道
# option forwardfor except 127.0.0.0/8 # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries 3 # 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 # 最大连接数
###################### 打开haproxy的监测界面###############################
listen status
bind 0.0.0.0:9188
mode http
stats enable
stats refresh 30s
stats uri /haproxy-stats #设置haproxy监控地址为http://localhost:9188/stats
stats auth admin:123456 #添加用户名密码认证
stats realm (Haproxy\ statistic)
stats admin if TRUE
######################监听rabbitmq的web操作页面############################
listen rabbitmq_admin
bind 0.0.0.0:15670
server rabbit1 127.0.0.1:15672
server rabbit2 123.26.270.89:15672
server rabbit3 87.33.146.46:15672
#######################监听rabbimq_cluster #################################
listen rabbitmq_cluster
bind 0.0.0.0:5670
mode tcp
balance roundrobin #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
server rabbit1 127.0.0.1:5672 check inter 5000 rise 2 fall 2 #check inter 2000 是检测心跳频率
server rabbit2 123.26.270.89:5672 check inter 5000 rise 2 fall 2 #rise 2是2次正确认为服务器可用
server rabbit3 87.33.146.46:5672 check inter 5000 rise 2 fall 2 #fall 2是2次失败认为服务器不可用


#server node1 192.168.179.131:8081 check inter 2000 rise 3 fall 3 weight 30
# inter 2000 健康检查时间间隔 2 秒
# rise 3 检测多少次才认为是正常的
# fall 3 失败多少次才认为是不可用的
# weight 30 权重#---------------------------------------------------------------------



  • 关于负载均衡算法
source 根据请求源 IP
static-rr 根据权重
leastconn 最少连接者先处理
uri 根据请求的 uri
url_param 根据请求的 url 参数 
rdp-cookie 据据 cookie(name)来锁定并哈希每一次请求
hdr(name) 根据 HTTP 请求头来锁定每一次 HTTP 请求
roundrobin 轮询方式



  • 使用 nobody 用户运行 haproxy:
id nobody
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody) #id 为 65534 



  • 复制 haproxy 启动脚本,到/etc/init.d 下
cp ./haproxy-1.7.9/examples/haproxy.init /etc/init.d/haproxy 
chmod 755 /etc/init.d/haproxy
vim /etc/init.d/haproxy 

#此脚本需修改地方较多,因此,可以把原文件的内容删除,把以下的内容添加即可。
#!/bin/sh
# chkconfig: - 85 15
# description: HA-Proxy server
# processname: haproxy
# config: /usr/local/haproxy/etc/haproxy.cfg
# pidfile: /usr/local/haproxy/run/haproxy.pid
# Source function library.
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
 . /etc/rc.d/init.d/functions
else
 exit 0
fi
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
# This is our service name
BASENAME=`haproxy`
BIN=/usr/sbin/haproxy
CFG=/usr/local/haproxy/etc/haproxy.cfg
[ -f $CFG ] || exit 1
PIDFILE=/usr/local/haproxy/run/haproxy.pid
LOCKFILE=/usr/local/haproxy/run/haproxy
RETVAL=0
start() {
 quiet_check
 if [ $? -ne 0 ]; then
 echo "Errors found in configuration file, check it with '$BASENAME check'."
 return 1
 fi
 echo -n "Starting $BASENAME: "
 daemon $BIN -D -f $CFG -p $PIDFILE
 RETVAL=$?
 echo
 [ $RETVAL -eq 0 ] && touch $LOCKFILE
 return $RETVAL
}
stop() {
 echo -n "Shutting down $BASENAME: "
 killproc $BASENAME -USR1
 RETVAL=$?
 echo
 [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
 [ $RETVAL -eq 0 ] && rm -f $PIDFILE
 return $RETVAL
}
restart() {
 quiet_check
 if [ $? -ne 0 ]; then
 echo "Errors found in configuration file, check it with '$BASENAME check'."
 return 1
 fi
 stop
 start
}
reload() {
 if ! [ -s $PIDFILE ]; then
 return 0
 fi
 quiet_check
 if [ $? -ne 0 ]; then
 echo "Errors found in configuration file, check it with '$BASENAME check'."
 return 1
 fi
 $BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)
}
check() {
 $BIN -c -q -V -f $CFG
}
quiet_check() {
 $BIN -c -q -f $CFG
}
rhstatus() {
 status $BASENAME
}
condrestart() {
 [ -e $LOCKFILE ] && restart || :
}
# See how we were called.
case "$1" in
 start)
 start
 ;;
 stop)
 stop
 ;;
 restart)
 restart
 ;;
 reload)
 reload
 ;;
 condrestart)
 condrestart
 ;;
 status)
 rhstatus
 ;;
 check)
 check
;;
 *)
 echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"
 exit 1
esac
exit $?



  • 复制 haproxy 文件到/usr/sbin 下
  • 因为上面的 haproxy.init 启动脚本默认会去/usr/sbin 下找
cp /usr/local/haproxy/sbin/haproxy /usr/sbin/
#创建目录和权限
mkdir -p /usr/local/haproxy/run
chown nobody /usr/local/haproxy/ -R



  • 配置日志收集
  • vim /etc/rsyslog.conf #打开以下两行的注释,不打开收不到日志
15 $ModLoad imudp #取消注释
16 $UDPServerRun 514 #取消注释
73 local7.* /var/log/boot.log #下面添加两行
74 local3.* /var/log/haproxy.log
75 local0.* /var/log/haproxy.log
  • systemctl restart rsyslog 重启日志服务

  • HAproxy 脚本启动方法
/etc/init.d/haproxy start 
或者
systemctl restart haproxy
  • haproxy 停止
killall haproxy #没有 killall 命令?安装 yum -y install psmisc
Apipost 私有化火热进行中

评论