易陆发现互联网技术论坛

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

RabbitMQ集群

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

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

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

x
openstack有非常良好的结构设计,各模块之间相互独立,通过API和消息队列来传递信息,这种结构能够很方便的实现规模和功能的扩展,这是云计算平台功能设计的基本出发点。2 E! Y7 ^" s& J$ n/ I6 ]% n% ?4 y

$ ?( G! B6 l* k/ Z/ z消息队列是OpenStack体系结构重要的组成部分,承载了各模块之间通信的重要功能,OpenStack默认选用的消息队列是基于erlang的RabbitMQ,RabbitMQ实现了AMQP协议,提供消息的持久化存储,支持镜像队列(Mirrored Queue)等特性。本文介绍如何利用RabbitMQ镜像队列模式以及HAProxy搭建高可用消息队列集群。
4 q7 n3 y+ E2 w/ G! R& w9 E# Z
1 b% I. ?( P/ f$ Q5 j为什么需要RabbitMQ集群?% M0 F3 L9 }, p+ x2 q
对于典型的私有云部署规模:50台物理服务器,500台虚机。消息队列的主要负载来自于OpenStack各模块之间传递的信息,负载不算很大,因此单节点的RabbitMQ即可以搞定。而G版本发布之后,OpenStack引入了Ceilometer模块来负责提供云平台的监控功能,此模块使用消息队列进行监控数据的传递,下图展示了消息队列Ceilometer中的位置。
7 `9 R% U4 @& `1 M0 t; B& y4 W7 \: |. p* s9 b& T' Q8 f
Ceilometer架构图
8 L5 h/ O5 {/ l7 t; m
' v* p$ V2 D& O. X在Ceilometer模块中,Compute Agent负责采集虚拟机实例的监控信息(Sample),经过转换(Transform)之后发布(Publish)到消息队列,Central Agent负责将服务相关的信息包装、转换并发布到消息队列,扮演了生产者的角色。而在消息队列的另一侧,作为消费者的Collector负责将相关监控信息以及各服务的通知信息(Notification)收集起来并持久化存储在数据库中。; E3 r' t# v3 w  [9 p# L/ Y/ q

8 K2 J( g0 P0 f5 M由于业务需要,我们对Ceilometer模块做了功能扩展,将物理服务器运行的监控信息以及底层共享存储(GlusterFS)产生的监控信息也一并通过Compute Agent发布到消息总线上。为了达到细粒度的监控效果,我们将ceilometer监控的轮询间隔时间设置为10秒。假设在刚刚列举的典型私有云部署环境中,约有10台左右的物理服务器,日常活跃虚拟机约为50台。
# C( d+ p8 B0 Z$ X: K
; r" @5 Y* O9 R8 f( ^) z0 W5 F1 Y% E每次监控任务轮询,总共大约会产生10000条左右的监控数据,这些监控数据形式各不相同,但基本都封装了监控项名称、监控值、时间等要素以及实例id、ip地址等元信息,如果一个集群每10秒都有这么多的数据产生并发布到消息队列,可想而知会对消息队列产生巨大的压力。同时,由于前端horizon等模块接收的用户操作也需要在消息队列上流转,这样的话一旦监控系统产生的数据阻塞了消息队列,则会对整个云平台造成毁灭性的打击。
7 w2 f/ ^6 Z% ?0 P4 N/ L% b9 H2 O1 h3 q# v3 l' V
搭建过程! f" R1 l* E& Z: ~" v
由于云平台处在运行阶段,直接调整RabbitMQ的配置并不是一个很好的选择。于是我们折衷了一下,原有的RabbitMQ依旧运行,转而为Ceilometer另外搭建一套高可用的RabbitMQ集群,使用HAProxy做负载均衡。
4 `  g; I) m4 Q) d
1 W! T& ^" |* V1. 安装准备7 w1 u" O' |7 }' y/ i8 p
RabbitMQ节点        IP地址        工作模式        操作系统# ~% F6 L  |* ^% s4 Y& ]
rabbitmq1        192.168.60.87        RAM        openEluer-25.03
0 x' I# d* v( b4 f+ B; erabbitmq2        192.168.60.88        RAM        openEluer-25.03
) P6 r. R) D5 M! G3 Jrabbitmq3        192.168.60.89        DISK        openEluer-25.03
$ M  s  _( j! h7 A集群共三台机器,其中两台为RAM模式运行,最后一台为DISK模式。6 M# \+ K5 @! {# E+ ?
& F0 Y3 |# G  E( G* E* P/ h+ B6 U
2. 安装RabbitMQ; ?) j% e. I. F% c) [
为了简化安装过程,我们并没有采取编译安装的方式,而是直接使用dnf进行安装,为了安装最新的RabbitMQ-3.12.0版本,需要修改dnf的源。首先在每一台机器都执行以下步骤:7 M: ^0 C3 i; \0 T2 b/ L8 W
  h' K  `. ^& u7 d5 ~
5 j1 ?: ?+ e$ E( m9 P
# 2.2 添加RabbitMQ public key
, w6 \- Y2 k; ^' y, R; F+ ~0 ~: @( Q& F, W9 r# V; X( J8 c
# 2.3 更新并安装RabbitMQ; r6 b' d' _  U9 F
dnf install -y rabbitmq-server" S# Z: o  o) O5 m/ f7 y7 s0 J
经过这个过程,就会将erlang以及RabbitMQ完整安装到所有机器中了。
9 W: t4 J4 r2 n7 I/ x
; V9 ^9 C1 m: h2 ]2 Y! U/ W3. 配置RabbitMQ集群; U! {8 P. B" U' `3 m6 _5 ]( b- F
安装完毕之后, 需要在每台执行 :
  j9 ^( O4 i3 M9 p) `+ ^3 v
. [5 @* p: M+ E* u, S! G# 3.1 停止服务0 x7 g! m/ d$ B. L
systemctl stop rabbitmq-server.service 6 T' O! }5 ?( X+ {& ?4 A2 ?
# 3.2 设置erlang cookie在这里我们是自己生成的cookie文件,只要保证是二十位的大写字符,可以自己指定内容,保证所有机器上的cookie内容一致即可。( E- ~, q4 H' B
echo 'MYRABBITMQCLMNHYVBGJK' > /var/lib/rabbitmq/.erlang.cookie- H$ X5 F4 f. {$ Y  T+ l) m0 J# W

9 g; D0 n5 t% c7 G4 {#修改文件的用户和用户组
8 w6 ]1 \# r6 ]" C1 O5 q& ?# F: mchown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
- ^3 i% u$ Q: P- w) {) J* \* a
6 {! i( z* o1 u5 S4 }- _$ ^8 l* ~#设置文件访问权限
( P5 A/ X4 B  W  @, |6 N$ |+ c3 r" K) l6 ]9 o$ t# \: n
chmod 400 /var/lib/rabbitmq/.erlang.cookie( r( b& B! }8 {! E

& A2 G0 p  g9 W6 _! S3 |! R! t3 S# z# 3.3 启动服务
+ R3 w" }' ^5 t2 _* m/ H& ysystemctl start rabbitmq-server.service 2 L! x- K2 U; B" ^% D- g
5 F$ U3 R, z9 }9 ]: r8 A
# 3.4 设置RabbitMQ管理插件
( f3 |. i! S3 A6 u8 v; Crabbitmq-plugins enable rabbitmq_management: s  G$ {* c' W0 ?

! q4 S# n* b; X& j' }
) ?( a3 r; A3 N/ R" G3 u4 e8 G4 d
7 d6 x+ A  V+ T1 G) R2 ?2 L: rrabbitmqctl add_user openstack 111111* e$ E5 j7 I7 y- |6 E
#opnetack用户,111111 是密码
6 _- ]- T2 Q: [% ~/ Q7 X
" E0 ?& k" o  {; s) c3 I2 K3 qrabbitmqctl set_permissions openstack ".*" ".*" ".*"
/ B7 O2 o) f( \#设置权限为读写+ |. x8 _2 P$ c- w
/ D$ _* q9 ^1 F# d; @+ ^
rabbitmqctl set_user_tags openstack administrator4 Q) y; X7 m7 @8 L5 }8 R
#设置管理员权限
: w+ P8 P) u7 B7 f1 c% m8 @0 a- h; ?+ ]
# 3.5 关闭app8 B2 p% y# X. H6 `2 I
rabbitmqctl stop_app
4 [, K" S; E. S! J3 V- l
+ g6 ~( w5 ~/ ]/ s+ |  F/ {% H# 3.6 重设
  L' h. x$ {$ }6 ?0 {, v; H8 m6 frabbitmqctl reset
: f" M* t% L, u7 D5 I" H) e, J% w
# 3.7 根据需要设置当前节点的工作模式(ram/disk),HOSTNAME_ROOT为集群根节点的主机名,注意在此必须使用主机名而不是IP地址,在此,我们选择的是rabbitmq-1。在此join_cluster命令为3.0以上版本RabbitMQ使用,常用的2.7版本添加节点的方法与此不同,请查阅相关文档。
. ~; E6 g# q" m# s0 }/ C* e7 Y# RAM
3 `- X+ ?- \9 L$ w$ {7 e6 grabbitmqctl join_cluster --ram rabbit@${HOSTNAME_ROOT}( Q  n5 V7 X; @

" d3 @7 _: N- i  F8 _1 r; }# DISK/usr/sbin/
  K* R. G+ A' E/ N! s: g
" [3 B* O. j9 M6 H1 Qrabbitmqctl join_cluster rabbit@${HOSTNAME_ROOT}
, b' }1 u4 I2 I$ T# R* _( g" g9 A: d# \
# 3.8 开启app
4 X# |6 l" T; L, ~$ }/ w* n% t
/usr/sbin/
' l: d! a. [6 e4 N& w7 M0 lrabbitmqctl start_app
/ x9 C9 n5 _4 ^% v( J$ w. G/ ?+ R& t4 m2 f5 J$ }4 C1 U
# 3.9 重启服务) R% G  K+ L1 _& w" U+ W" u) k8 b" E
systemctl restart rabbitmq-server.service
& n- d" n7 b. L- H
( t! L7 x/ o/ O9 [4. 添加用户
9 k3 B) B: m6 A, ?8 C执行完以上的步骤集群中各个节点基本配置完毕了,现在要做的是添加用户和设置权限, 请在主节点上执行 :
2 B+ Z+ T3 v  O0 t; ~3 n. I3 \6 s- k
# 4.1 添加用户,设置密码。在这里需要提醒一下,新版本(3.3.0)的RabbitMQ为了安全性考虑仅允许localhost使用#
! w( y+ S: @8 ~* f- X guest账户,所以最好根据应用需要建立自己的账户。
: y) A* o' A) r/ L1 n  F因为要使用web页面管理,所以我建立了两个账户['web_admin','mgmt_admin']9 B% a3 U; d! [2 B7 e
" l- D6 o+ \% X+ ~# Q
rabbitmqctl add_user username userpwd
( X! z2 v" o% M* ^) F0 A9 T; ^& a6 \( r  }
# 4.2 设置用户tags# 4 T3 l8 Y: }% C) V. b! s7 P- I
前一步创建的两个用户tag分别设为['monitoring','administrator'],设置完之后可以使用! r2 s" E3 \( l! V: f& h/ t
rabbitmqctl list_users9 \9 k+ v: l: _! a3 O# z( z4 P
查看/usr/sbin/rabbitmqctl set_user_tags username usertag( `+ d6 k: O" B7 r' o% C( `3 m2 M

' H8 ^& U; x# \4 W7 k% q8 b' U% Y- t! m# 4.3 设置用户权限# 下面命令的意义是对username 用户赋予所有虚拟主机vhost(/),配置、写、读的权限(.*,正则表达式)! s/ s9 x/ H5 {4 X3 T

1 H  |$ O! G, \; z7 ~. h$ T/usr/sbin/
, B" Z. r' d* b: J+ ~8 c0 Xrabbitmqctl set_permissions -p / username ".*" ".*" ".*". t+ i0 f7 {5 H+ p' @7 i. `' {

) ]. E* @* T3 T0 b0 u( Z6 j5. 设置高可用策略: f) O% v: W2 D6 P; l, P5 l
为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。
) D  M$ d1 \0 g: e: j8 Z" W# u. T" K
# 5.1 设置高可用策略* P1 [3 r; a0 X! n! j/ m  l
, J3 @- P* g8 D' W% C8 {) r
/usr/sbin/
4 }6 u6 n! W3 K3 `: f7 y& b
2 I1 }) T  Y+ ]' D, e: f& U1 \rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
1 Y* L: }: N0 B. r) b. [9 O# {4 S$ p: Z3 N

# r* d" R1 S7 p: R. \0 l) @至此,RabbitMQ的安装配置部分结束,可以访问http://192.168.60.87:15672,用户名刚刚的用户名,密码xxxx进行访问。+ Y  a2 [9 J  Q
! g# x& O; t. N
* O4 H# s& f( ]
接下来是设置HAProxy。
. }% o9 K" E" f3 R  {( ^$ W1 o9 Z& Q) t7 i
6. HAProxy安装配置6 w  O+ ~- E1 U
将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。本例中我们使用rabbitmq-1运行负载均衡服务。4 \+ }2 w" ~2 q
* \& I; Y6 V5 [' ^  D0 x+ ]& K) U
# 6.1 在rabbitmq-1安装HAProxyapt-get install haproxy
  `' b3 Y' a5 a6 K' g设置/etc/haproxy/haproxy.cfg,下面我给出一个设置模板:$ ?- Y5 O; F  ^- X# m

+ D" M# y" W# ]  [% e5 bglobal log
4 M* @- O6 i8 B4 o9 H" a" V127.0.0.1 local0log + H7 g8 s  K0 m( T
127.0.0.1 local1 notice9 Z' W) ^6 J0 M: K) O0 R  y
maxconn 40968 J7 B. w: y. W% y/ m
user haproxy
4 X9 s; g8 n  |  l( W' e& {group haproxy
: ^  C1 K. I8 g* Y8 q0 |6 Ldaemon
( z+ l1 @( L5 o% c0 ^+ n$ A4 w5 Y4 u/ C
defaultslog global    #使用tcp监听模式mode tcp  S$ U- [: n1 ^; s
option tcplog
+ ^' P1 A. u9 P0 s& @) I0 q' Moption dontlognull
, E3 t0 i; b: ]$ l) X1 R4 v/ M3 z, P4 G! jretries 3option redispatch
0 H; u- C8 K/ J. L4 K. Q1 g+ dmaxconn 2000contimeout 5000clitimeout 50000srvtimeout 50000listen admin_stat  / Y( W" C, }; R# o) f: f4 K7 C
#haproxy的web管理端口 8889,自行设置7 Y( r5 ~7 w* c
bind 0.0.0.0:8889
, i+ B4 D! G+ m$ mmode http4 m- M8 w2 t+ @& H
stats refresh 30s   #haproxy web管理url,自行设置stats uri /haproxy_stats, x* _" o4 Y5 l- \5 x$ }- P2 r+ x
stats realm Haproxy\ Statistics   #haproxy web管理用户名密码,自行设置stats auth admin:admin
' p9 t; P( D) n: M, lstats hide-versionlisten rabbitmq 0.0.0.0:5671   #监听5671端口,并转发给三个节点的5672端口,采用轮询策略mode tcp# P& h/ `, x8 o! Q% s  h  u
balance roundrobin  |8 h4 `8 }( v! C9 {: L
server rabbitmq-1 192.168.60.87:5672 check inter 2000 rise 2 fall 3  a& m. K  X; E" d: r2 W" W" d
server rabbitmq-2 192.168.60.88:5672 check inter 2000 rise 2 fall 3
+ p3 t. H7 l! y6 Bserver rabbitmq-3 192.168.60.89:5672 check inter 2000 rise 2 fall 37 U- n1 f* n5 d# x1 s. I0 {
' ^+ d. P- q& V. T& w$ b
# 6.2 启动haproxy服务/ i8 R3 V- ?2 W& m% p  _2 d: v
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D5 a( U1 z- C7 i6 K. B+ E, U- m
" o; u4 ~& Z5 p1 [4 K  j! j
至此,HAProxy设置完毕,可以通过http://192.168.60.87:8889/haproxy_stats, admin:admin
4 u" B" s6 m& R访问haproxy的web管理端。* G+ ~0 c! N/ R( x
1 V5 P' o& o3 `2 `/ f! o* m! ]
还有需要注意的是在ceilometer的配置文件/etc/ceilometer/ceilometer.conf中需要指明负载均衡服务器的地址,如果端口号不是5671请指明。& V$ ]. R/ i) b  p" r6 ^% g

" @/ {( [4 r' T* ^* T: S
' W# `, M% m, H. Y9 v! H. O7 m3 K4 Q5 s4 e0 K2 i5 R# d2 l

0 t. Y  X- w! ^6 \+ A
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-8 21:12 , Processed in 0.049119 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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