易陆发现互联网技术论坛

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

RabbitMQ集群

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

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

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

x
openstack有非常良好的结构设计,各模块之间相互独立,通过API和消息队列来传递信息,这种结构能够很方便的实现规模和功能的扩展,这是云计算平台功能设计的基本出发点。
% q: [, V( Y* B& U7 g
" W- n" `* C3 Z5 O. l9 G9 x消息队列是OpenStack体系结构重要的组成部分,承载了各模块之间通信的重要功能,OpenStack默认选用的消息队列是基于erlang的RabbitMQ,RabbitMQ实现了AMQP协议,提供消息的持久化存储,支持镜像队列(Mirrored Queue)等特性。本文介绍如何利用RabbitMQ镜像队列模式以及HAProxy搭建高可用消息队列集群。
3 b( s3 d' C( F- z# }: Q; ~2 g8 ~2 _7 o% c& i+ F
为什么需要RabbitMQ集群?. e3 M) v9 j! p7 c
对于典型的私有云部署规模:50台物理服务器,500台虚机。消息队列的主要负载来自于OpenStack各模块之间传递的信息,负载不算很大,因此单节点的RabbitMQ即可以搞定。而G版本发布之后,OpenStack引入了Ceilometer模块来负责提供云平台的监控功能,此模块使用消息队列进行监控数据的传递,下图展示了消息队列Ceilometer中的位置。; ~3 l# }+ A9 Q

6 G+ ~$ p9 w& M5 o/ S5 S+ g# m/ UCeilometer架构图! G" z  U8 r5 \! p0 F
; t4 P! y& s& y1 u+ n2 v0 {
在Ceilometer模块中,Compute Agent负责采集虚拟机实例的监控信息(Sample),经过转换(Transform)之后发布(Publish)到消息队列,Central Agent负责将服务相关的信息包装、转换并发布到消息队列,扮演了生产者的角色。而在消息队列的另一侧,作为消费者的Collector负责将相关监控信息以及各服务的通知信息(Notification)收集起来并持久化存储在数据库中。
1 W3 h9 X  ^, c% T; j. t# G+ p& @% g8 [0 Q# v. {) o( @7 |$ ~
由于业务需要,我们对Ceilometer模块做了功能扩展,将物理服务器运行的监控信息以及底层共享存储(GlusterFS)产生的监控信息也一并通过Compute Agent发布到消息总线上。为了达到细粒度的监控效果,我们将ceilometer监控的轮询间隔时间设置为10秒。假设在刚刚列举的典型私有云部署环境中,约有10台左右的物理服务器,日常活跃虚拟机约为50台。
- V, U3 [8 p' T. M0 R
. D& u/ A% e& v$ J$ l, A每次监控任务轮询,总共大约会产生10000条左右的监控数据,这些监控数据形式各不相同,但基本都封装了监控项名称、监控值、时间等要素以及实例id、ip地址等元信息,如果一个集群每10秒都有这么多的数据产生并发布到消息队列,可想而知会对消息队列产生巨大的压力。同时,由于前端horizon等模块接收的用户操作也需要在消息队列上流转,这样的话一旦监控系统产生的数据阻塞了消息队列,则会对整个云平台造成毁灭性的打击。
$ t1 Z! K: W/ y8 X+ E
4 n, Q7 }9 q7 `% v9 T9 [$ X搭建过程
3 n6 y  s1 ?5 j由于云平台处在运行阶段,直接调整RabbitMQ的配置并不是一个很好的选择。于是我们折衷了一下,原有的RabbitMQ依旧运行,转而为Ceilometer另外搭建一套高可用的RabbitMQ集群,使用HAProxy做负载均衡。! F8 g! r7 s! x7 d8 Y
9 `0 R" u7 B# |/ e" X* ~" _/ V, Q/ y
1. 安装准备- j9 R  E2 T$ i* ^
RabbitMQ节点        IP地址        工作模式        操作系统
% }2 B3 j! Y2 {& f* Y5 I0 Vrabbitmq1        192.168.60.87        RAM        openEluer-25.03, y0 o' _7 O$ f7 a
rabbitmq2        192.168.60.88        RAM        openEluer-25.03
6 S9 k' q$ ^8 f# q3 irabbitmq3        192.168.60.89        DISK        openEluer-25.03; i2 a% T4 R; k7 V6 W
集群共三台机器,其中两台为RAM模式运行,最后一台为DISK模式。( a* V7 C6 v1 a+ z0 ^" H; T, r6 r4 x

8 k/ W5 E7 J6 O2. 安装RabbitMQ3 Y/ `4 Z4 k% T. Q
为了简化安装过程,我们并没有采取编译安装的方式,而是直接使用dnf进行安装,为了安装最新的RabbitMQ-3.12.0版本,需要修改dnf的源。首先在每一台机器都执行以下步骤:
2 S3 B7 S# Y' |5 g& j) R0 P; u  I4 x' S$ l. e

' @$ a; S. J1 F4 `; y* N* K5 {, g# 2.2 添加RabbitMQ public key
8 u" d* @' m4 i! S5 e. r, C
7 p4 G5 O9 b: s# 2.3 更新并安装RabbitMQ- F) j( o* V# u" Y
dnf install -y rabbitmq-server
7 w/ w' n8 S4 ^# V: q  p9 p经过这个过程,就会将erlang以及RabbitMQ完整安装到所有机器中了。6 O# j1 z- \( z% U8 ^: C
  E. T+ d5 _) p# S; }
3. 配置RabbitMQ集群+ d) `* y; O, X* T7 Q8 N: |
安装完毕之后, 需要在每台执行 :
0 x% w. s! M/ h4 V8 u1 u0 w
0 c. v' q# X6 Y" H9 H- C" s7 ^# 3.1 停止服务" W2 Y: p& v' ?, k) _
systemctl stop rabbitmq-server.service 0 K  k$ ~# ?" p) F. U9 G6 m) r; |& I
# 3.2 设置erlang cookie在这里我们是自己生成的cookie文件,只要保证是二十位的大写字符,可以自己指定内容,保证所有机器上的cookie内容一致即可。+ t0 [) a1 A, B- E5 k2 S' ^' q/ G
echo 'MYRABBITMQCLMNHYVBGJK' > /var/lib/rabbitmq/.erlang.cookie
' e- K% K) o1 i1 e5 R# m$ Q: c4 q3 l: k* s% w$ ]/ M7 e& {
#修改文件的用户和用户组
3 X. }' M* L9 F  k7 ^% l* _5 ^( V& vchown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
  v- N: @& u) x: h8 j. @2 R+ [( j2 I' Q: Y# O2 o! J" d* z: q
#设置文件访问权限# `8 \/ r0 F' y

" p$ W0 D- U1 z  J3 J. S. ochmod 400 /var/lib/rabbitmq/.erlang.cookie* l( T1 m. i' _+ `
6 Q" R- B; @. P' E  m+ n
# 3.3 启动服务
; b1 m7 h7 \8 t4 X: l1 U6 Fsystemctl start rabbitmq-server.service ) f; G" e& h* U: X7 v
: K- o3 e5 @  A; j% ^2 P
# 3.4 设置RabbitMQ管理插件
2 o+ x! B* p; I6 a) X& srabbitmq-plugins enable rabbitmq_management) {9 V, s4 ^4 m7 F/ w
" f% [7 C' t9 w. E5 M4 K: b5 c
+ b4 H  H. J8 X6 b
: Q! Z, V, [5 }. [
rabbitmqctl add_user openstack 111111
8 i% L7 B$ f0 M& R#opnetack用户,111111 是密码5 o1 w" h; d$ Q" w

( J: h+ h4 g/ b. A1 Srabbitmqctl set_permissions openstack ".*" ".*" ".*"
* }5 k2 M# ~6 n1 w+ y#设置权限为读写$ ^& o7 e, a0 y" ^; @+ ~

/ L! N0 J2 H6 V! T+ q0 k' {rabbitmqctl set_user_tags openstack administrator; ~# f9 j% W$ W4 L1 C. |7 Q  d
#设置管理员权限2 k$ _1 o1 B  e1 h! q4 t

1 A( s% J$ O4 L; I: f# 3.5 关闭app  ^4 E# }! @) U* j  d7 _! ]
rabbitmqctl stop_app$ M9 T4 j5 _. h+ H+ W. r5 G
) p! C, N$ {* ~, k
# 3.6 重设0 @7 {2 X& R2 D5 ^
rabbitmqctl reset: j5 u9 [9 M  \0 A/ \
' o1 S& q# i- g: q9 t/ D3 @$ l4 J
# 3.7 根据需要设置当前节点的工作模式(ram/disk),HOSTNAME_ROOT为集群根节点的主机名,注意在此必须使用主机名而不是IP地址,在此,我们选择的是rabbitmq-1。在此join_cluster命令为3.0以上版本RabbitMQ使用,常用的2.7版本添加节点的方法与此不同,请查阅相关文档。! Q3 A; f, N& p$ M5 J. g! }* h
# RAM! t- {- b; t, x" @4 W, `: f$ A# V
rabbitmqctl join_cluster --ram rabbit@${HOSTNAME_ROOT}
- H. e" r1 @+ Q$ i- F: y) W  i- S6 W0 `- ?+ J% X" _
# DISK/usr/sbin/
7 i3 M/ j$ ]! z8 `4 X. [0 x1 T
7 b6 r8 g9 Y( q1 h1 lrabbitmqctl join_cluster rabbit@${HOSTNAME_ROOT}/ {. m' l, u. t9 F) Q$ {% C' g7 w
2 Q8 ?- M- `4 X6 V1 W% N
# 3.8 开启app
# I5 @4 u& b9 M3 B! X) B2 u' }" K2 T/ x
/usr/sbin/
; o: f6 l' O0 W2 [& @rabbitmqctl start_app
' ~1 [6 T5 T7 _8 O# ]- T& |
# M5 W8 \; U, B- w4 [8 S# 3.9 重启服务4 m2 ?: j  }1 ~/ k6 x3 r8 L
systemctl restart rabbitmq-server.service ) Z# X5 I4 {2 U3 T
; i* v# f/ b  @! x
4. 添加用户
4 C8 L. ~5 d% N; u. C+ Z' K执行完以上的步骤集群中各个节点基本配置完毕了,现在要做的是添加用户和设置权限, 请在主节点上执行 :
1 ]* V8 Z+ U0 a7 ~
' q* L1 C  k9 S  [# [# 4.1 添加用户,设置密码。在这里需要提醒一下,新版本(3.3.0)的RabbitMQ为了安全性考虑仅允许localhost使用#
( {8 X1 P5 p* r( _: [ guest账户,所以最好根据应用需要建立自己的账户。
5 ~4 x7 d( H: g; b7 F1 A因为要使用web页面管理,所以我建立了两个账户['web_admin','mgmt_admin']6 C# t. u$ b9 X1 }4 \; U
$ p* U; }- G1 Q
rabbitmqctl add_user username userpwd
1 z* g7 k$ ?* `$ S4 Y; z9 {. k
/ }) Y( Z9 M( O# 4.2 设置用户tags# - i% |; `& c) _$ h2 B1 p; [
前一步创建的两个用户tag分别设为['monitoring','administrator'],设置完之后可以使用
' a3 p6 A8 R3 g6 u  lrabbitmqctl list_users$ F: w0 {! E5 i* G
查看/usr/sbin/rabbitmqctl set_user_tags username usertag- `8 E! g. S" H8 A
; {8 m0 e, Y0 Q/ z3 M
# 4.3 设置用户权限# 下面命令的意义是对username 用户赋予所有虚拟主机vhost(/),配置、写、读的权限(.*,正则表达式)
+ Q4 a  q7 _1 K& b0 L/ v5 j5 h# }
  L: q* N/ P; p; L) J! G; N/usr/sbin/
. n1 I0 ]) j% |. Yrabbitmqctl set_permissions -p / username ".*" ".*" ".*"
! i4 A& c+ e$ H  A, J- }; m: s; l! i
3 B. \$ F3 L, G  f% s5. 设置高可用策略
+ G; @7 [( p1 j0 W5 |1 w. H1 m& C- \为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。
6 a5 @8 i+ ]5 ]; n, X/ W
2 k6 \- Z1 E' T) F# 5.1 设置高可用策略
: |: c2 D/ F: W- i3 j4 |" j% i
- A6 Q9 k: ?" E( X9 [# A9 K/usr/sbin/
# h, F( Q, U* @$ [) e( m+ p% Q9 R) Y+ E0 ], h
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'+ L8 B, t$ Y, p) w9 Z3 C3 O

% x7 L) z& N3 W. m1 F- c" Q0 H$ X, Z: L1 ?: X
至此,RabbitMQ的安装配置部分结束,可以访问http://192.168.60.87:15672,用户名刚刚的用户名,密码xxxx进行访问。
) y3 F/ q8 l! f
8 D9 k3 H; ^+ ]8 L6 x
/ D# t$ W) q$ b. c: h$ y2 S接下来是设置HAProxy。0 n. z2 d0 `' `  Z! N+ e* V

. d: Y) b( c2 A  K6 W  P6. HAProxy安装配置
) {* A. f1 @. P将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。本例中我们使用rabbitmq-1运行负载均衡服务。" ]$ j6 {% b1 p" y" L; [. L4 c

4 S0 E1 o- N7 j7 [# 6.1 在rabbitmq-1安装HAProxyapt-get install haproxy6 s. E1 y. k' P6 N1 ]5 ?
设置/etc/haproxy/haproxy.cfg,下面我给出一个设置模板:
2 p; R1 B& p! o! P& Q! W* b% Z# c- Z# F" d# B
global log
3 D! c9 ?& t0 J: \127.0.0.1 local0log
3 S# x" q* f  V127.0.0.1 local1 notice
1 E" D1 F% ^* Q: p/ [1 l/ O0 \# k$ v0 ]maxconn 4096
- M, s$ O  |% I2 w- N$ luser haproxy
. B$ N2 Z+ \' x" Mgroup haproxy/ B2 E; b* K5 a2 s& c
daemon- ^2 f0 m( W, H$ v: T" f

, f/ {9 e4 O; \; vdefaultslog global    #使用tcp监听模式mode tcp
  q' v9 g6 j7 H6 F6 Q8 r7 `option tcplog' x+ f3 k, P( Z- h; h3 Q
option dontlognull2 f; @- r2 C' f4 r
retries 3option redispatch% M3 L! L0 {5 L# J( @
maxconn 2000contimeout 5000clitimeout 50000srvtimeout 50000listen admin_stat  
9 C, c0 w: y$ F, Y: z#haproxy的web管理端口 8889,自行设置
0 W! r! ^9 p" Zbind 0.0.0.0:8889
- Q  n& z4 V+ S* b3 c2 J' nmode http
- j! s+ N$ v- t/ H( sstats refresh 30s   #haproxy web管理url,自行设置stats uri /haproxy_stats% d, R* V" ?' \+ S
stats realm Haproxy\ Statistics   #haproxy web管理用户名密码,自行设置stats auth admin:admin; s. z. c. s) r2 T7 C6 P" D: w
stats hide-versionlisten rabbitmq 0.0.0.0:5671   #监听5671端口,并转发给三个节点的5672端口,采用轮询策略mode tcp
: `1 d6 A, D' l9 k- {' q- _2 gbalance roundrobin
/ q8 h3 z# v5 j( g$ |, e$ c4 Dserver rabbitmq-1 192.168.60.87:5672 check inter 2000 rise 2 fall 3  ~( z- x9 E! r6 I: J! S$ o
server rabbitmq-2 192.168.60.88:5672 check inter 2000 rise 2 fall 3
# w# D! d- J2 m7 @. Vserver rabbitmq-3 192.168.60.89:5672 check inter 2000 rise 2 fall 3! l  Y4 B2 n8 J& Z1 Q( Z5 r3 i6 V5 ?

& I5 H& H$ c' M; S+ ?. I0 q. n2 }/ ?# 6.2 启动haproxy服务% G6 @& y( s/ C* S# f, l  a
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D
3 e! T, q, |* k/ N0 {. P& |8 s7 G( m. r2 C  m
至此,HAProxy设置完毕,可以通过http://192.168.60.87:8889/haproxy_stats, admin:admin
& H* j, H0 o8 V( o, ~8 `, p2 @7 t' D访问haproxy的web管理端。7 ^9 r9 I+ T! p. r/ e

( k* M6 R. |  }/ d0 u8 W还有需要注意的是在ceilometer的配置文件/etc/ceilometer/ceilometer.conf中需要指明负载均衡服务器的地址,如果端口号不是5671请指明。% y# y0 v' n% e% o" }/ i/ j
2 D  }# u: C  z

- o# q, i- y9 J9 \: Z
. D1 E2 {$ o# B. `. h
& e% u3 M2 q3 R& h
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-8 13:45 , Processed in 0.054780 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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