|
|
OpenStack有非常良好的结构设计,各模块之间相互独立,通过API和消息队列来传递信息,这种结构能够很方便的实现规模和功能的扩展,这是云计算平台功能设计的基本出发点。
# }3 ^8 S7 ?3 b& n& H% d8 V
6 B ~/ P/ v# Q消息队列是OpenStack体系结构重要的组成部分,承载了各模块之间通信的重要功能,OpenStack默认选用的消息队列是基于erlang的RabbitMQ,RabbitMQ实现了AMQP协议,提供消息的持久化存储,支持镜像队列(Mirrored Queue)等特性。本文介绍如何利用RabbitMQ镜像队列模式以及HAProxy搭建高可用消息队列集群。) S: t F; V5 `4 a8 G, N/ T
& g7 v7 d& {6 e
为什么需要RabbitMQ集群?$ X8 n2 f- _0 S2 P5 u
对于典型的私有云部署规模:50台物理服务器,500台虚机。消息队列的主要负载来自于OpenStack各模块之间传递的信息,负载不算很大,因此单节点的RabbitMQ即可以搞定。而G版本发布之后,OpenStack引入了Ceilometer模块来负责提供云平台的监控功能,此模块使用消息队列进行监控数据的传递,下图展示了消息队列Ceilometer中的位置。
' j7 {4 |, G# L6 O' l/ N
4 u1 V+ W7 X" pCeilometer架构图0 g& H+ `, v0 Y/ S8 q
! k6 [3 T, e+ L* R' z在Ceilometer模块中,Compute Agent负责采集虚拟机实例的监控信息(Sample),经过转换(Transform)之后发布(Publish)到消息队列,Central Agent负责将服务相关的信息包装、转换并发布到消息队列,扮演了生产者的角色。而在消息队列的另一侧,作为消费者的Collector负责将相关监控信息以及各服务的通知信息(Notification)收集起来并持久化存储在数据库中。+ P! \: J6 F2 H) @' t" J1 H2 o$ ]
8 K) L( ~2 y0 a9 b
由于业务需要,我们对Ceilometer模块做了功能扩展,将物理服务器运行的监控信息以及底层共享存储(GlusterFS)产生的监控信息也一并通过Compute Agent发布到消息总线上。为了达到细粒度的监控效果,我们将ceilometer监控的轮询间隔时间设置为10秒。假设在刚刚列举的典型私有云部署环境中,约有10台左右的物理服务器,日常活跃虚拟机约为50台。6 p& }% ~. u" O4 p- V% l" ^, ?
3 e0 E9 [" f0 E: Q r
每次监控任务轮询,总共大约会产生10000条左右的监控数据,这些监控数据形式各不相同,但基本都封装了监控项名称、监控值、时间等要素以及实例id、ip地址等元信息,如果一个集群每10秒都有这么多的数据产生并发布到消息队列,可想而知会对消息队列产生巨大的压力。同时,由于前端horizon等模块接收的用户操作也需要在消息队列上流转,这样的话一旦监控系统产生的数据阻塞了消息队列,则会对整个云平台造成毁灭性的打击。
! b: P9 W+ o4 h2 }7 M
0 n2 X/ [0 b) P# q p: s0 Q, E) U搭建过程) A+ {$ i0 M: N- s( o# Z9 M
由于云平台处在运行阶段,直接调整RabbitMQ的配置并不是一个很好的选择。于是我们折衷了一下,原有的RabbitMQ依旧运行,转而为Ceilometer另外搭建一套高可用的RabbitMQ集群,使用HAProxy做负载均衡。4 A/ o7 I& s2 q1 A+ ~
9 X$ s" m9 v4 u+ m& I, `
1. 安装准备
/ x5 h- l9 e0 Q7 F$ }. \RabbitMQ节点 IP地址 工作模式 操作系统1 ?. Y) y' Z+ ~
rabbitmq1 192.168.60.87 RAM openEluer-25.03
% w& C( L: F& r9 m7 D4 e, C; lrabbitmq2 192.168.60.88 RAM openEluer-25.03
& n0 h2 |8 k1 n/ c3 _rabbitmq3 192.168.60.89 DISK openEluer-25.03
6 d4 l/ M3 L' ?" ?' \集群共三台机器,其中两台为RAM模式运行,最后一台为DISK模式。( x$ A2 ?$ F. q" Y4 ], P0 L
* v! o; q8 L# F7 R1 R
2. 安装RabbitMQ' V' ?& m7 d9 V3 D% y" b
为了简化安装过程,我们并没有采取编译安装的方式,而是直接使用dnf进行安装,为了安装最新的RabbitMQ-3.12.0版本,需要修改dnf的源。首先在每一台机器都执行以下步骤:# m* A9 T0 {- {4 z0 N
, B( d0 O2 o" s/ S) ?4 b
7 z: E% D2 M: j! u+ ?# m# 2.2 添加RabbitMQ public key: e+ b7 C/ m# c2 v
7 G% J) b* g' x8 a0 O% i. X- C# 2.3 更新并安装RabbitMQ
) u; b! d! Y7 z5 d$ i* wdnf install -y rabbitmq-server0 g9 `: W; n. [8 p/ ~5 j6 B
经过这个过程,就会将erlang以及RabbitMQ完整安装到所有机器中了。% }' r# \+ G, q9 K# i6 [
; b" G' d0 N& g# k! e3 Q% i$ u3. 配置RabbitMQ集群
/ V# Y8 h' Z. N1 ]2 ^安装完毕之后, 需要在每台执行 :0 K$ E, e) s: w8 p
" i" e3 V3 B0 q# 3.1 停止服务+ Y) \9 ?3 ~. ^: p& x3 X
systemctl stop rabbitmq-server.service / u6 _" z) W2 a. e: w( G
# 3.2 设置erlang cookie在这里我们是自己生成的cookie文件,只要保证是二十位的大写字符,可以自己指定内容,保证所有机器上的cookie内容一致即可。
) M% p3 O) F( d1 @echo 'MYRABBITMQCLMNHYVBGJK' > /var/lib/rabbitmq/.erlang.cookie! K i. X& x& Q2 N
9 t) S8 E- ~0 r" @
#修改文件的用户和用户组
. R. ~/ X6 u# v1 Gchown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie2 Z( g( T5 b: K: |
- Q x$ ?" o& _ }4 K3 |" [#设置文件访问权限
1 ]: B& l( O# ?% P2 ~& z
9 g$ c; H& O( E9 @0 J" Bchmod 400 /var/lib/rabbitmq/.erlang.cookie
) A" s6 g& q( ?; ]3 T( D @. j' U+ a2 H9 b% `; C
# 3.3 启动服务3 X5 G1 ~# g, f9 d
systemctl start rabbitmq-server.service $ J: N$ v& {0 ^7 F3 x/ P
, ]. e m$ y- {# 3.4 设置RabbitMQ管理插件
6 b# B# j; D( O9 Frabbitmq-plugins enable rabbitmq_management! B/ G: j) ~ ?% k+ R& m
& ^! G0 |+ q' a8 H/ l
* F2 n: O6 |+ o* f3 B
7 S+ r* `& m" K9 E5 r3 D, trabbitmqctl add_user openstack 111111
' m( X# R1 C. Z5 y6 r#opnetack用户,111111 是密码# p( b9 b5 c# E$ X
, u7 }7 b* v& m" T
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
8 L7 o" E0 D) B0 b#设置权限为读写
5 V: z9 {9 z% ~ 4 x3 a+ R$ M5 g- ]0 ]. M: i
rabbitmqctl set_user_tags openstack administrator
4 f/ |2 u' _6 a#设置管理员权限
2 V7 | @7 s1 f' ]4 h9 j
% m* A2 ~" }; J/ a# 3.5 关闭app
. v8 {7 m3 G' F+ U8 wrabbitmqctl stop_app
4 }' |2 B( k. |' Z* c$ K; D
" i; Q0 E8 w0 h. X9 T% w) }' R# 3.6 重设
$ n' ^5 s# Z2 ]! G* s% m+ S+ y+ R9 Qrabbitmqctl reset2 P* r' D+ K+ w% v! S7 L9 M
* I! g) L; a/ c- Q" Y# {/ `) Z# 3.7 根据需要设置当前节点的工作模式(ram/disk),HOSTNAME_ROOT为集群根节点的主机名,注意在此必须使用主机名而不是IP地址,在此,我们选择的是rabbitmq-1。在此join_cluster命令为3.0以上版本RabbitMQ使用,常用的2.7版本添加节点的方法与此不同,请查阅相关文档。
; t% x8 j) c u. ^+ n# RAM
0 a* @4 o' V8 jrabbitmqctl join_cluster --ram rabbit@${HOSTNAME_ROOT}5 t( {2 o6 B% p$ N' }
! P: v0 ?4 T( q! n# }, J4 v# DISK/usr/sbin/0 G h) {0 t! D- A
" C% S1 W' J9 c' Z" @. ?rabbitmqctl join_cluster rabbit@${HOSTNAME_ROOT}
, Z N& t; @! O: j+ o5 x- ~: ?8 P" n" H+ V& n8 i
# 3.8 开启app
0 M% X6 a* U2 g7 p+ a3 O2 ]& m; s7 p
: @& f# ~7 o5 c n) V/usr/sbin/
# \; T. ]' O5 J; R: s* Trabbitmqctl start_app7 R+ }4 m6 T, y2 `# C3 M
$ q+ N7 S6 Y1 ]( G! Y
# 3.9 重启服务
1 v3 C9 F+ N B0 l% v4 Asystemctl restart rabbitmq-server.service
6 S. S! E( k2 s! ?$ G2 ^8 [- h) ?& E- D _9 a
4. 添加用户. `/ t( P9 M) d) x8 e
执行完以上的步骤集群中各个节点基本配置完毕了,现在要做的是添加用户和设置权限, 请在主节点上执行 :
3 ^( n& c4 g( w( F1 ?' h$ h s2 L1 O6 e
# 4.1 添加用户,设置密码。在这里需要提醒一下,新版本(3.3.0)的RabbitMQ为了安全性考虑仅允许localhost使用#$ l/ S. I. D$ Y/ f2 Z* N+ @* E
guest账户,所以最好根据应用需要建立自己的账户。3 b9 [; M4 F- ^
因为要使用web页面管理,所以我建立了两个账户['web_admin','mgmt_admin'], H" G8 g& F2 F/ V, s/ T# K
& h( l1 _# \0 I0 G
rabbitmqctl add_user username userpwd4 w, k/ m7 b/ q9 b# D, u
' o# o8 G3 X6 A8 O# 4.2 设置用户tags#
6 K+ L' {* o7 ^6 g3 U前一步创建的两个用户tag分别设为['monitoring','administrator'],设置完之后可以使用5 Z! E: o, Q9 W
rabbitmqctl list_users
* ~( f( j/ @1 |) ]) x- q; z4 M查看/usr/sbin/rabbitmqctl set_user_tags username usertag% ~) E; y6 e8 }8 I( q3 g2 s3 g% u/ O
% r& j7 R7 Z- Z. k- @* w: s0 F; ]" z
# 4.3 设置用户权限# 下面命令的意义是对username 用户赋予所有虚拟主机vhost(/),配置、写、读的权限(.*,正则表达式)
0 F1 M6 {4 G- e1 C/ I2 v9 V5 Q* ~+ t- R3 M" G; O2 E+ z6 d
/usr/sbin/
( C5 T$ l5 q: H2 A, ?# a9 Drabbitmqctl set_permissions -p / username ".*" ".*" ".*"
+ I( P' Y' e* b9 [! Z$ p4 ^$ t
/ H4 a# j: Y% E' n( d" }/ s/ c5. 设置高可用策略
) t2 s! Z% w/ k: q& N为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。
+ \- Q( q; h; _
/ g- j1 ?. m" |6 d. H4 d0 C# 5.1 设置高可用策略
. U: L, s! G2 @
# a1 u q% u6 s9 s% z9 Q9 d/usr/sbin/
# @* T! ]* D7 [7 v
% }& Y* X7 i. P. [rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
# k; \$ q8 Y6 j- }' D* i& Q
2 F$ k x7 n, ~4 r0 U3 ]6 G7 i2 @% }( L, |3 K. d# V
至此,RabbitMQ的安装配置部分结束,可以访问http://192.168.60.87:15672,用户名刚刚的用户名,密码xxxx进行访问。
: o* Z( r. v* G; Q; W
2 B$ T! v% ~, L1 d5 i
; p/ ]$ [" R7 {# `3 `接下来是设置HAProxy。. B: E# P/ _9 n: G. u
) m8 M1 j! Z3 b! U
6. HAProxy安装配置# z- n8 N" T3 w0 d& }8 a& K, c# N
将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。本例中我们使用rabbitmq-1运行负载均衡服务。
; x* \& q& K; q* q8 b
& [4 M' u) u- y& `2 ]/ M. r4 W# 6.1 在rabbitmq-1安装HAProxyapt-get install haproxy
5 i, h1 f$ d; i4 X& M: K设置/etc/haproxy/haproxy.cfg,下面我给出一个设置模板:) _/ A0 B- y1 N3 b9 }$ G) }& F
! `2 @; O+ L4 U8 q9 u. V3 tglobal log
2 v/ r; i# e z5 X) m127.0.0.1 local0log
c# d5 D% t8 C$ ]& i127.0.0.1 local1 notice
5 i' D! T$ L3 e* S( Tmaxconn 4096
9 ~# X/ g" e, ]; k- g6 ]7 wuser haproxy
+ T* Y6 M4 f$ N/ e, {group haproxy2 {5 o' J# e; x* ], c t7 u/ w' y* I
daemon
' R0 B. k3 R l9 g/ L( a# z e( m* k' L& k: Q, B5 }
defaultslog global #使用tcp监听模式mode tcp7 i: _' r2 ^: E" T
option tcplog/ I; o( ^' z3 c
option dontlognull+ T$ A9 G8 Q4 F9 U
retries 3option redispatch& K. W- k' ?5 g( {) i1 ^" g5 Z
maxconn 2000contimeout 5000clitimeout 50000srvtimeout 50000listen admin_stat & G+ N; M- B& k+ k
#haproxy的web管理端口 8889,自行设置
) y; d% s* c Q2 r, t1 S8 wbind 0.0.0.0:8889
" G' H X$ x& K( L/ G5 @) fmode http, V3 W) T5 w% w& |
stats refresh 30s #haproxy web管理url,自行设置stats uri /haproxy_stats" @6 \* `" w/ P9 M8 }' K0 f
stats realm Haproxy\ Statistics #haproxy web管理用户名密码,自行设置stats auth admin:admin7 p+ e" ^6 s' m; u
stats hide-versionlisten rabbitmq 0.0.0.0:5671 #监听5671端口,并转发给三个节点的5672端口,采用轮询策略mode tcp
3 R& u7 y- l' K. Z& tbalance roundrobin& Z/ ]6 v- x: f/ t2 K
server rabbitmq-1 192.168.60.87:5672 check inter 2000 rise 2 fall 3
' p N5 g% f1 A5 |: Mserver rabbitmq-2 192.168.60.88:5672 check inter 2000 rise 2 fall 3
4 O6 z/ H: [. `+ u, Z( ~1 \server rabbitmq-3 192.168.60.89:5672 check inter 2000 rise 2 fall 33 r9 ?! u# O8 q( E. F
) ~4 V! X) _% ?0 ^# 6.2 启动haproxy服务
: r& P2 k: w, q! [, E [/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D7 A) Q) ^3 N5 C7 W- N
4 Y, C k: _8 L+ b( z3 ^4 N3 \至此,HAProxy设置完毕,可以通过http://192.168.60.87:8889/haproxy_stats, admin:admin! }1 N1 o* v; {/ b; k0 y# n
访问haproxy的web管理端。1 K8 D. n' \: Y
& Z Q6 m9 V$ a+ Y7 h还有需要注意的是在ceilometer的配置文件/etc/ceilometer/ceilometer.conf中需要指明负载均衡服务器的地址,如果端口号不是5671请指明。
! L5 a+ h) B: b
d5 T7 ]) ~% m+ T5 f- B- C$ D. g9 Z2 ~( z! o/ H
* Y+ ]! j7 e1 [3 B; Q, C
2 {( g8 a; X# N( ^/ a8 f( f
|
|