|
|
OpenStack有非常良好的结构设计,各模块之间相互独立,通过API和消息队列来传递信息,这种结构能够很方便的实现规模和功能的扩展,这是云计算平台功能设计的基本出发点。
4 L5 R! I: ]- a' F3 O
! m# ?6 m o1 o消息队列是OpenStack体系结构重要的组成部分,承载了各模块之间通信的重要功能,OpenStack默认选用的消息队列是基于erlang的RabbitMQ,RabbitMQ实现了AMQP协议,提供消息的持久化存储,支持镜像队列(Mirrored Queue)等特性。本文介绍如何利用RabbitMQ镜像队列模式以及HAProxy搭建高可用消息队列集群。& S W+ `- O+ n5 d1 _( p- B
- F' ^; c g5 c0 y为什么需要RabbitMQ集群?
8 u6 P- H% S' P2 L, _2 y: b- X对于典型的私有云部署规模:50台物理服务器,500台虚机。消息队列的主要负载来自于OpenStack各模块之间传递的信息,负载不算很大,因此单节点的RabbitMQ即可以搞定。而G版本发布之后,OpenStack引入了Ceilometer模块来负责提供云平台的监控功能,此模块使用消息队列进行监控数据的传递,下图展示了消息队列Ceilometer中的位置。
Q% O8 j [0 f* q* w6 Q# E
/ o0 K) f0 _: m; r1 Y. s! xCeilometer架构图( Q. f+ _+ s, h/ b( R
% A' M' e7 m- S( X在Ceilometer模块中,Compute Agent负责采集虚拟机实例的监控信息(Sample),经过转换(Transform)之后发布(Publish)到消息队列,Central Agent负责将服务相关的信息包装、转换并发布到消息队列,扮演了生产者的角色。而在消息队列的另一侧,作为消费者的Collector负责将相关监控信息以及各服务的通知信息(Notification)收集起来并持久化存储在数据库中。/ r7 h. Q% g8 R
1 t5 n: F7 a- ~/ e
由于业务需要,我们对Ceilometer模块做了功能扩展,将物理服务器运行的监控信息以及底层共享存储(GlusterFS)产生的监控信息也一并通过Compute Agent发布到消息总线上。为了达到细粒度的监控效果,我们将ceilometer监控的轮询间隔时间设置为10秒。假设在刚刚列举的典型私有云部署环境中,约有10台左右的物理服务器,日常活跃虚拟机约为50台。
# b- v/ g- z1 M/ o1 Q0 Y3 g$ K6 a3 h0 Z* V; V# p! j
每次监控任务轮询,总共大约会产生10000条左右的监控数据,这些监控数据形式各不相同,但基本都封装了监控项名称、监控值、时间等要素以及实例id、ip地址等元信息,如果一个集群每10秒都有这么多的数据产生并发布到消息队列,可想而知会对消息队列产生巨大的压力。同时,由于前端horizon等模块接收的用户操作也需要在消息队列上流转,这样的话一旦监控系统产生的数据阻塞了消息队列,则会对整个云平台造成毁灭性的打击。
( i6 f5 U* @( C
+ b* W. F8 ~/ z6 {搭建过程
) _' { r+ u7 W X由于云平台处在运行阶段,直接调整RabbitMQ的配置并不是一个很好的选择。于是我们折衷了一下,原有的RabbitMQ依旧运行,转而为Ceilometer另外搭建一套高可用的RabbitMQ集群,使用HAProxy做负载均衡。
9 h' u$ Z+ C. _9 P p$ N% {( {4 J+ w$ N7 j3 M
1. 安装准备+ e6 N9 |1 H5 s+ Z
RabbitMQ节点 IP地址 工作模式 操作系统
* _4 i% J( P( t8 a: \& \& L+ u4 Grabbitmq1 192.168.60.87 RAM openEluer-25.03
+ M: n, ^ P# B) U. @1 w4 `6 `rabbitmq2 192.168.60.88 RAM openEluer-25.03
# G G/ N: q& ~rabbitmq3 192.168.60.89 DISK openEluer-25.03( U! C I/ |% X
集群共三台机器,其中两台为RAM模式运行,最后一台为DISK模式。
p% M- A5 g+ c h9 @3 f) N( f0 P+ ?6 v x4 r8 R* {, Q
2. 安装RabbitMQ
& s% T7 W; S: I# R. z ~+ n为了简化安装过程,我们并没有采取编译安装的方式,而是直接使用dnf进行安装,为了安装最新的RabbitMQ-3.12.0版本,需要修改dnf的源。首先在每一台机器都执行以下步骤:
) N) Y( Q, m, \6 ^
4 n1 N/ G6 U. O7 Q( u1 Z: G# W, ^4 \7 u
# 2.2 添加RabbitMQ public key
9 X0 ^$ }% \: f6 H u" w) t
/ q7 C/ B; M3 e8 T# 2.3 更新并安装RabbitMQ! ]' N3 y# L9 G5 v! s/ V3 ?* t
dnf install -y rabbitmq-server+ L) h0 l0 S, M/ m
经过这个过程,就会将erlang以及RabbitMQ完整安装到所有机器中了。1 R9 c" d: g* S5 `( f
P$ o' y* R2 N- `) x# E0 L% b
3. 配置RabbitMQ集群; y3 h3 v/ g1 W4 f S
安装完毕之后, 需要在每台执行 :* _/ u+ m; b9 J# `! b: t) ?! ?# l
% Y6 V7 d, D6 `$ Q7 `( V! F8 x0 s( g4 e
# 3.1 停止服务
4 Q: d0 l0 F6 z o9 ~: Zsystemctl stop rabbitmq-server.service
3 ?- l/ Y: Y, _, B8 B3 I# 3.2 设置erlang cookie在这里我们是自己生成的cookie文件,只要保证是二十位的大写字符,可以自己指定内容,保证所有机器上的cookie内容一致即可。
7 {8 ~3 Y t! y7 W* R9 _echo 'MYRABBITMQCLMNHYVBGJK' > /var/lib/rabbitmq/.erlang.cookie
& j0 F1 \0 l$ N/ Q3 ?' w
7 a5 [$ R) T2 x#修改文件的用户和用户组% J! o$ B3 \" b2 e: S: m! }. X" {
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie) L1 A; t) I" n$ i* E& K
# l8 U) |4 V2 g. g/ n+ ]#设置文件访问权限
# j0 {/ [1 ?5 k+ f" b
- t& z2 d; _/ Z& tchmod 400 /var/lib/rabbitmq/.erlang.cookie5 k) j2 ~) R7 o
/ b: w* |$ b: ?
# 3.3 启动服务
4 O5 I3 V8 G! W' l {systemctl start rabbitmq-server.service * i% C$ y$ T1 _6 _
) V% B2 q- r* K0 h# 3.4 设置RabbitMQ管理插件2 X- }) L: Q' Q! e0 V4 L8 I
rabbitmq-plugins enable rabbitmq_management
9 I- ?- A! s- b. B7 b6 o l+ `, E- s% R2 k
1 A/ y% k5 a( T
6 M7 h6 [: j& X
rabbitmqctl add_user openstack 111111) I. [) G P1 x/ ^
#opnetack用户,111111 是密码7 R9 G5 p: G3 \
1 _5 K! S. M6 M$ _6 b- l: j
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
4 c6 i1 k; A9 E |: K#设置权限为读写& d: T" ~9 |* B8 X4 E( [0 v
- E4 v; D4 u# Z, P" b6 Frabbitmqctl set_user_tags openstack administrator
$ R0 q& Y" [0 h5 ` i. q' @+ h#设置管理员权限
8 ^* v; `2 ]2 O8 L" l- W. o# k. f( m) l/ V/ `/ B. J4 }
# 3.5 关闭app, a6 ]8 R' S9 A% U4 f) P% y" u+ b/ E
rabbitmqctl stop_app
- Y* S, ~, E9 U/ S1 J% A) b& a4 S, |2 r" u* c
# 3.6 重设0 Z# s. I; G9 D9 I) X0 V% E
rabbitmqctl reset
9 W# L9 w, r) |" b" W, P+ B
, b4 I! F( r- h2 W- T# 3.7 根据需要设置当前节点的工作模式(ram/disk),HOSTNAME_ROOT为集群根节点的主机名,注意在此必须使用主机名而不是IP地址,在此,我们选择的是rabbitmq-1。在此join_cluster命令为3.0以上版本RabbitMQ使用,常用的2.7版本添加节点的方法与此不同,请查阅相关文档。4 F2 y! }6 r7 _1 O0 s. g- r, a# d: s
# RAM0 `0 e" T3 Q7 C5 R
rabbitmqctl join_cluster --ram rabbit@${HOSTNAME_ROOT}% i2 d( ~' B' U; t9 E a
! K6 j; Q, J/ [
# DISK/usr/sbin/: p w. d2 F; g* k" c* ^ H
3 ^# }6 F6 i/ E4 ] F
rabbitmqctl join_cluster rabbit@${HOSTNAME_ROOT}% G9 {' Q3 a( M5 {
" s' |9 l/ e: p* }. ]5 z( ~# 3.8 开启app6 e' l$ t! c' M
8 m X. V( _& M/ h. }5 ^( m( ~$ A/usr/sbin/
& ^* T% Q0 Z' l8 b Srabbitmqctl start_app: n9 {, o, f; Z; [
7 M- N! ^. T0 J Y" f8 G0 b# 3.9 重启服务
$ e. [7 K" m& _& _; y$ X* [systemctl restart rabbitmq-server.service
& C% Q8 R, W/ Q# ^% p+ [ a' W& g1 _/ b& Q" ]& N$ Y
4. 添加用户
8 B$ m+ i" E" ]) t执行完以上的步骤集群中各个节点基本配置完毕了,现在要做的是添加用户和设置权限, 请在主节点上执行 :
) F4 ^7 l/ C' @4 ` L3 v1 p+ |, F5 s' y2 C0 q& G+ E
# 4.1 添加用户,设置密码。在这里需要提醒一下,新版本(3.3.0)的RabbitMQ为了安全性考虑仅允许localhost使用#
0 b, g4 Z0 R0 i5 a$ b guest账户,所以最好根据应用需要建立自己的账户。9 g' t9 \. t0 @% h8 G! @
因为要使用web页面管理,所以我建立了两个账户['web_admin','mgmt_admin']
5 _. o' e5 o/ b B' i# O: E$ m
0 [1 ^% Y# K1 t; H! @rabbitmqctl add_user username userpwd1 R" L5 M9 k; c/ q9 ~0 Q
3 @6 m! Q9 d+ H# h0 ?+ T$ I4 \
# 4.2 设置用户tags#
' |6 F( |$ M5 _% H4 S O6 W前一步创建的两个用户tag分别设为['monitoring','administrator'],设置完之后可以使用
7 x( A- c# U! O- C6 p& P4 l& Arabbitmqctl list_users
" G1 c$ `: Y: }1 p4 t- f; B6 c查看/usr/sbin/rabbitmqctl set_user_tags username usertag
. F% |& \% @2 [4 w
( |: @+ i/ V0 D2 q8 j1 E, s# 4.3 设置用户权限# 下面命令的意义是对username 用户赋予所有虚拟主机vhost(/),配置、写、读的权限(.*,正则表达式)$ c1 y1 R2 `& j: j
' N- O- a4 [+ F. x, {
/usr/sbin/: I2 Z" Y8 z# `+ E% R3 T
rabbitmqctl set_permissions -p / username ".*" ".*" ".*"' z9 \! N. y9 P+ F3 f. m4 H
% S. U/ `7 `; `4 D* j, h
5. 设置高可用策略
9 q) b2 F3 |( I; s3 u为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。5 o. C' r1 t( N( J
$ w2 ^5 d* f- t7 |# 5.1 设置高可用策略' }: W' d6 \/ J, F; f
4 ~' C: T! I5 T T) V/usr/sbin/) X! }& U1 v! f; H( c
2 I% a- V7 Z0 i) s8 irabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
/ Q1 o% G7 W' X9 E( W
6 T+ @1 a+ g4 q0 [/ K- N/ c7 |8 E C9 O, ~
至此,RabbitMQ的安装配置部分结束,可以访问http://192.168.60.87:15672,用户名刚刚的用户名,密码xxxx进行访问。) m2 f! v6 E7 A' L) c
5 i ?2 ?5 U. Z* A1 H
5 j F. }2 Y5 H- H2 i接下来是设置HAProxy。
+ W/ ?8 M- _ ` v* B, D4 ]8 g$ V2 m2 U: ]1 \
6. HAProxy安装配置) _( n- A5 i; h8 B' c
将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。本例中我们使用rabbitmq-1运行负载均衡服务。
~0 Q+ B+ C6 W2 F
* i, }6 `" a! [, |# 6.1 在rabbitmq-1安装HAProxyapt-get install haproxy
* m: B7 ?8 L6 k) g8 [设置/etc/haproxy/haproxy.cfg,下面我给出一个设置模板:
J, R# u6 d m- C0 ?) x3 I
6 a1 u3 B/ c( f4 @6 A' zglobal log ; Q& K, {& Q6 {; o3 e* k- d |
127.0.0.1 local0log $ H/ [/ K( C$ f
127.0.0.1 local1 notice2 F0 J8 t7 T3 ?0 C, p' x7 k7 [# F6 b
maxconn 4096/ l9 f' v- _0 q( O
user haproxy/ x# C3 X) H6 ]8 A, m2 j, f" R
group haproxy
! Z0 N: O2 Q+ v4 ^" Adaemon: M" h' i0 J( M: Z/ l i& x
& b! y1 X: k5 }- M: j
defaultslog global #使用tcp监听模式mode tcp3 F& U6 \8 R& c7 i, q$ o
option tcplog$ w+ ?% d8 N, Z7 h& J, j
option dontlognull
5 w- l4 U1 V. [( i8 v% I; iretries 3option redispatch
6 F; h: W# g0 s- Q1 Kmaxconn 2000contimeout 5000clitimeout 50000srvtimeout 50000listen admin_stat
& V0 ]4 ^2 A1 Q/ A' S4 e. ?#haproxy的web管理端口 8889,自行设置
. t; q) F* J- {; ybind 0.0.0.0:8889! A# N+ m7 p* }
mode http
$ f* b, i- {4 l3 J6 P6 Y M0 lstats refresh 30s #haproxy web管理url,自行设置stats uri /haproxy_stats
5 a# b+ _( d8 O; l7 b4 I F7 t) vstats realm Haproxy\ Statistics #haproxy web管理用户名密码,自行设置stats auth admin:admin
7 r0 i" W6 h" `' t$ t! ystats hide-versionlisten rabbitmq 0.0.0.0:5671 #监听5671端口,并转发给三个节点的5672端口,采用轮询策略mode tcp" G0 k e. y5 M: \) p
balance roundrobin
% S* i. _( T) _: a; A M& Userver rabbitmq-1 192.168.60.87:5672 check inter 2000 rise 2 fall 38 i0 n; e0 V/ }+ \# D5 b
server rabbitmq-2 192.168.60.88:5672 check inter 2000 rise 2 fall 3
9 z" `% ]% b! D- Z4 S- g3 R: {' b, o7 Mserver rabbitmq-3 192.168.60.89:5672 check inter 2000 rise 2 fall 32 r2 M: f! t- F& l
* A- K9 ?+ \/ W1 k# 6.2 启动haproxy服务
4 n" i( E3 a- r2 d! e7 D/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D
* r4 p- S) ?9 [9 z' \* {6 k1 F: b7 w8 t
至此,HAProxy设置完毕,可以通过http://192.168.60.87:8889/haproxy_stats, admin:admin* f+ w& p3 o, Z4 y, R9 q; E
访问haproxy的web管理端。# W$ q9 n+ i, ^! k8 U
3 p; C9 u4 T; m/ g4 f还有需要注意的是在ceilometer的配置文件/etc/ceilometer/ceilometer.conf中需要指明负载均衡服务器的地址,如果端口号不是5671请指明。
1 p6 p9 T& W6 Q* ^; } C; |7 o# d) {$ ^9 k
7 R% B6 S Z" p9 I, y5 r& y; `% u* X6 [3 t
9 h/ s5 a7 E! Z; W3 \% t
|
|