易陆发现互联网技术论坛

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

RabbitMQ集群

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

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

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

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

" @" {3 z5 i- W7 X( G$ S  \消息队列是OpenStack体系结构重要的组成部分,承载了各模块之间通信的重要功能,OpenStack默认选用的消息队列是基于erlang的RabbitMQ,RabbitMQ实现了AMQP协议,提供消息的持久化存储,支持镜像队列(Mirrored Queue)等特性。本文介绍如何利用RabbitMQ镜像队列模式以及HAProxy搭建高可用消息队列集群。& v. A! ]8 A' c7 j: |$ y( h  P

2 n/ O6 n  x; @为什么需要RabbitMQ集群?
* a* n! @1 i1 z$ {" w# Q- [对于典型的私有云部署规模:50台物理服务器,500台虚机。消息队列的主要负载来自于OpenStack各模块之间传递的信息,负载不算很大,因此单节点的RabbitMQ即可以搞定。而G版本发布之后,OpenStack引入了Ceilometer模块来负责提供云平台的监控功能,此模块使用消息队列进行监控数据的传递,下图展示了消息队列Ceilometer中的位置。
- Z% q6 ]0 \( v' N6 t/ I$ K5 U2 i
+ [' I; |6 C' q# m( ECeilometer架构图
' X* `$ z2 d; Z) Y8 P5 E
. D- {  {) l' D# \7 r: a# b在Ceilometer模块中,Compute Agent负责采集虚拟机实例的监控信息(Sample),经过转换(Transform)之后发布(Publish)到消息队列,Central Agent负责将服务相关的信息包装、转换并发布到消息队列,扮演了生产者的角色。而在消息队列的另一侧,作为消费者的Collector负责将相关监控信息以及各服务的通知信息(Notification)收集起来并持久化存储在数据库中。
+ b( K7 _( Y# I9 ~( b9 R/ f- p9 U' z# U0 Y
由于业务需要,我们对Ceilometer模块做了功能扩展,将物理服务器运行的监控信息以及底层共享存储(GlusterFS)产生的监控信息也一并通过Compute Agent发布到消息总线上。为了达到细粒度的监控效果,我们将ceilometer监控的轮询间隔时间设置为10秒。假设在刚刚列举的典型私有云部署环境中,约有10台左右的物理服务器,日常活跃虚拟机约为50台。
8 o; q4 Q1 M. `8 Q
5 k5 h# X% ~7 m, v' I每次监控任务轮询,总共大约会产生10000条左右的监控数据,这些监控数据形式各不相同,但基本都封装了监控项名称、监控值、时间等要素以及实例id、ip地址等元信息,如果一个集群每10秒都有这么多的数据产生并发布到消息队列,可想而知会对消息队列产生巨大的压力。同时,由于前端horizon等模块接收的用户操作也需要在消息队列上流转,这样的话一旦监控系统产生的数据阻塞了消息队列,则会对整个云平台造成毁灭性的打击。
/ D  ~2 Y% W- ~  N  p/ @5 `. f; R6 @) m! l0 ?
搭建过程5 Y$ u9 j# v0 L' e
由于云平台处在运行阶段,直接调整RabbitMQ的配置并不是一个很好的选择。于是我们折衷了一下,原有的RabbitMQ依旧运行,转而为Ceilometer另外搭建一套高可用的RabbitMQ集群,使用HAProxy做负载均衡。2 h  J& F% }6 M3 d
: p5 K! c9 q" R/ J$ B# r( ^; d
1. 安装准备
4 `  `  Y5 T. S- HRabbitMQ节点        IP地址        工作模式        操作系统
' w, r% z! x/ p9 {# \2 \! lrabbitmq1        192.168.60.87        RAM        openEluer-25.03* s3 P- r' R, G. D, Y1 c/ J# d1 |5 k
rabbitmq2        192.168.60.88        RAM        openEluer-25.03! _4 S( \% L2 }1 a0 w* j$ u' L
rabbitmq3        192.168.60.89        DISK        openEluer-25.03+ q0 I  n1 z( }9 h
集群共三台机器,其中两台为RAM模式运行,最后一台为DISK模式。
5 f% K0 ]% g. d9 }
/ x$ C" j- I' K  K- `0 h2. 安装RabbitMQ
8 q) n9 R$ S- [5 v8 q为了简化安装过程,我们并没有采取编译安装的方式,而是直接使用dnf进行安装,为了安装最新的RabbitMQ-3.12.0版本,需要修改dnf的源。首先在每一台机器都执行以下步骤:
( v' m3 o# Y# X- @4 q( L2 k, G
7 x$ t( R9 W6 U$ X; p" q. T) ], ~+ M2 z
# 2.2 添加RabbitMQ public key: {* y- M- S  W; Q* h  B/ `' _" G
, ?  ?) r8 N/ Z# o1 d1 N
# 2.3 更新并安装RabbitMQ, i1 n$ X; T8 i
dnf install -y rabbitmq-server2 Q( _5 b! l. I2 g& Z; o0 M& U
经过这个过程,就会将erlang以及RabbitMQ完整安装到所有机器中了。0 @: U. X4 v7 J

4 T6 n, o; p0 Q+ y5 f1 C' }; w3. 配置RabbitMQ集群
. p, @. E) n% a安装完毕之后, 需要在每台执行 :% F7 @/ U6 d% p; w% I
5 w6 o: T+ P( x6 w& Z8 M
# 3.1 停止服务
* W( \, _3 K  i2 Psystemctl stop rabbitmq-server.service 7 Q' o' ?1 f8 R1 e) @/ V; C7 l
# 3.2 设置erlang cookie在这里我们是自己生成的cookie文件,只要保证是二十位的大写字符,可以自己指定内容,保证所有机器上的cookie内容一致即可。5 g, T$ b2 H! d/ A/ H) i) Y2 b
echo 'MYRABBITMQCLMNHYVBGJK' > /var/lib/rabbitmq/.erlang.cookie
; d# h) N3 Y! Q) v
4 u9 C9 z( E  T. u2 H& h#修改文件的用户和用户组0 |  t+ K% ?4 w% ?0 f
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie6 L) n2 V# o) C' L! i! P

5 e2 ^$ }) k2 l* n- U#设置文件访问权限
9 D5 ^: y* f4 J- H' X0 [! t( @2 M0 A/ Y& a3 x$ B% d) ]1 }
chmod 400 /var/lib/rabbitmq/.erlang.cookie
9 k4 {+ J3 A5 o; f: [9 p
; d6 Y( A* p8 N! T; Y; D# 3.3 启动服务" e  C" i! ^5 g7 [* x$ k
systemctl start rabbitmq-server.service
+ O( d3 q3 k% Z- U3 H% F9 m" H- V. b7 m, e- j3 ^
# 3.4 设置RabbitMQ管理插件
( a) E+ c: [7 X; `2 D7 a1 nrabbitmq-plugins enable rabbitmq_management! {- H5 m9 W& F1 N1 B

( W/ w5 M% y. G! D+ k) n
3 }$ M* e7 B$ }( f0 H! x% }+ Z8 k$ R% r2 ], P8 E
rabbitmqctl add_user openstack 111111
: a: `1 ?3 @: j1 p4 a7 z* A& d8 C#opnetack用户,111111 是密码; g" b; K! D  k* ^8 d" v
; C% i0 `; n( o+ k" f
rabbitmqctl set_permissions openstack ".*" ".*" ".*"& P8 q& z/ y& I" |
#设置权限为读写. b' C& ?4 \" A" V2 y5 }" b$ B8 }% o

1 u% I1 s& O& [. S+ B& Vrabbitmqctl set_user_tags openstack administrator5 D$ }, f) F5 d0 p  m5 r, y
#设置管理员权限. I& N* ?, r% U* D  _/ e; A
. B, t* _  e3 o, R
# 3.5 关闭app& G& q) H, S1 d: F" z/ ]
rabbitmqctl stop_app
  \+ B& l- U& Z# t% l5 Z- _. p! x; s- _  B" v
# 3.6 重设+ H' x3 L) |+ h+ D
rabbitmqctl reset) P) t7 m. q2 G4 V. \
! P3 J' L" c3 C2 j* c$ [
# 3.7 根据需要设置当前节点的工作模式(ram/disk),HOSTNAME_ROOT为集群根节点的主机名,注意在此必须使用主机名而不是IP地址,在此,我们选择的是rabbitmq-1。在此join_cluster命令为3.0以上版本RabbitMQ使用,常用的2.7版本添加节点的方法与此不同,请查阅相关文档。! q" o7 h1 H1 @  p- ^" m5 v
# RAM7 o* V9 O) p5 I6 q; L
rabbitmqctl join_cluster --ram rabbit@${HOSTNAME_ROOT}
7 H9 u2 |% L: Q  \4 V
+ N& v$ o3 ?% h* X# DISK/usr/sbin/
0 [1 u7 {: V$ w1 @; ]
7 l+ F+ Y/ m& o* a& z& @rabbitmqctl join_cluster rabbit@${HOSTNAME_ROOT}) z9 H- {6 Z4 W) D  V. _- Y

! d$ r- F3 h1 X- B7 u8 m2 C& L# 3.8 开启app
( @& k) X4 [! `  e: A; _. U" G. I0 R0 @6 G. Y
/usr/sbin/9 I$ @! u( c! p+ j  F
rabbitmqctl start_app6 R5 o# g: b4 s  ~

1 m- a* j* u3 s! ?: ~' `# 3.9 重启服务  @  P+ D% F$ M! c4 L  f% M, P
systemctl restart rabbitmq-server.service
* S' @6 r9 h6 d/ A9 I- n/ k& E$ F5 M& O5 ~1 _. k, F( G  m
4. 添加用户' Z  r  ], x4 f
执行完以上的步骤集群中各个节点基本配置完毕了,现在要做的是添加用户和设置权限, 请在主节点上执行 :; R2 ]( P" a. D- `. u, |  I# {
' p, L5 ]0 q! {2 e/ H# I
# 4.1 添加用户,设置密码。在这里需要提醒一下,新版本(3.3.0)的RabbitMQ为了安全性考虑仅允许localhost使用#
1 H! J0 _; @8 H2 W( L9 Z. ?' O guest账户,所以最好根据应用需要建立自己的账户。
$ m/ i7 ?) q' o  _6 _* l因为要使用web页面管理,所以我建立了两个账户['web_admin','mgmt_admin']
" ?8 S* R" |5 G+ c. ~2 r" x( ~( y
; h- j* B5 f* `/ T  z  p9 nrabbitmqctl add_user username userpwd6 I* D# c* m5 Q$ b! o7 u6 T3 j
5 `- Q* R8 o) F( J1 r
# 4.2 设置用户tags# 5 Y" X! X- L: e5 X, T0 `
前一步创建的两个用户tag分别设为['monitoring','administrator'],设置完之后可以使用, V( O; c# b, s8 K- x) [) R
rabbitmqctl list_users
( e7 L4 D# Q+ y查看/usr/sbin/rabbitmqctl set_user_tags username usertag
( B1 h& [  A: [! M) d2 _# k
# m$ f+ ^) ?8 ~6 Y7 N0 v# 4.3 设置用户权限# 下面命令的意义是对username 用户赋予所有虚拟主机vhost(/),配置、写、读的权限(.*,正则表达式)' G4 H3 _( a0 X/ v
1 h2 P. }5 ^* r4 |, \
/usr/sbin/
7 ~2 ~/ i2 v+ M+ t9 rrabbitmqctl set_permissions -p / username ".*" ".*" ".*"& y1 ]2 `' E  b% ?  g1 D8 `7 t
& Q4 U! L5 M! Z  `' W
5. 设置高可用策略2 j9 T# K: l3 g; d2 m, }( e3 h
为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。
. {9 m! e% [4 f! C$ w3 j9 p" U) E! m1 h6 |. G# k' z
# 5.1 设置高可用策略
8 O, ?! z) K& H, p: L" S! B9 a/ e
/usr/sbin/% k1 b) U; Y  W% I
) H1 [/ f: E, ~
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'# A0 h1 v4 l- {! r* z/ Q$ ?8 R
+ n& X5 N7 F! M5 o
# x% y' ~$ u0 R1 v  f$ V- @% W
至此,RabbitMQ的安装配置部分结束,可以访问http://192.168.60.87:15672,用户名刚刚的用户名,密码xxxx进行访问。& |) z) S) T' n" \

4 p; O6 G% a) I0 ?9 X, |
9 f- G- R1 X5 n4 {3 }1 n6 m9 ?接下来是设置HAProxy。5 m0 P! c2 Y: A( x1 }
8 @8 r& m0 J5 d% I
6. HAProxy安装配置1 \# D) `4 Z8 ~6 M
将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。本例中我们使用rabbitmq-1运行负载均衡服务。) @: q) O, j  H# `  Z

2 T, c7 m, a5 I; z: }# 6.1 在rabbitmq-1安装HAProxyapt-get install haproxy' v. M; d. u" a. Y! }
设置/etc/haproxy/haproxy.cfg,下面我给出一个设置模板:
% Z2 d7 d# o9 s, y/ ]8 `: w- d+ d% g) x3 D. X3 f* }
global log , P5 K: K$ o* B0 z, J) h
127.0.0.1 local0log , S' A$ \* [$ y6 f
127.0.0.1 local1 notice
6 |' l# U9 l  y8 cmaxconn 4096
7 `  W* ~. @5 [: `. x! S7 V2 yuser haproxy
/ Z/ ^! t& w  W$ k, E; }+ m: Cgroup haproxy
% b1 ?& \6 I3 l2 ?& I1 f6 edaemon' Q! F% Y- y% w% g4 O+ y9 T

0 t) w) z& X2 o: n; n4 ^defaultslog global    #使用tcp监听模式mode tcp0 H% E; l& E) S; {  d$ C) c
option tcplog) z2 Y: S0 v8 R6 A/ ~9 r+ Q
option dontlognull* {: i( ?, K7 p0 \- x7 P3 P
retries 3option redispatch
- L% Z0 n; y0 k, zmaxconn 2000contimeout 5000clitimeout 50000srvtimeout 50000listen admin_stat  
) ~( m& R. L& y& z  ?' `8 c( x/ `3 T#haproxy的web管理端口 8889,自行设置
* S6 F2 }! V! Q0 P2 `# Mbind 0.0.0.0:8889
1 u/ o" E- o2 n8 y5 imode http
( I+ g0 f, j, \; o5 b$ vstats refresh 30s   #haproxy web管理url,自行设置stats uri /haproxy_stats
# j3 Z: n! l  \- j" W3 {% xstats realm Haproxy\ Statistics   #haproxy web管理用户名密码,自行设置stats auth admin:admin4 z6 E2 Q1 }& Y4 n" }
stats hide-versionlisten rabbitmq 0.0.0.0:5671   #监听5671端口,并转发给三个节点的5672端口,采用轮询策略mode tcp
2 @1 o! n: r! D3 {) kbalance roundrobin. d1 b$ `; c) r* @2 p
server rabbitmq-1 192.168.60.87:5672 check inter 2000 rise 2 fall 39 N0 p& \# E0 q
server rabbitmq-2 192.168.60.88:5672 check inter 2000 rise 2 fall 3, G5 b  x" w, t0 Y; Q6 Q6 K
server rabbitmq-3 192.168.60.89:5672 check inter 2000 rise 2 fall 3
9 c( W& h' _  t  `4 _0 f( P; C) n5 i/ ]1 v
# 6.2 启动haproxy服务4 A& p; G8 d. n2 S( |+ d1 @4 z
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D
6 s  I  n! J1 c5 Q
3 W! W; B% @$ s1 W9 Q- L至此,HAProxy设置完毕,可以通过http://192.168.60.87:8889/haproxy_stats, admin:admin" O* Q* v! A+ `* ~/ n5 {
访问haproxy的web管理端。
9 M6 }; l' G4 \2 o: V6 w- v, F3 x) h+ \! l
还有需要注意的是在ceilometer的配置文件/etc/ceilometer/ceilometer.conf中需要指明负载均衡服务器的地址,如果端口号不是5671请指明。1 W1 i( k. F! ~' J
. f$ E9 N! {+ Q
; j  k% E  M( N

* N+ n8 V3 A. u1 H0 m% E# }5 ^! D) Y9 ^2 `, S
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 点击这里给我发消息

GMT+8, 2026-4-8 13:40 , Processed in 0.042404 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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