|
|
OpenStack有非常良好的结构设计,各模块之间相互独立,通过API和消息队列来传递信息,这种结构能够很方便的实现规模和功能的扩展,这是云计算平台功能设计的基本出发点。, ^- @& { S7 j, J, F
1 G! U1 k3 O0 P+ ^, w
消息队列是OpenStack体系结构重要的组成部分,承载了各模块之间通信的重要功能,OpenStack默认选用的消息队列是基于erlang的RabbitMQ,RabbitMQ实现了AMQP协议,提供消息的持久化存储,支持镜像队列(Mirrored Queue)等特性。本文介绍如何利用RabbitMQ镜像队列模式以及HAProxy搭建高可用消息队列集群。
7 @+ q) ^# i H3 ^& n: ~& z; o o9 P: a8 u# m7 `: w
为什么需要RabbitMQ集群?8 o2 c6 p$ D1 d1 T9 `* E' H# c
对于典型的私有云部署规模:50台物理服务器,500台虚机。消息队列的主要负载来自于OpenStack各模块之间传递的信息,负载不算很大,因此单节点的RabbitMQ即可以搞定。而G版本发布之后,OpenStack引入了Ceilometer模块来负责提供云平台的监控功能,此模块使用消息队列进行监控数据的传递,下图展示了消息队列Ceilometer中的位置。& f+ ]$ a Y8 I, b# B$ d
* Y. K" U, |4 L4 x; wCeilometer架构图4 a, s7 F# ?* Z9 Y5 c0 C
4 ^. v- b, @/ g# f" Q在Ceilometer模块中,Compute Agent负责采集虚拟机实例的监控信息(Sample),经过转换(Transform)之后发布(Publish)到消息队列,Central Agent负责将服务相关的信息包装、转换并发布到消息队列,扮演了生产者的角色。而在消息队列的另一侧,作为消费者的Collector负责将相关监控信息以及各服务的通知信息(Notification)收集起来并持久化存储在数据库中。# ^+ p! w c$ Z+ h. N: m! l
& e% d% |; r2 }4 A. Q6 w
由于业务需要,我们对Ceilometer模块做了功能扩展,将物理服务器运行的监控信息以及底层共享存储(GlusterFS)产生的监控信息也一并通过Compute Agent发布到消息总线上。为了达到细粒度的监控效果,我们将ceilometer监控的轮询间隔时间设置为10秒。假设在刚刚列举的典型私有云部署环境中,约有10台左右的物理服务器,日常活跃虚拟机约为50台。
2 r) G: D- x1 {# o& i
5 ?5 F/ ~& x* b+ `% F每次监控任务轮询,总共大约会产生10000条左右的监控数据,这些监控数据形式各不相同,但基本都封装了监控项名称、监控值、时间等要素以及实例id、ip地址等元信息,如果一个集群每10秒都有这么多的数据产生并发布到消息队列,可想而知会对消息队列产生巨大的压力。同时,由于前端horizon等模块接收的用户操作也需要在消息队列上流转,这样的话一旦监控系统产生的数据阻塞了消息队列,则会对整个云平台造成毁灭性的打击。( K6 p0 i+ z' V5 H N/ T7 X
5 ?# b3 M' q2 a' u/ L搭建过程
- Y" J. J! j* P& X5 N; X- u: ]: z由于云平台处在运行阶段,直接调整RabbitMQ的配置并不是一个很好的选择。于是我们折衷了一下,原有的RabbitMQ依旧运行,转而为Ceilometer另外搭建一套高可用的RabbitMQ集群,使用HAProxy做负载均衡。- R! n5 [$ T, r! r5 o
( X& R( P% r) d4 f0 z8 a
1. 安装准备" c+ R( l- b9 S. U8 q# g
RabbitMQ节点 IP地址 工作模式 操作系统 a% V& E6 a& o
rabbitmq1 192.168.60.87 RAM openEluer-25.03% m/ K# ~' @2 v5 o6 v0 X: ?/ U4 }
rabbitmq2 192.168.60.88 RAM openEluer-25.03& B2 F, {9 d( {' E! p. W
rabbitmq3 192.168.60.89 DISK openEluer-25.03
( y6 f& v8 J$ u- @* {集群共三台机器,其中两台为RAM模式运行,最后一台为DISK模式。
& }" H1 K) M, @: K1 D2 R4 W$ h% M6 X' o6 m
2. 安装RabbitMQ
& J. u) \1 Q$ k/ w为了简化安装过程,我们并没有采取编译安装的方式,而是直接使用dnf进行安装,为了安装最新的RabbitMQ-3.12.0版本,需要修改dnf的源。首先在每一台机器都执行以下步骤:
% o$ o( T! j6 W2 s- {+ Q8 m! ~% E& p+ J! n4 L
, r, ]6 E! I% W' f# 2.2 添加RabbitMQ public key$ c) _( V8 h! w1 i
2 @/ I6 O8 g7 w q8 _) t$ D# 2.3 更新并安装RabbitMQ- I( H1 {; F7 d3 ~( r
dnf install -y rabbitmq-server
# a7 P8 |% |$ M经过这个过程,就会将erlang以及RabbitMQ完整安装到所有机器中了。
" L5 [- o7 v2 N/ ?- N# t' I3 P6 K! D( O' y. d3 _. S8 N4 b9 I9 J) _
3. 配置RabbitMQ集群 Y' e* ?% D% y$ j# L0 c7 o/ r) c
安装完毕之后, 需要在每台执行 :
& X6 F- g4 B" o/ B
6 v) k3 v) _5 _6 ?# 3.1 停止服务
6 `* \3 W+ s5 E- |1 Osystemctl stop rabbitmq-server.service ; W2 z6 N/ R# O! L8 ]. \
# 3.2 设置erlang cookie在这里我们是自己生成的cookie文件,只要保证是二十位的大写字符,可以自己指定内容,保证所有机器上的cookie内容一致即可。3 n' s8 |' o, j- A. o, c
echo 'MYRABBITMQCLMNHYVBGJK' > /var/lib/rabbitmq/.erlang.cookie W& h+ q! j; U6 ~
. c# I) Q3 B; B0 ]- J8 q#修改文件的用户和用户组
6 A0 E8 e% P/ W7 \( _6 Bchown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie+ N0 e/ H, `" p3 b. N3 O3 G
3 |9 u5 p. L7 `! M1 s2 s' ^#设置文件访问权限# [# O% @% f3 t9 o' f _* O
# o* s7 Z$ n2 wchmod 400 /var/lib/rabbitmq/.erlang.cookie7 Q: W6 T S6 m
$ Z- @$ N- I8 i6 E& L1 l& g9 p
# 3.3 启动服务' ` @5 z/ t+ t4 P5 f% r
systemctl start rabbitmq-server.service - Q! w' I3 K+ }4 p
% }4 O! ?# P4 E3 z3 o
# 3.4 设置RabbitMQ管理插件8 \1 J \0 _& x; c8 _) r3 M' u
rabbitmq-plugins enable rabbitmq_management
7 U, G/ |! M! @$ b5 y4 o
2 j7 U. {9 G) B: e
; i/ j2 o. F3 d. R8 I% w+ S1 b, o/ M; O& \5 i
rabbitmqctl add_user openstack 111111
+ w4 |+ ]) f# D7 h7 y1 e#opnetack用户,111111 是密码
7 F5 x9 Z* f: D( l# J* r5 v% b
5 B7 A. _0 u# P5 Xrabbitmqctl set_permissions openstack ".*" ".*" ".*"+ a6 b3 B* [* U- [- l2 y
#设置权限为读写8 c* K/ w m2 X9 f; n8 X/ z0 z$ V" [. K
, n+ x4 }1 i. T- C; d
rabbitmqctl set_user_tags openstack administrator
& d5 ~. E2 e. b7 F }0 w* P#设置管理员权限
2 c, o' f. ~- r/ j+ G
) P, w" M$ @' ^4 h! B0 m# 3.5 关闭app* b0 o2 z! M1 z1 F' ]! V% S# k
rabbitmqctl stop_app
3 B0 F8 O* t" Q/ W& \% i A1 D# B, K) W# q8 Q8 ]( Z
# 3.6 重设
) f5 x5 W5 s3 S) s; u- x" n7 prabbitmqctl reset2 G6 M7 N& Q. m% [$ ^2 s
" ^( H/ m8 `0 o; R
# 3.7 根据需要设置当前节点的工作模式(ram/disk),HOSTNAME_ROOT为集群根节点的主机名,注意在此必须使用主机名而不是IP地址,在此,我们选择的是rabbitmq-1。在此join_cluster命令为3.0以上版本RabbitMQ使用,常用的2.7版本添加节点的方法与此不同,请查阅相关文档。
* G0 _4 Y" w% L' @# RAM
6 Z* p9 u! R! W2 x0 H% Frabbitmqctl join_cluster --ram rabbit@${HOSTNAME_ROOT}
$ g* v2 ]5 Y0 u+ M3 Y( I
z4 Q7 q+ c! l# J; \, j' [) V# U# F# DISK/usr/sbin/
1 F6 |3 j7 W# e$ F% y3 j* D( E( O: x( ]+ a
rabbitmqctl join_cluster rabbit@${HOSTNAME_ROOT}5 D2 G" }- b5 ]( K' M( {3 R: _
) |) s [3 V+ Y; b% Z' z# z# 3.8 开启app
( ]3 }7 W" |5 ~9 d; n3 j4 V2 }. J: `7 i" a- l1 N# `# J
/usr/sbin/2 \* K/ e$ S' f! }8 J0 o# a6 ^
rabbitmqctl start_app
1 O/ w% \4 S8 ?) e: q
0 B; ]+ B1 T7 O# K: z0 G0 b# 3.9 重启服务0 i5 {2 Y9 }2 m, i c y, z
systemctl restart rabbitmq-server.service
! H1 x2 a5 t# G" I/ D, x# I" L$ q
6 ^. b3 _# ]/ f; T4. 添加用户; e6 D% b; q- t
执行完以上的步骤集群中各个节点基本配置完毕了,现在要做的是添加用户和设置权限, 请在主节点上执行 :
3 i) S. z3 D; w( m6 x2 F; X# y, x) l n1 d
# 4.1 添加用户,设置密码。在这里需要提醒一下,新版本(3.3.0)的RabbitMQ为了安全性考虑仅允许localhost使用#
/ B0 g: S$ o9 g% C6 v# O) Q! y* N guest账户,所以最好根据应用需要建立自己的账户。
% L' D. @! ]7 C: |& ]0 Q. O因为要使用web页面管理,所以我建立了两个账户['web_admin','mgmt_admin']( @ J# I, C% }$ U2 [$ [
; K% t9 a7 c6 g0 z5 }! D% l0 D
rabbitmqctl add_user username userpwd: q6 y! Z4 t; G8 e
7 Z8 O' {1 t# i$ j( U6 i3 _1 M, J
# 4.2 设置用户tags#
& p8 l$ m, N: U/ r# Z; v前一步创建的两个用户tag分别设为['monitoring','administrator'],设置完之后可以使用 C, \0 I' N0 P/ b0 q+ o% Y
rabbitmqctl list_users
0 q7 v3 S# @7 h0 H' V查看/usr/sbin/rabbitmqctl set_user_tags username usertag5 Z% D, H1 S* F; a/ V, B
! I q; c9 X5 R# 4.3 设置用户权限# 下面命令的意义是对username 用户赋予所有虚拟主机vhost(/),配置、写、读的权限(.*,正则表达式)8 k, Q4 z6 U! F7 Y# R) o
' I3 a1 y' O9 G; e( Q( z- P( [" T/usr/sbin/
+ \1 p/ _# b# A8 M8 ~$ _5 t! lrabbitmqctl set_permissions -p / username ".*" ".*" ".*"
9 k0 L s/ ^3 S, D$ J5 ^. ^4 S
2 D% F5 {5 P' ]) ~. @ d# p2 I4 C5. 设置高可用策略
/ h$ M) p4 F3 R% m; ]为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。
$ [0 e& Q& I" Y3 [
0 A7 p; b7 g: e2 }) v) a- t! J# 5.1 设置高可用策略5 }0 F! T+ t8 ^1 [( o
: N# Z5 Y1 E1 o, V& n' Y
/usr/sbin/
3 J Y& e, ]9 _& ^( H* ]4 X# O: h. |: v
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'4 X/ w/ W9 k" r$ [ j0 G
0 ^5 B' u- N% h: O j5 b
3 H O4 s+ W/ |& g* V% h, c6 v/ r
至此,RabbitMQ的安装配置部分结束,可以访问http://192.168.60.87:15672,用户名刚刚的用户名,密码xxxx进行访问。" o! w5 |4 l, c% b' _+ a+ I2 d2 g
) ~9 I9 B O9 L0 R" I) a% y
Y& D% o- |; a ?7 i5 }接下来是设置HAProxy。
5 C6 ` ]. t5 e- L9 [
3 s+ T0 Q3 q# J4 v# Z! s6. HAProxy安装配置
7 ?: M7 z0 X' W* ^1 H B# M将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。本例中我们使用rabbitmq-1运行负载均衡服务。) V6 R" h7 ^8 W6 @# `6 m
) s$ T; d2 q, B# 6.1 在rabbitmq-1安装HAProxyapt-get install haproxy
6 U6 ]7 `3 n2 Q/ ?! i设置/etc/haproxy/haproxy.cfg,下面我给出一个设置模板:2 E+ l6 F8 {0 M; G" A
* @1 W! l G7 T/ _; bglobal log
4 N# }$ v& I2 B- J/ Z6 c' q127.0.0.1 local0log
* q# w" i1 \4 j% }# H0 o127.0.0.1 local1 notice4 Z* q! t" \& R3 K z
maxconn 4096
( Z0 r0 ]. K' [. guser haproxy) a p8 J6 |& G: T! C& o# M
group haproxy, F0 ]+ ?# C/ ]% E; _5 a1 _
daemon
9 Y7 w2 W/ {' e: Z: W1 \" ]3 f9 A9 b' i# E( M
defaultslog global #使用tcp监听模式mode tcp/ a: b0 a- c6 W( T: F; D& q7 U
option tcplog* I4 l0 p6 |' X. ?* Z
option dontlognull% [" N3 F4 c7 f" L* Y5 L4 e8 w
retries 3option redispatch' A8 x. o6 S2 T+ K1 J8 i
maxconn 2000contimeout 5000clitimeout 50000srvtimeout 50000listen admin_stat 8 q1 Y/ ~* U0 P7 r' ]
#haproxy的web管理端口 8889,自行设置
$ Z4 w+ r. \6 i, I; u; H7 qbind 0.0.0.0:8889
+ ?7 v& g, f- U" j2 _. _9 ?mode http9 Z3 X) |6 Q% |/ r1 l o% y
stats refresh 30s #haproxy web管理url,自行设置stats uri /haproxy_stats
" t4 E4 h! d$ ^' m3 a& `stats realm Haproxy\ Statistics #haproxy web管理用户名密码,自行设置stats auth admin:admin% P( o8 W+ z6 L2 q {" ]7 F3 @
stats hide-versionlisten rabbitmq 0.0.0.0:5671 #监听5671端口,并转发给三个节点的5672端口,采用轮询策略mode tcp
: H% g0 E! X1 t, n" mbalance roundrobin4 j, Z7 _2 S1 g$ Q
server rabbitmq-1 192.168.60.87:5672 check inter 2000 rise 2 fall 3
& F0 B+ t. S& {- g% N6 F9 T C0 _server rabbitmq-2 192.168.60.88:5672 check inter 2000 rise 2 fall 34 {1 d" C1 u1 v, D8 L* L
server rabbitmq-3 192.168.60.89:5672 check inter 2000 rise 2 fall 3
1 L- e8 }. d8 y/ S$ Q% m1 _7 t3 L
0 k! L6 B d* W# N9 T% H& g" m6 t# 6.2 启动haproxy服务9 B h4 J7 O* @2 a) L* I }
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D
v2 k5 k+ {& Z) a0 H. i5 C e. [# P. m: K. T
至此,HAProxy设置完毕,可以通过http://192.168.60.87:8889/haproxy_stats, admin:admin
. z0 U5 V: U( T2 m1 ^5 @) i( p访问haproxy的web管理端。
4 K+ K2 ]" S7 w* W, y8 C O3 v; [" W, W" y2 ^" V! B& {
还有需要注意的是在ceilometer的配置文件/etc/ceilometer/ceilometer.conf中需要指明负载均衡服务器的地址,如果端口号不是5671请指明。2 v! u2 p, ]6 g/ s) F+ I: q
8 c9 C% ]1 L E- m4 H3 ]/ \
% ^# m: D8 V6 Q5 u9 |8 f6 Y0 R
" x! N5 B: i8 |& i- M& f- p% O9 R1 C' v' E5 \( x
|
|