使用 haproxy 实现 Rabbitmq 负载均衡集群记录
【摘要】 下载地址 https://github.com/haproxy/haproxy/releases/ 在 github 可以下载安装haproxytar -zxvf haproxy-1.7.9.tar.gzcd haproxy-1.7.9/ uname -r #查看内核版本make TARGET=linux-glibc PREFIX=/usr/local/haproxy#解决依赖yum -y ...
- 下载地址 https://github.com/haproxy/haproxy/releases/ 在 github 可以下载
- 安装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,可以完美替代postman。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)