CentOS7 安装配置 RabbitMQ

2018/08/21 Linux

一、简介

以下内容翻译自 RabbitMQ Tutorials One

RabbitMQ 是一个消息代理。它的核心思想非常简单:接收并转发消息。你可以把它想象成一个邮局:当你把邮件丢进邮箱时,你非常确定邮递员先生会把它送到收件人手中。在这个比喻中,RabbitMQ 就是邮箱、邮局和邮递员。

RabbitMQ 和邮局的主要区别是它处理的不是纸张。它接收、存储并转发二进制数据块,也就是 message,消息。

通常来讲,RabbitMQ 和消息传递中会用到一些术语:

  • producing 的意思是发送。一个发送消息的程序叫做 producer。图中我们用一个“P”来表示它:

  • 一个 queue,即队列,相当于一个邮箱,它由 RabbitMQ 管理。尽管消息会在你的应用和 RabbitMQ 之间流过,但他们只被保存在队列中。队列没有边界限制,你想存多少消息就能存多少——它本质上是一个无限制的缓冲区。一个队列可以接收多个 producer 的消息,也可以被多个 consumer 读取。下图是一个队列,上边的字代表它的名字:

  • consuming 的意思类似于接收。一个等待接收消息的程序叫做 consumer。在图中我们用一个“C”来表示它。

要注意,producer、consumer 和消息代理不需要生活在同一台机器上,事实上大多数应用中它们会分开住。

二、安装

操作系统版本: CentOS Linux release 7.5.1804 (Core)

2.1、配置 EPEL Repository

国内的话建议配置阿里云的镜像仓库。

$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
$ yum clean all
$ yum makecache
# 安装 RabbitMQ
$ yum -y install rabbitmq-server

2.2、启用 rabbitmq_management 管理插件

在这之前先学习一下如何使用 rabbitmq-plugins 命令管理插件

rabbitmq-plugins <command> [<command options>]

Commands:
    # 列出可用插件,插件前显示 [E] 的表示启用的插件,[e] 的表示被[E]依赖而启用的
    list [-v] [-m] [-E] [-e] [<pattern>]
    # 启用插件
    enable <plugin> ... 
    # 禁用插件
    disable <plugin> ...

接下来启用 rabbimq_management 管理插件

$ rabbitmq-plugins enable rabbitmq_management

$ rabbitmq-plugins list
[e] amqp_client                       3.3.5
[ ] cowboy                            0.5.0-rmq3.3.5-git4b93c2d
[ ] eldap                             3.3.5-gite309de4
[e] mochiweb                          2.7.0-rmq3.3.5-git680dba8
[ ] rabbitmq_amqp1_0                  3.3.5
[ ] rabbitmq_auth_backend_ldap        3.3.5
[ ] rabbitmq_auth_mechanism_ssl       3.3.5
[ ] rabbitmq_consistent_hash_exchange 3.3.5
[ ] rabbitmq_federation               3.3.5
[ ] rabbitmq_federation_management    3.3.5
[E] rabbitmq_management               3.3.5
[e] rabbitmq_management_agent         3.3.5
[ ] rabbitmq_management_visualiser    3.3.5
[ ] rabbitmq_mqtt                     3.3.5
[ ] rabbitmq_shovel                   3.3.5
[ ] rabbitmq_shovel_management        3.3.5
[ ] rabbitmq_stomp                    3.3.5
[ ] rabbitmq_test                     3.3.5
[ ] rabbitmq_tracing                  3.3.5
[e] rabbitmq_web_dispatch             3.3.5
[ ] rabbitmq_web_stomp                3.3.5
[ ] rabbitmq_web_stomp_examples       3.3.5
[ ] sockjs                            0.3.4-rmq3.3.5-git3132eb9
[e] webmachine                        1.10.3-rmq3.3.5-gite9359c7

2.3、启动 rabbitmq-server

$ systemctl start rabbitmq-server

RabbitMQ 端口说明:

  • 5672:为 rabbimq 自己监听的端口;
  • 15672:为 rabbitmq_management 管理插件监听的端口,可以通过 web 访问;
  • 25672:为 RabbitMQ 集群模式时通信的端口;

2.4、访问 rabbitmq_management 控制台

打开浏览器输入地址: http://IP:15672 这里的IP要换成你自己的 IP 地址,默认用户名,密码为guest

登录成功之后大部分的 RabbitMQ 管理工作都可以在此控制台中完成。

三、常用管理命令

RabbitMQ 提供了一个管理命令 rabbitmqctl

3.1、用户管理

rabbitmqctl [-n <node>] [-q] <command> [<command options>]

Commands:
    # 添加一个用户
    add_user <username> <password> 
    # 删除用户
    delete_user <username>
    # 修改密码
    change_password <username> <newpassword>
    # 清除密码
    clear_password <username>
    # 给用户设置标签 
    set_user_tags <username> <tag> ...
    # 列出所有用户
    list_users

