易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 93|回复: 0
收起左侧

RabbitMQ集群

[复制链接]
发表于 2025-10-15 12:00:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
openstack有非常良好的结构设计,各模块之间相互独立,通过API和消息队列来传递信息,这种结构能够很方便的实现规模和功能的扩展,这是云计算平台功能设计的基本出发点。! o. a1 B! A, C7 h* e1 y

' x/ l( E- S$ A) |; L# [) W消息队列是OpenStack体系结构重要的组成部分,承载了各模块之间通信的重要功能,OpenStack默认选用的消息队列是基于erlang的RabbitMQ,RabbitMQ实现了AMQP协议,提供消息的持久化存储,支持镜像队列(Mirrored Queue)等特性。本文介绍如何利用RabbitMQ镜像队列模式以及HAProxy搭建高可用消息队列集群。4 e# w8 B. D, g* V! F- V) W

+ }- z  \2 k" \/ s. k为什么需要RabbitMQ集群?( v+ M  m9 j. M* P* v6 q
对于典型的私有云部署规模:50台物理服务器,500台虚机。消息队列的主要负载来自于OpenStack各模块之间传递的信息,负载不算很大,因此单节点的RabbitMQ即可以搞定。而G版本发布之后,OpenStack引入了Ceilometer模块来负责提供云平台的监控功能,此模块使用消息队列进行监控数据的传递,下图展示了消息队列Ceilometer中的位置。
9 ?( n7 n5 Y8 T- F1 Y, m/ A* K5 X9 B; t5 ~
Ceilometer架构图4 [+ S9 ^; t& y! ?1 l
/ `& O& o- z: k) J
在Ceilometer模块中,Compute Agent负责采集虚拟机实例的监控信息(Sample),经过转换(Transform)之后发布(Publish)到消息队列,Central Agent负责将服务相关的信息包装、转换并发布到消息队列,扮演了生产者的角色。而在消息队列的另一侧,作为消费者的Collector负责将相关监控信息以及各服务的通知信息(Notification)收集起来并持久化存储在数据库中。
5 v" r/ q9 ~8 v4 `4 m# ?( M
$ H- d/ x8 w8 a, \由于业务需要,我们对Ceilometer模块做了功能扩展,将物理服务器运行的监控信息以及底层共享存储(GlusterFS)产生的监控信息也一并通过Compute Agent发布到消息总线上。为了达到细粒度的监控效果,我们将ceilometer监控的轮询间隔时间设置为10秒。假设在刚刚列举的典型私有云部署环境中,约有10台左右的物理服务器,日常活跃虚拟机约为50台。7 _2 ^2 _  Z8 Y& v1 ?
9 v1 H. q8 o- Z% P4 q4 A& S
每次监控任务轮询,总共大约会产生10000条左右的监控数据,这些监控数据形式各不相同,但基本都封装了监控项名称、监控值、时间等要素以及实例id、ip地址等元信息,如果一个集群每10秒都有这么多的数据产生并发布到消息队列,可想而知会对消息队列产生巨大的压力。同时,由于前端horizon等模块接收的用户操作也需要在消息队列上流转,这样的话一旦监控系统产生的数据阻塞了消息队列,则会对整个云平台造成毁灭性的打击。, u5 J2 ^3 v% S" m" g; y2 u
$ a7 Z2 [* J1 U; ?7 h; Z
搭建过程
9 U; ^# o6 t, y7 ^: E# x9 w. l4 m' {由于云平台处在运行阶段,直接调整RabbitMQ的配置并不是一个很好的选择。于是我们折衷了一下,原有的RabbitMQ依旧运行,转而为Ceilometer另外搭建一套高可用的RabbitMQ集群,使用HAProxy做负载均衡。+ w7 J0 k( E1 e' o

# @6 i+ K/ S  B, M2 j' R1. 安装准备/ G! i3 R% T& p5 {
RabbitMQ节点        IP地址        工作模式        操作系统( c  D! w' z0 J
rabbitmq1        192.168.60.87        RAM        openEluer-25.03( ?; X5 j. U. v
rabbitmq2        192.168.60.88        RAM        openEluer-25.03
  C5 d" R  R  q  A% z1 {rabbitmq3        192.168.60.89        DISK        openEluer-25.03
" W$ L( N, g/ w" I集群共三台机器,其中两台为RAM模式运行,最后一台为DISK模式。( s/ `( f& v  c; _7 W/ E

- A1 J( i4 W/ y( P/ W% w+ w2. 安装RabbitMQ& C3 Y% y! V4 q1 M3 @# W+ G* B
为了简化安装过程,我们并没有采取编译安装的方式,而是直接使用dnf进行安装,为了安装最新的RabbitMQ-3.12.0版本,需要修改dnf的源。首先在每一台机器都执行以下步骤:4 ?1 |1 l, ?# U

/ B9 M: r, G; n9 F1 K9 h
/ h: |4 t- d( a: j+ p# 2.2 添加RabbitMQ public key6 V9 O" e; d) J" d; m, {" O5 C

% [  Z6 d+ y% z8 [* U2 b* D5 Y# 2.3 更新并安装RabbitMQ4 P( g* p8 Q+ x% s' F6 w
dnf install -y rabbitmq-server9 @8 \: n' h+ o' \. M) H
经过这个过程,就会将erlang以及RabbitMQ完整安装到所有机器中了。6 F" T. b$ u" _* z1 Z% J

& e  F  U/ _0 L# r, M8 I0 x$ Z  g3. 配置RabbitMQ集群$ O4 c; d0 \5 Y' x
安装完毕之后, 需要在每台执行 :: I4 h5 |' C  Q* Y/ \
1 D7 c, k( [( J/ Q
# 3.1 停止服务1 m2 J( |, {; B& _6 Z: A
systemctl stop rabbitmq-server.service ' `" |7 u/ C1 n; f; }
# 3.2 设置erlang cookie在这里我们是自己生成的cookie文件,只要保证是二十位的大写字符,可以自己指定内容,保证所有机器上的cookie内容一致即可。
$ d3 w) R& v- M; n3 X  q& G3 z3 {9 secho 'MYRABBITMQCLMNHYVBGJK' > /var/lib/rabbitmq/.erlang.cookie" P7 w/ L3 N" \  s7 y" F. w: Y

/ x0 }" J, G. I- V1 |& z#修改文件的用户和用户组
7 Y' L; e& L( O3 y' e& x9 nchown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
& k9 y& Z7 K( g0 r1 t' _) f, o0 F& U+ _0 v' U4 L
#设置文件访问权限
! y# [) T" g3 C9 k3 y1 \5 `" @' d" G
chmod 400 /var/lib/rabbitmq/.erlang.cookie+ i0 Y9 `$ f) w( g) c

0 M. r3 y, g* `; N2 F# 3.3 启动服务0 _/ M' N( c6 Y  `
systemctl start rabbitmq-server.service
& i( f" u$ E" J" s  m! M' U% |* b/ e: C; W/ l7 s
# 3.4 设置RabbitMQ管理插件
; |* r4 A8 m# J! @, Lrabbitmq-plugins enable rabbitmq_management
( A) a6 k/ u& |2 B! @. [: ~0 f/ q
1 s. T$ S; J$ L2 D! M8 ?" a3 y5 Y  V! ~) @6 r2 ?1 O) ?% I! s7 n
9 d. C6 W8 Q/ e) `$ L: y
rabbitmqctl add_user openstack 111111* j7 E1 ~2 U4 b0 J! w; X, `
#opnetack用户,111111 是密码
3 W5 D  \) c: G" \# E3 H& f$ n : a$ F' c& M. M& O
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
% x5 _: @& `# |#设置权限为读写
- z7 K; ^) i# z4 O6 c- s. ` ( s) ]6 D) _; f0 \0 [4 o4 F8 M) H" S7 {
rabbitmqctl set_user_tags openstack administrator/ l% Z8 k, C! u5 _
#设置管理员权限/ @% H' H7 i/ Q. ^
- u$ y: N0 {2 D& ]: t
# 3.5 关闭app
4 ]" M  ?0 s! B* l# j# v4 U0 frabbitmqctl stop_app! w+ s9 b! j: M6 S5 E5 g
2 M0 Y: g, a+ I
# 3.6 重设2 V+ |9 L9 F. }1 y+ Z  l0 c5 W: W
rabbitmqctl reset( A( Q3 @% ]) v6 @7 j: p" h+ [% Z
. d/ e( w, J4 f) j: _
# 3.7 根据需要设置当前节点的工作模式(ram/disk),HOSTNAME_ROOT为集群根节点的主机名,注意在此必须使用主机名而不是IP地址,在此,我们选择的是rabbitmq-1。在此join_cluster命令为3.0以上版本RabbitMQ使用,常用的2.7版本添加节点的方法与此不同,请查阅相关文档。
$ Z) w: _" |' `+ ]9 i( S  f# RAM0 x8 V7 a* J0 m% b' R. a, q
rabbitmqctl join_cluster --ram rabbit@${HOSTNAME_ROOT}1 e5 ~+ k8 Q/ |! D
- n5 T& _/ j) [2 O; Y
# DISK/usr/sbin/5 B9 ]8 B: P, }7 X
7 Y" A) S7 M9 q; H/ h
rabbitmqctl join_cluster rabbit@${HOSTNAME_ROOT}
1 X+ d/ j/ Y: ~, Q- V; Q% ]
  D- y' B1 v1 i, W6 M# 3.8 开启app
5 t6 Y% p+ _+ |% o  _) E
- X" Z, F6 }/ q. w/usr/sbin/
6 c+ x- R8 B% S& mrabbitmqctl start_app
' y0 g- i0 m& u4 k7 Z0 V$ a4 I
* B  A" [! z. c% l) @1 \& w1 x# 3.9 重启服务
: \7 {  Z: j  osystemctl restart rabbitmq-server.service 5 t' m  t) ?2 l' B& W! d

- T& {, t3 S! w/ \% ]4. 添加用户- W+ R3 f* C" w0 y# H4 c- B( z1 T
执行完以上的步骤集群中各个节点基本配置完毕了,现在要做的是添加用户和设置权限, 请在主节点上执行 :
3 x: w& U0 e7 D5 P, G$ v
, J% s  H) Z1 V! W1 c# 4.1 添加用户,设置密码。在这里需要提醒一下,新版本(3.3.0)的RabbitMQ为了安全性考虑仅允许localhost使用#; K6 P9 W9 P( f- l
guest账户,所以最好根据应用需要建立自己的账户。7 H5 x4 U. C- ~" l" o3 I
因为要使用web页面管理,所以我建立了两个账户['web_admin','mgmt_admin']
) j! |) @" `5 r  P
$ _$ U( {% {* Zrabbitmqctl add_user username userpwd* A( u: A( a* l6 j. t. s

1 _) g' Q# F- u: w. O4 G; J# 4.2 设置用户tags# * w" L  }0 v( w% x- `
前一步创建的两个用户tag分别设为['monitoring','administrator'],设置完之后可以使用. _/ P- N6 V% c( n
rabbitmqctl list_users
3 ^2 B- a: I. Y5 F* ]0 V查看/usr/sbin/rabbitmqctl set_user_tags username usertag
2 A1 C0 u+ t4 U/ r& j3 c% Y& [" }( |
+ j& N+ u2 \/ L$ z+ L+ r# 4.3 设置用户权限# 下面命令的意义是对username 用户赋予所有虚拟主机vhost(/),配置、写、读的权限(.*,正则表达式)
6 T/ i0 L) q& `/ G  b
1 {$ v% W* H2 H2 X; `/usr/sbin/
: J; y7 g3 e/ vrabbitmqctl set_permissions -p / username ".*" ".*" ".*"+ m- r( f1 e7 o  [' a" Y0 G6 s2 m
  x: B& d: ]  i* J
5. 设置高可用策略
2 F) t$ k( Y' s为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。
" J1 p# R- k" L, @9 f  l3 S0 D' A% Q7 o6 T9 Z5 I& c  @& \( b
# 5.1 设置高可用策略
0 Y  C% t% C; w' |. N- r9 H% ]9 \1 i" |; z+ M$ Z
/usr/sbin/; y+ u7 u2 s6 ]
) T8 u4 g' L; f2 h+ g( G; o
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
7 W- L9 T& x7 f, C
  I; n5 B' S/ Q4 {/ t5 `, t, y
/ O! C8 u  F. h7 Z至此,RabbitMQ的安装配置部分结束,可以访问http://192.168.60.87:15672,用户名刚刚的用户名,密码xxxx进行访问。# I0 [5 {# s2 g  K+ K; {+ `1 J

3 A6 n* \  r$ n1 E" j4 s# `$ v+ I$ }0 M
接下来是设置HAProxy。4 I& `" d$ s. B$ g+ F/ u. a

" e8 }* m7 p9 J; j+ F2 y; s, _6. HAProxy安装配置
8 |  j7 l, Q& V, @& {8 u& W2 v将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。本例中我们使用rabbitmq-1运行负载均衡服务。& S& Z/ H' s, u
5 N0 I4 i$ W$ j" d
# 6.1 在rabbitmq-1安装HAProxyapt-get install haproxy
2 H/ m3 {& Y6 U: L- Q设置/etc/haproxy/haproxy.cfg,下面我给出一个设置模板:
  {1 n$ Z7 k5 V: z' e5 O
+ g. y! G  n8 M+ ?* g" X. wglobal log / H! O  i3 G- B0 c2 J
127.0.0.1 local0log
# S( V1 U9 l4 s" z6 Z: s) P127.0.0.1 local1 notice2 _. r+ @/ j( ]
maxconn 40969 T" [- `5 r* X# U  T2 r3 F
user haproxy4 G8 X/ t$ V- j2 M9 M. R
group haproxy
- K# g; g8 d: d1 X4 H: Udaemon
9 W; U, k' ~3 e* D; e" [+ F) I! l  F3 ~% z, O  Y
defaultslog global    #使用tcp监听模式mode tcp* o4 V7 t5 X) p1 b
option tcplog
5 q7 A6 V- a1 foption dontlognull. @7 {" T/ j' C$ `- h2 Q1 X; l- Z
retries 3option redispatch4 Z/ W- x' p# W; h
maxconn 2000contimeout 5000clitimeout 50000srvtimeout 50000listen admin_stat  8 D) h" I  r- ~2 [& E
#haproxy的web管理端口 8889,自行设置! f& M* ^1 t: n& n
bind 0.0.0.0:8889+ d' M3 i+ r; ^+ z- T- X
mode http
. Z" I2 O  ?( lstats refresh 30s   #haproxy web管理url,自行设置stats uri /haproxy_stats( T( L( D& B( X* n5 H
stats realm Haproxy\ Statistics   #haproxy web管理用户名密码,自行设置stats auth admin:admin
# Z/ F7 M! E5 L: y6 G. B9 _. i* Xstats hide-versionlisten rabbitmq 0.0.0.0:5671   #监听5671端口,并转发给三个节点的5672端口,采用轮询策略mode tcp2 G. T/ C! u+ K1 G
balance roundrobin/ {3 J2 T+ G' a
server rabbitmq-1 192.168.60.87:5672 check inter 2000 rise 2 fall 3
2 |# P- }* Z( y5 L+ `server rabbitmq-2 192.168.60.88:5672 check inter 2000 rise 2 fall 32 c/ p4 u: ^, @5 a
server rabbitmq-3 192.168.60.89:5672 check inter 2000 rise 2 fall 3
4 V5 j' g) w6 G1 h0 n" k' [. |- d8 t6 v. i- D
# 6.2 启动haproxy服务
7 p) [  G  {6 P/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D
, h/ n* R% e4 d0 R& k, k3 y" n* I
至此,HAProxy设置完毕,可以通过http://192.168.60.87:8889/haproxy_stats, admin:admin1 J  w) p& G: _; H) ^
访问haproxy的web管理端。/ F, s4 W' b. X0 ]0 a3 o

7 a8 ?  ~( m" M0 n还有需要注意的是在ceilometer的配置文件/etc/ceilometer/ceilometer.conf中需要指明负载均衡服务器的地址,如果端口号不是5671请指明。5 h# K% J( \% Y$ y& I

0 Q- x& }; v2 C9 K
& C1 f) E: x, p( h2 f) B# v$ K5 K
5 `7 @( V) }; P9 [8 Y
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 19:53 , Processed in 0.049108 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表