|
|
OpenStack有非常良好的结构设计,各模块之间相互独立,通过API和消息队列来传递信息,这种结构能够很方便的实现规模和功能的扩展,这是云计算平台功能设计的基本出发点。
7 @% M7 y- H6 y- \7 Q! B/ W4 i
# X: l) f0 g O; Y消息队列是OpenStack体系结构重要的组成部分,承载了各模块之间通信的重要功能,OpenStack默认选用的消息队列是基于erlang的RabbitMQ,RabbitMQ实现了AMQP协议,提供消息的持久化存储,支持镜像队列(Mirrored Queue)等特性。本文介绍如何利用RabbitMQ镜像队列模式以及HAProxy搭建高可用消息队列集群。0 N5 E2 r5 `& ?: r: x/ N2 ]
! K+ n, A. m5 n( S5 j
为什么需要RabbitMQ集群?
& J4 u8 a+ J. b' y) O对于典型的私有云部署规模:50台物理服务器,500台虚机。消息队列的主要负载来自于OpenStack各模块之间传递的信息,负载不算很大,因此单节点的RabbitMQ即可以搞定。而G版本发布之后,OpenStack引入了Ceilometer模块来负责提供云平台的监控功能,此模块使用消息队列进行监控数据的传递,下图展示了消息队列Ceilometer中的位置。
1 }8 L4 {8 T6 w& x, f5 F+ d
1 U9 i9 `. E5 [* ECeilometer架构图
! v2 k% Y9 F k; I! S2 M; H4 ~6 f& _; j# `3 \
在Ceilometer模块中,Compute Agent负责采集虚拟机实例的监控信息(Sample),经过转换(Transform)之后发布(Publish)到消息队列,Central Agent负责将服务相关的信息包装、转换并发布到消息队列,扮演了生产者的角色。而在消息队列的另一侧,作为消费者的Collector负责将相关监控信息以及各服务的通知信息(Notification)收集起来并持久化存储在数据库中。
5 D; t/ d: x( u( \
9 D O6 L& D( {; y# P0 l! k* j由于业务需要,我们对Ceilometer模块做了功能扩展,将物理服务器运行的监控信息以及底层共享存储(GlusterFS)产生的监控信息也一并通过Compute Agent发布到消息总线上。为了达到细粒度的监控效果,我们将ceilometer监控的轮询间隔时间设置为10秒。假设在刚刚列举的典型私有云部署环境中,约有10台左右的物理服务器,日常活跃虚拟机约为50台。
4 D2 _$ ?8 w1 }
3 X& x) n( N% h+ v7 v+ G% s4 P) k每次监控任务轮询,总共大约会产生10000条左右的监控数据,这些监控数据形式各不相同,但基本都封装了监控项名称、监控值、时间等要素以及实例id、ip地址等元信息,如果一个集群每10秒都有这么多的数据产生并发布到消息队列,可想而知会对消息队列产生巨大的压力。同时,由于前端horizon等模块接收的用户操作也需要在消息队列上流转,这样的话一旦监控系统产生的数据阻塞了消息队列,则会对整个云平台造成毁灭性的打击。) i7 |2 N9 d& @$ @' Y: h- d$ Z
3 t+ h- P* u' y- i3 r: O搭建过程
2 `/ d0 W& N x }1 ~$ D5 G; N3 L由于云平台处在运行阶段,直接调整RabbitMQ的配置并不是一个很好的选择。于是我们折衷了一下,原有的RabbitMQ依旧运行,转而为Ceilometer另外搭建一套高可用的RabbitMQ集群,使用HAProxy做负载均衡。
0 t. i* Y' I- K* D& o
( P. H. v( i W7 }! l3 g* \1 l, b8 t1. 安装准备
6 C( i& X/ _+ o8 B0 X5 ~4 r ZRabbitMQ节点 IP地址 工作模式 操作系统0 ]; {$ N6 [+ R4 m' F5 c
rabbitmq1 192.168.60.87 RAM openEluer-25.03
( ]' ~7 | `3 ~4 |, srabbitmq2 192.168.60.88 RAM openEluer-25.03
/ i8 I- n/ o' Krabbitmq3 192.168.60.89 DISK openEluer-25.03
0 J' W6 Q1 C K集群共三台机器,其中两台为RAM模式运行,最后一台为DISK模式。& K8 Y+ t( f: @3 S! k1 w, ?
0 R* w9 a+ t/ A+ y2. 安装RabbitMQ
1 x# {# E+ d# \( _# I为了简化安装过程,我们并没有采取编译安装的方式,而是直接使用dnf进行安装,为了安装最新的RabbitMQ-3.12.0版本,需要修改dnf的源。首先在每一台机器都执行以下步骤:
) k9 K/ E& W( F* Q8 \ X* v8 o' _! g0 ^
8 h. m, A( k3 k# f+ s4 R# 2.2 添加RabbitMQ public key
! a( h# I" o% U0 r4 x) |" _9 V1 n& r3 z! k0 d
# 2.3 更新并安装RabbitMQ
. k5 e( g D, v9 z" K6 Adnf install -y rabbitmq-server" V; T0 I+ j$ d+ F! Y; M+ s4 q8 @
经过这个过程,就会将erlang以及RabbitMQ完整安装到所有机器中了。! ?3 X2 L9 Q7 J* L( V- g% W
/ h( |4 ~5 V5 D6 _5 E0 |, C8 J. H3. 配置RabbitMQ集群
! _0 ~0 I2 ~, q2 p* Z, }7 `安装完毕之后, 需要在每台执行 :1 @5 d [5 b3 l: O2 `6 a) O
1 g2 b; T3 B: O+ L
# 3.1 停止服务' d* U! m0 z) {0 _) v* j
systemctl stop rabbitmq-server.service 0 d$ K7 u6 X2 }( ?, I2 F8 r3 P* y
# 3.2 设置erlang cookie在这里我们是自己生成的cookie文件,只要保证是二十位的大写字符,可以自己指定内容,保证所有机器上的cookie内容一致即可。1 \4 Q: w" @! F1 p
echo 'MYRABBITMQCLMNHYVBGJK' > /var/lib/rabbitmq/.erlang.cookie
9 P7 T/ O& N+ _* v; }$ U
2 Y5 W4 p8 P6 z6 j#修改文件的用户和用户组1 G. {& c# D+ B: M, S7 L
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie3 ]! c, E+ A) v* Q
# Q# w: T7 {7 o4 d#设置文件访问权限
6 K& n% u8 l/ U+ r: d ~0 C4 D2 ?% T* T" G6 {0 `8 P
chmod 400 /var/lib/rabbitmq/.erlang.cookie
2 z- O! k7 P0 c: L0 K, h& Q3 P* W P% h Q! W6 f/ s
# 3.3 启动服务
3 a; j& G6 _9 F; Rsystemctl start rabbitmq-server.service
H5 h5 H8 W* S" a! a$ H
& |! `0 F5 V1 M# @, h# 3.4 设置RabbitMQ管理插件
2 z& f2 V$ _7 ]% Trabbitmq-plugins enable rabbitmq_management
: {) G( _$ W& l; O# h& Z5 }( L# C. V4 C# a1 E$ M# I
S. Z" ]0 e9 \4 C! A$ M' ^) B; @' y
rabbitmqctl add_user openstack 1111115 i# c" W$ m% ?! E, Q( C7 p$ \
#opnetack用户,111111 是密码
+ O( Z, Q2 S4 e6 N9 n' Q
4 a) ]# ~5 g9 irabbitmqctl set_permissions openstack ".*" ".*" ".*"- l* R8 [* }: V7 G: z" K' l
#设置权限为读写
5 ?/ |9 l! m5 @& ]
) f# @& d5 [1 |$ crabbitmqctl set_user_tags openstack administrator
8 S. U- n) v, d' C( f0 u5 H# E#设置管理员权限4 q7 k3 j, z* }$ g8 ~8 P
$ I+ `+ R. F/ w2 s
# 3.5 关闭app
- f3 c( {6 N3 i. c, }rabbitmqctl stop_app E/ X" Q0 c) ^. K
1 Z | y6 I1 e3 V& L- _0 j
# 3.6 重设
% Y: D5 d, U: g7 M" T+ \rabbitmqctl reset
* ~! ~! X3 l) n4 P8 Q
! |% M5 C2 W! s# @) l% x q# 3.7 根据需要设置当前节点的工作模式(ram/disk),HOSTNAME_ROOT为集群根节点的主机名,注意在此必须使用主机名而不是IP地址,在此,我们选择的是rabbitmq-1。在此join_cluster命令为3.0以上版本RabbitMQ使用,常用的2.7版本添加节点的方法与此不同,请查阅相关文档。- s: a2 K7 a- c5 E
# RAM
9 K, \, ]. I+ `2 E% [$ Brabbitmqctl join_cluster --ram rabbit@${HOSTNAME_ROOT}
. I) I, g; e& a( G2 K* c G
$ U9 ]0 b4 c" q# DISK/usr/sbin/
/ I* V* f1 n& `# ?7 I" n; R; D1 Y# y
rabbitmqctl join_cluster rabbit@${HOSTNAME_ROOT}
+ Z j4 g x5 L( c( Q) Q( M* V+ ^" e7 z: \# ~5 w. [1 Q+ B
# 3.8 开启app+ E8 |8 A6 G: a' [
* \- V A+ y- n/usr/sbin/& \ H* V6 ~5 x& w
rabbitmqctl start_app
3 O* M: T3 O. L2 Y- y. i0 v+ j1 O) b, I1 C( [0 E s' g
# 3.9 重启服务# F' S) c# a3 h" k9 @
systemctl restart rabbitmq-server.service
% }. [3 \% C! {. G; y& ?+ x( }8 @+ x: h8 _" K3 d) T; Q
4. 添加用户
" f/ c, M4 ]* o# z0 E* K, w执行完以上的步骤集群中各个节点基本配置完毕了,现在要做的是添加用户和设置权限, 请在主节点上执行 :
# U4 q+ x% S4 T1 K$ M* |
; X m% Z' n) J3 {* Y# 4.1 添加用户,设置密码。在这里需要提醒一下,新版本(3.3.0)的RabbitMQ为了安全性考虑仅允许localhost使用#$ E5 s, s0 o1 l) B2 i# d9 k7 Y: h
guest账户,所以最好根据应用需要建立自己的账户。
% `2 A! n4 @' X& q" ^因为要使用web页面管理,所以我建立了两个账户['web_admin','mgmt_admin']" b. }* C7 A1 ?0 I
/ |* {) o, X8 Z" K9 ]
rabbitmqctl add_user username userpwd, r. Z- Q% n y; @+ R
# F# b2 ]% N% }5 P3 e1 V* j
# 4.2 设置用户tags# 0 z) m2 n7 t" O+ F
前一步创建的两个用户tag分别设为['monitoring','administrator'],设置完之后可以使用$ b R: `1 M$ z2 K: Q+ d p
rabbitmqctl list_users
; c6 O4 f* g( x0 E6 h查看/usr/sbin/rabbitmqctl set_user_tags username usertag
4 h$ r6 d: g5 B; [1 [
; P O. b0 N5 g9 Q( e# 4.3 设置用户权限# 下面命令的意义是对username 用户赋予所有虚拟主机vhost(/),配置、写、读的权限(.*,正则表达式)1 U" g% D! `8 R# M, u: k d% o4 M
5 @# \! J2 A, g" b6 m
/usr/sbin/6 Y( @ T4 ^ o2 Z/ ` G$ B
rabbitmqctl set_permissions -p / username ".*" ".*" ".*"
" O# Z B% Z0 V( E1 [/ m D2 U1 h, _, U( m( H* r
5. 设置高可用策略
+ G& H2 h v' U; j' e4 d$ g, X为了使用HAProxy做负载均衡,必须将整个RabbitMQ集群的状态设置为镜像模式,具体方式是通过以下命令,注意策略的设置也是在3.x版本中添加的功能,2.x版本是没有的。
( H x5 w+ B" @0 W% Y" [4 @ a7 D
& J4 j# Z; `. C# [6 g/ T# 5.1 设置高可用策略6 z( D! I- o+ @6 J) a
: y/ z6 T- s, d0 X% Y
/usr/sbin// \0 ^1 G# d( U% `$ T. \2 N7 X
: I3 p$ m) }2 W2 ]( B$ w
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
- p# j3 s4 j% u" @
& x+ S1 P2 ]7 B$ M9 }
" O1 Q2 h& L. i至此,RabbitMQ的安装配置部分结束,可以访问http://192.168.60.87:15672,用户名刚刚的用户名,密码xxxx进行访问。. j2 G9 @) j8 y5 m; V5 d( R3 s
% y3 a& @' q6 U
- Z9 T3 ]- h/ s; e; |3 A7 B7 w
接下来是设置HAProxy。
% _6 |* W1 k2 W4 c1 P( D" M) B( I0 Y" k6 @! P# v& d3 L! k' u* K
6. HAProxy安装配置
6 A( Z* ] R9 q1 t# R) U将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。本例中我们使用rabbitmq-1运行负载均衡服务。( Q% m& L! c' A+ O7 v- }3 y
# t8 P# j0 I: g3 U4 l2 Q' q# 6.1 在rabbitmq-1安装HAProxyapt-get install haproxy
+ G4 K# E7 I1 G8 U设置/etc/haproxy/haproxy.cfg,下面我给出一个设置模板:
& h! K" g( X6 r& c# [1 R7 E* z9 v3 r- w
global log ' o5 l0 f5 G$ K# L6 M0 f1 O6 v7 j
127.0.0.1 local0log
! p N. S5 ]2 o' C5 Y/ v127.0.0.1 local1 notice4 S5 m6 D9 T% R5 R
maxconn 4096
% H9 M( |9 r) U" d0 V1 @user haproxy/ Q0 e, ] g, A: m2 s$ p! k; j
group haproxy. g' Y2 b2 h9 O) K1 B' H2 s
daemon
8 L- t' L- b* I5 V. H4 f: L* {
4 U k3 p. M$ e, N! i4 j- Edefaultslog global #使用tcp监听模式mode tcp7 s% G) Y/ y! V3 z' X5 `" h) i0 V9 E
option tcplog
6 {$ @, U; {- moption dontlognull6 _2 ]; u; w9 _ a( ]0 ~5 h
retries 3option redispatch. I& \' z% E- ]( T
maxconn 2000contimeout 5000clitimeout 50000srvtimeout 50000listen admin_stat
# S6 u4 t6 b4 V) V, }#haproxy的web管理端口 8889,自行设置- h1 v4 ]# I+ V- W! p& b1 s
bind 0.0.0.0:88891 w: R0 I' j: W% l+ `. K7 o
mode http$ z* o# A I- f3 L, @
stats refresh 30s #haproxy web管理url,自行设置stats uri /haproxy_stats
' }; b( Z- W2 c: W" [ F$ {0 gstats realm Haproxy\ Statistics #haproxy web管理用户名密码,自行设置stats auth admin:admin
' x' h, A; O8 \7 l) d6 J9 T# Tstats hide-versionlisten rabbitmq 0.0.0.0:5671 #监听5671端口,并转发给三个节点的5672端口,采用轮询策略mode tcp5 e% v7 r& u4 w3 o
balance roundrobin
* R/ S* x8 H# m6 [6 u3 M! k# J: H0 \server rabbitmq-1 192.168.60.87:5672 check inter 2000 rise 2 fall 3& v3 R4 T8 ~; y. G; E) D h0 K9 R
server rabbitmq-2 192.168.60.88:5672 check inter 2000 rise 2 fall 3
3 b" q1 x/ c* ?( tserver rabbitmq-3 192.168.60.89:5672 check inter 2000 rise 2 fall 3
9 a( H* h( s% Y6 t
# N" C9 B2 r j6 l# 6.2 启动haproxy服务
/ u/ ~ V0 L( v8 A t/ K/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D1 r+ e# ^' y2 z% v9 Y* W1 R
/ F+ |( r5 z. z9 S' v
至此,HAProxy设置完毕,可以通过http://192.168.60.87:8889/haproxy_stats, admin:admin1 I" D X, t+ h; V, @
访问haproxy的web管理端。; S! C% g N. Z. G7 P: I$ C
. r; \. @& C! Q; k) K
还有需要注意的是在ceilometer的配置文件/etc/ceilometer/ceilometer.conf中需要指明负载均衡服务器的地址,如果端口号不是5671请指明。1 R4 e# ]7 W! g+ g# h. ?2 y) `
& }/ l# _/ c+ m; E# l$ p2 X& e
4 G9 Z. ?. N7 l
, M) F4 y0 B) K+ F7 n+ K" L
5 N' l4 Y6 ^5 G9 m9 {7 F |
|