练习

  1. 添加用户 test 密码为:123456
  2. 给 test 用户设置标签为 administrator
root@db03v-test-ops:~ # rabbitmqctl add_user test 123456
Creating user "test" ...
...done.
root@db03v-test-ops:~ # rabbitmqctl list_users
Listing users ...
guest   [administrator]
test    []
...done.
root@db03v-test-ops:~ # rabbitmqctl set_user_tags test administrator
Setting tags for user "test" to [administrator] ...
...done.
root@db03v-test-ops:~ # rabbitmqctl list_users
Listing users ...
guest   [administrator]
test    [administrator]
...done.

3.2、虚拟主机管理

rabbitmqctl [-n <node>] [-q] <command> [<command options>]

Commands:
    # 创建一个虚拟主机
    add_vhost <vhostpath>
    # 删除虚拟主机
    delete_vhost <vhostpath>
    # 列出虚拟主机,默认只有 / 一个虚拟主机,创建的所有虚拟主机都必须在 / 下,例如 /myvhosts
    list_vhosts [<vhostinfoitem> ...]

练习

  1. 列出所有虚拟主机
  2. 创建虚拟主机 myvhost
root@db03v-test-ops:~ # rabbitmqctl list_vhosts
Listing vhosts ...
/
...done.
root@db03v-test-ops:~ # rabbitmqctl add_vhost /myvhost
Creating vhost "/myvhost" ...
...done.
root@db03v-test-ops:~ # rabbitmqctl list_vhosts       
Listing vhosts ...
/
/myvhost
...done.

3.3、权限管理

rabbitmqctl [-n <node>] [-q] <command> [<command options>]

Commands:
    # 设置指定虚拟主机的权限,权限分为<conf>配置文件权限,<wirte>写权限,<read>读权限
    set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
    # 清除权限
    clear_permissions [-p <vhostpath>] <username>
    # 列出虚拟主机的权限
    list_permissions [-p <vhostpath>]
    # 以用户为中心列出权限
    list_user_permissions <username>

练习

1、 查看 guest 和 test 用户的权限

root@db03v-test-ops:~ # rabbitmqctl list_user_permissions guest
Listing permissions for user "guest" ...
/       .*      .*      .*
...done.
root@db03v-test-ops:~ # rabbitmqctl list_user_permissions test 
Listing permissions for user "test" ...
...done.

2、给 test 用户设置对 /myvhost 虚拟主机有所有权限

root@db03v-test-ops:~ # rabbitmqctl set_permissions -p /myvhost test ".*" ".*" ".*"
Setting permissions for user "test" in vhost "/myvhost" ...
...done.
root@db03v-test-ops:~ # rabbitmqctl list_user_permissions test
Listing permissions for user "test" ...
/myvhost        .*      .*      .*
...done.

3.4、其它命令

rabbitmqctl [-n <node>] [-q] <command> [<command options>]

Commands:
	# broker状态查看:
		status

	# 环境变量查看:
		environment

	# 执行erlang底层表达式:
		eval <expr>

	# 关闭指定的连接:
		close_connection <connectionid> <explanation>
	# 设定内存高水位标记:
		set_vm_memory_high_watermark <fraction>

四、RabbitMQ 集群配置

4.1、环境介绍

IP 主机名 硬件配置 角色
10.100.4.181 node1 4核4G内存 HAProxy
10.100.4.182 node2 4核4G内存 RabbieMQ Master
10.100.4.183 node3 4核4G内存 RabbieMQ Slave

拓扑图如下:

未命名文件

生产环境中 HAProxy 也要做高可用,网络上常见的高可用方案是 HAProxy + Keepalived 组合的方式。

4.2、修改主机名配置 hosts 解析

RabbitMQ 集群内所有主机节点使用短主机名,并配置好 hosts 能解析。

# node2 节点修改
$ hostnamectl set-hostname node2
$ vim /etc/hosts
10.100.4.182 node2
10.100.4.183 node3
# node3 节点修改
$ hostnamectl set-hostname node3
$ vim /etc/hosts
10.100.4.182 node2
10.100.4.183 node3

4.3、安装 RabbitMQ 并启用管理插件

以下操作在两台需要安装 RabbitMQ 的服务器上进行操作;

$ yum -y install rabbitmq-server
$ systemctl start rabbitmq-server
$ rabbitmq-plugins enable rabbitmq_management

4.4、复制 erlang.cookie 到 Slave

复制 RabbitMQ Master 节点上的 .erlang.cookie 到 RabbitMQ Slave 节点上。

root@node2:~ # scp -p -P 59120 /var/lib/rabbitmq/.erlang.cookie root@10.100.4.183:/var/lib/rabbitmq/

重启 RabbitMQ Slave 节点上的 rabbitmq-server 服务

root@node3:~ # systemctl stop rabbitmq-server
root@node3:~ # systemctl start rabbitmq-server

4.5、查看所有节点的 cluster_name

看所有节点的cluster_name确保名称为类似rabbit@node2这样的名字

# Master 节点
root@node2:~ # rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
 {running_nodes,[rabbit@node2]},
 {cluster_name,<<"rabbit@node2">>},
 {partitions,[]}]
...done.

# Slave 节点
root@node3:~ # rabbitmqctl cluster_status     
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node3]}]},
 {running_nodes,[rabbit@node3]},
 {cluster_name,<<"rabbit@node3">>},
 {partitions,[]}]
...done.

4.6、停止应用

在 slave 节点上执行 rabbitmqctl stop_app

root@node3:~ # rabbitmqctl stop_app
Stopping node rabbit@node3 ...
...done.

4.7、配置 slave 节点加入指定的 cluster_name 中

在刚刚查看所有节点的 cluster_name 一步中 Master 节点的 cluster_name 是 rabbit@node2 所以在 Slave 节点就要加入到这个集群名字中;

root@node3:~ # rabbitmqctl join_cluster rabbit@node2
Clustering node rabbit@node3 with rabbit@node2 ...
...done.

刚刚我们在 slave 执行了 rabbitmqctl stop_app 现在我们在启动应用

root@node3:~ # rabbitmqctl start_app
Starting node rabbit@node3 ...
...done.

4.8、查看集群状态

在 Slave 节点上查看状态可以看到以下信息

root@node3:~ # rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node2,rabbit@node3]}]}, # 集群内的两个节点
 {running_nodes,[rabbit@node2,rabbit@node3]}, # 看到两个节点
 {cluster_name,<<"rabbit@node2">>}, # 已经加入到 node2 集群中
 {partitions,[]}]
...done.

在 Master 节点也可以查看一下状态信息

root@node2:~ # rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2,rabbit@node3]}]},
 {running_nodes,[rabbit@node3,rabbit@node2]},
 {cluster_name,<<"rabbit@node2">>},
 {partitions,[]}]
...done.

4.9、安装 HAProxy

在 node1 节点上安装 haproxy

root@node1:~ # yum -y install haproxy

4.10、修改 HAProxy 配置文件

root@node1:~ # cat /etc/haproxy/haproxy.cfg    
#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
        #应用全局的日志配置
        log global
        #默认的模式mode{tcp|http|health}
        #tcp是4层,http是7层,health只返回OK
        mode tcp
        #日志类别tcplog
        option tcplog
        #不记录健康检查日志信息
        option dontlognull
        #3次失败则认为服务不可用
        retries 3
        #每个进程可用的最大连接数
        maxconn 2000
        #连接超时
        timeout connect 5s
        #客户端超时
        timeout client 120s
        #服务端超时
        timeout server 120s
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
listen stats
  bind    *:9000
  mode    http
  stats   enable
  stats   hide-version
  stats   uri       /stats
  stats   refresh   30s
  stats   realm     Haproxy\ Statistics
  stats   auth      Admin:Password # HAProxy 状态页的认证用户

listen rabbitmq :5672
  mode tcp
  stats enable
  balance roundrobin
  server rabbitmq01 10.100.4.182:5672 check inter 5000 rise 2 fall 3 weight 1 
  server rabbitmq02 10.100.4.183:5672 check inter 5000 rise 2 fall 3 weight 1 

在上面的配置中 listen rabbitmq :5672 这里定义了客户端连接 IP 地址和端口号。这里配置的负载均衡算法是 roundrobin,注意这里的roundrobin 是加权轮询。和 RabbitMQ 最相关的是 server rabbitmq01 10.100.4.182:5672 check inter 5000 rise 2 fall 3 weight 1 这种,它定义了 RabbitMQ 服务,每个 RabbitMQ 服务定义指令包含6个部分:

server <name>:定义 RabbitMQ 服务的内部标示,注意这里的“rabbitmq01”是指包含有含义的字符串名称,不是指 RabbitMQ 的节点名称。
<ip>:<port>:定义 RabbitMQ 服务的连接的 IP 地址和端口号。
check inter <value>:定义了每隔多少毫秒检查 RabbitMQ 服务是否可用。
rise <value>:定义了 RabbitMQ 服务在发生故障之后,需要多少次健康检查才能被再次确认可用。
fall <value>:定义需要经历多少次失败的健康检查之后,HAProxy 才会停止使用此 RabbitMQ 服务。
weight <value>:定义了当前 RabbitMQ 服务的权重。

listen stats 一段配置定义的是HAProxy的数据统计页面。数据统计页面包含各个服务节点的状态、连接、负载等信息。

运行 HAProxy 之后可以在浏览器上输入http://10.100.4.181:9000/stats 来加载相关的页面,如下图所示:

Search

    Table of Contents