美文网首页Linux科技
RabbitMQ简单介绍和搭建

RabbitMQ简单介绍和搭建

作者: Miracle001 | 来源:发表于2019-04-10 17:55 被阅读0次
简介
消息性中间件

AMQP协议:高级消息队列协议
    AMQP 0-9-1
    AMQP 1.0
路由模型:
    fan-out
    direct
    topic
    headers
broker:
    exchange
    banding
    queue
    
    virtualhost: 虚拟主机,有以下3个组件
        exchange
        banding
        queue
中间件的实现:
    Qpid,ActiveMQ(apache)
    RabbitMQ
    Kafka
    0MQ
rabbitmq:
    程序包: epel: rabbitmq-server
    插件: rabbitmq-plugins {enable|disable|list}
        rabbitmq_management,监听于15672端口
单实例rabbitMQ
安装rabbitMQ服务器
epel源需要下载其相应的包
[root@node1 ~]# yum info rabbitmq-server
[root@node1 ~]# yum -y install rabbitmq-server
[root@node1 ~]# systemctl start rabbitmq-server
[root@node1 ~]# systemctl enable rabbitmq-server
[root@node1 ~]# ss -ntl    端口:5672

[root@node1 ~]# rabbitmqctl add_user openstack root
[root@node1 ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"

[root@node1 ~]# rabbitmq-plugins list  没有e/E--没有启用插件
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node1 ~]# 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
被依赖的插件会自动启用,用e显示
手动启用,用E显示
注意:
启用完成rabbitmq_management插件后,由于它监听了新的端口,需要重启服务
如果没有重启服务,那么15672端口是不会被监听的
[root@node1 ~]# ss -ntl|grep -E "5672|4369"
LISTEN     0      128          *:25672                    *:*                  
LISTEN     0      128          *:4369                     *:*                  
LISTEN     0      128         :::5672                    :::*                  
LISTEN     0      128         :::4369                    :::*   
[root@node1 ~]# systemctl restart rabbitmq-server
[root@node1 ~]# ss -ntl|grep -E "5672|4369"
LISTEN     0      128          *:25672                    *:*                  
LISTEN     0      128          *:4369                     *:*                  
LISTEN     0      128          *:15672                    *:*                  
LISTEN     0      128         :::5672                    :::*                  
LISTEN     0      128         :::4369                    :::*   

浏览器:http://192.168.25.11:15672/
账号和密码都是guest
按照下图1-2操作,操作完成后logout退出,使用openstack登陆,成功即可如下图3
1 2 3
rabbitmq-server配置方式:
    环境变量: 网络参数及配置文件路径;
    配置文件: 服务器各组件访问权限、资源限制、插件及集群;
    运行时参数: 集群的运行时参数;

[root@node1 ~]# file /usr/lib/rabbitmq/lib/rabbitmq_server-3.3.5/sbin/rabbitmq-defaults
/usr/lib/rabbitmq/lib/rabbitmq_server-3.3.5/sbin/rabbitmq-defaults: POSIX shell script, ASCII text executable
[root@node1 ~]# less /usr/lib/rabbitmq/bin/rabbitmq-defaults
[root@node1 ~]# ll /usr/lib/rabbitmq/bin/rabbitmq-*
[root@node1 ~]# ll /usr/lib/rabbitmq/lib/rabbitmq_server-3.3.5/sbin/rabbitmq-*
[root@node1 ~]# cat /etc/rabbitmq/enabled_plugins
[rabbitmq_management].
启动成功插件后,才会有这个东西
----------------------------------------------------------------------------
----------------------------------------------------------------------------
环境变量: /etc/rabbitmq/rabbitmq-env.conf
    RABBITMQ_BASE: 数据库和日志文件;对Unix-like主机不常用;
    RABBITMQ_CONFIG_FILE: 配置文件路径;
    RABBITMQ_LOGS:
    RABBITMQ_NODE_IP_ADDRESS: 监听的IP;
    RABBITMQ_NODE_PORT: 端口
    RABBITMQ_PLUGINS_DIR: 
    
配置文件:
    auth_mechanisms: 认证机制,SASL简单认证安全层;
    default_user
    default_pass
    default_permission
    disk_free_limit: 最少预留空间
    heartbeat: 消息时长--580ms
    hipe_compile: 高性能的erlang编译器--hipe false
    log_levels: info  none/error/warning/info
    tcp_listeners: 监听的地址和端口  5672
    ssl_listeners: 基于ssl通信协议监听的地址和端口  5672
    vm_memory_high_watermark: 内存高水位标记--内存最少空间 
----------------------------------------------------------------------------
----------------------------------------------------------------------------
运行时参数:
    rabbitmqctl命令:
[root@node1 ~]# rabbitmqctl -h
    stop  停止整个erlang虚拟机
    stop_app  停止虚拟机上的应用程序
    set_parameter  设置集群参数
    clear_parameter  清空参数
    set_vm_memory_high_watermark <fraction>

# broker状态查看
[root@node1 ~]# rabbitmqctl status
Status of node rabbit@node1 ...
[{pid,1829},
 {running_applications,
     [{rabbitmq_management,"RabbitMQ Management Console","3.3.5"},
      {rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.3.5"},
      {webmachine,"webmachine","1.10.3-rmq3.3.5-gite9359c7"},
      {mochiweb,"MochiMedia Web Server","2.7.0-rmq3.3.5-git680dba8"},
      {rabbitmq_management_agent,"RabbitMQ Management Agent","3.3.5"},
      {rabbit,"RabbitMQ","3.3.5"},
      {os_mon,"CPO  CXC 138 46","2.2.14"},
      {inets,"INETS  CXC 138 49","5.9.8"},
      {mnesia,"MNESIA  CXC 138 12","4.11"},
      {amqp_client,"RabbitMQ AMQP Client","3.3.5"},
      {xmerl,"XML parser","1.3.6"},
      {sasl,"SASL  CXC 138 11","2.3.4"},
      {stdlib,"ERTS  CXC 138 10","1.19.4"},
      {kernel,"ERTS  CXC 138 10","2.16.4"}]},
 {os,{unix,linux}},
 {erlang_version,
     "Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:2:2] [async-threads:30] [hipe] [kernel-poll:true]\n"},
 {memory,
     [{total,39468360},
      {connection_procs,5600},
      {queue_procs,5600},
      {plugins,147200},
      {other_proc,13385752},
      {mnesia,60608},
      {mgmt_db,42352},
      {msg_index,24752},
      {other_ets,1047664},
      {binary,15216},
      {code,19754443},
      {atom,703377},
      {other_system,4275796}]},
 {alarms,[]},
 {listeners,[{clustering,25672,"::"},{amqp,5672,"::"}]},
 {vm_memory_high_watermark,0.4},
 {vm_memory_limit,764030156},
 {disk_free_limit,50000000},
 {disk_free,105504321536},
 {file_descriptors,
     [{total_limit,924},{total_used,3},{sockets_limit,829},{sockets_used,1}]},
 {processes,[{limit,1048576},{used,178}]},
 {run_queue,0},
 {uptime,65}]
...done.


[root@node1 ~]# rabbitmqctl stop_app
[root@node1 ~]# rabbitmqctl status
显示应用程序停止,erlang虚拟机运行
Status of node rabbit@node1 ...
[{pid,1829},
 {running_applications,[{inets,"INETS  CXC 138 49","5.9.8"},
                        {xmerl,"XML parser","1.3.6"},
                        {sasl,"SASL  CXC 138 11","2.3.4"},
                        {stdlib,"ERTS  CXC 138 10","1.19.4"},
                        {kernel,"ERTS  CXC 138 10","2.16.4"}]},
 {os,{unix,linux}},
...  ...
[root@node1 ~]# rabbitmqctl start_app


[root@node1 ~]# rabbitmqctl -h
用户管理: 
    add_user <username> <password>
    delete_user <username>
    change_password <username> <newpassword>
    clear_password <username>
    set_user_tags <username> <tag> ...
    list_users
# 添加用户
[root@node1 ~]# rabbitmqctl add_user test pass
Creating user "test" ...
...done.
# 显示用户
[root@node1 ~]# rabbitmqctl list_users
Listing users ...
guest   [administrator]
test    []
...done.
# 把普通用户升级为管理员
[root@node1 ~]# rabbitmqctl set_user_tags test administrator
Setting tags for user "test" to [administrator] ...
...done.
[root@node1 ~]# rabbitmqctl list_users
Listing users ...
guest   [administrator]
test    [administrator]
...done.
# 把管理员降级为普通用户
[root@node1 ~]# rabbitmqctl set_user_tags test    后面跟"空"即可
Setting tags for user "test" to [] ...
...done.
[root@node1 ~]# rabbitmqctl list_users
Listing users ...
guest   [administrator]
test    []
...done.
----------------------------------------------------------------------------
----------------------------------------------------------------------------
[root@node1 ~]# rabbitmqctl -h
虚拟主机:
    add_vhost <vhostpath>
    delete_vhost <vhostpath>
    list_vhosts [<vhostinfoitem> ...]

[root@node1 ~]# rabbitmqctl list_vhosts
Listing vhosts ...
/
...done.

# 添加虚拟主机
[root@node1 ~]# rabbitmqctl add_vhost /myhost1
Creating vhost "/myhost1" ...
...done.
[root@node1 ~]# rabbitmqctl add_vhost /myhost2
Creating vhost "/myhost2" ...
...done.
[root@node1 ~]# rabbitmqctl add_vhost /myhost1/test1
Creating vhost "/myhost1/test1" ...
...done.
[root@node1 ~]# rabbitmqctl add_vhost /myhost1/test2
Creating vhost "/myhost1/test2" ...
...done.
[root@node1 ~]# rabbitmqctl list_vhosts
Listing vhosts ...
/
/myhost1
/myhost1/test1
/myhost1/test2
/myhost2
...done.
# 删除虚拟主机
[root@node1 ~]# rabbitmqctl delete_vhost /myhost1/test2
Deleting vhost "/myhost1/test2" ...
...done.
----------------------------------------------------------------------------
----------------------------------------------------------------------------
[root@node1 ~]# rabbitmqctl -h
权限管理: 
    set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
    clear_permissions [-p <vhostpath>] <username>
    list_permissions [-p <vhostpath>]
    list_user_permissions <username>
[root@node1 ~]# rabbitmqctl list_permissions
Listing permissions in vhost "/" ...
guest   .*  .*  .*
...done.
[root@node1 ~]# rabbitmqctl list_user_permissions guest
Listing permissions for user "guest" ...
/   .*  .*  .*
...done.
此处的3个".*"分别代表的权限: 配置文件、写权限、读权限

# 设定test用户对/myhost2虚拟主机有所有权限
[root@node1 ~]# rabbitmqctl set_permissions -p /myhost2 test ".*" ".*" ".*"
Setting permissions for user "test" in vhost "/myhost2" ...
...done.
[root@node1 ~]# rabbitmqctl list_user_permissions test
Listing permissions for user "test" ...
/myhost2    .*  .*  .*
...done.
[root@node1 ~]# rabbitmqctl list_permissions -p /myhost2
Listing permissions in vhost "/myhost2" ...
test    .*  .*  .*
...done.
----------------------------------------------------------------------------
----------------------------------------------------------------------------
[root@node1 ~]# rabbitmqctl -h
组件查看命令:
    list_queues [-p <vhostpath>] [<queueinfoitem> ...]
    list_exchanges [-p <vhostpath>] [<exchangeinfoitem> ...]
    list_bindings [-p <vhostpath>] [<bindinginfoitem> ...]
    list_connections [<connectioninfoitem> ...]
    list_channels [<channelinfoitem> ...]
    list_consumers [-p <vhostpath>]
参数管理:
    set_parameter [-p <vhostpath>] <component_name> <name> <value>
    clear_parameter [-p <vhostpath>] <component_name> <key>
    list_parameters [-p <vhostpath>]
策略管理:
    set_policy [-p <vhostpath>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern>  <definition>
    clear_policy [-p <vhostpath>] <name>
    list_policies [-p <vhostpath>]
环境变量查看
    environment
系统状态报告
    report
执行erlang底层表达式
    eval <expr>
关闭指定连接
    close_connection <connectionpid> <explanation>
开启、关闭追踪功能
    trace_on [-p <vhost>]
    trace_off [-p <vhost>]
设定内存的高水位标记
    set_vm_memory_high_watermark <fraction>
[root@node1 ~]# rabbitmqctl environment
[root@node1 ~]# rabbitmqctl report

以上命令都可以通过web界面来设置
web界面可以通过restful接口访问
http://192.168.25.11:15672/api/exchanges
http://192.168.25.11:15672/api/queues
http://192.168.25.11:15672/api/overview
如下图
4 5

简单集群

RabbitMQ Cluster
HA
    各节点都有相同的数据  类似"replication cluster"
LB
    一台rabbitmq压力大,增加多台,使用haproxy做负载均衡
    haproxy-->rabbitmq1/rabbitmq2/rabbitmq3
    haproxy通过tcp_mode把请求均衡到多台机器上,且还可以进行健康状态检测

----------------------------------------------------------------------------
----------------------------------------------------------------------------
准备
镜像: centos7.5 1804
网络: NAT+仅主机
    192.168.25.x
    192.168.50.x
yum源: 额外安装了一个epel源,网上下载该包

2台主机都操作
vim /etc/hosts
192.168.25.11 node1.fgq.com node1
192.168.25.12 node2.fgq.com node2

yum clean all
yum repolist
yum -y install rabbitmq-server
systemctl start rabbitmq-server
ss -ntl | grep -E "5672|4369"
ll /var/lib/rabbitmq/.erlang.cookie

启用管理插件功能
2台主机都操作,以node1为例
[root@node1 ~]# rabbitmq-plugins list
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node1 ~]# systemctl restart rabbitmq-server
[root@node1 ~]# ss -ntl | grep -E "5672|4369"
插件端口是15672


复制cookie
node1
[root@node1 ~]# scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/
node2收到cookie后,需要重启
[root@node2 ~]# systemctl restart rabbitmq-server


node1查看集群
[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1]}]},
 {running_nodes,[rabbit@node1]},
 {cluster_name,<<"rabbit@node1.fgq.com"},
 {partitions,[]}]
...done.


node2
[root@node2 ~]# rabbitmqctl stop_app
Stopping node rabbit@node2 ...
...done.
[root@node2 ~]# rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node2 with rabbit@node1 ...
...done.
[root@node2 ~]# rabbitmqctl start_app
Starting node rabbit@node2 ...
...done.


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


浏览器: http://192.168.25.11:15672/
默认账号:guest  
默认密码:guest
集群管理:
    join_cluster <clusternode> [--ram]
    cluster_status
    change_cluster_node_type disc | ram
    forget_cluster_node [--offline]
    update_cluster_nodes clusternode
    sync_queue queue
    cancel_sync_queue queue
    set_cluster_name name


集群配置注意:
(1)使用短格式主机名;解析的名称与每个主机名称保持一致;
(2)时间同步;
(3)各个节点启用插件 rabbitmq_management
(4)配置过程
    master节点: 复制其cookie至其他各节点,要注意保持其权限为400;/var/lib/rabbitmq/.erlang.cookie
    在各从节点:
        停止应用  rabbitmqctl stop_app
        加入集群  rabbitmqctl join_cluster CLUSTER_NAME
        启动应用  rabbitmqctl start_app


从集群中删除  先stop_app


基于haproxy的LB集群:

    listen rabbitmq:5672
        mode tcp
        status enable
        balance roundrobin    前端的请求流量会负载均衡,但是数据不会均衡
        server rabbit01 IP:PORT check inter 5000
        server rabbit02 IP:PORT check inter 5000

基于nginx的LB集群:
    基于tcp协议的调度,不是http协议的调度

相关文章

网友评论

    本文标题:RabbitMQ简单介绍和搭建

    本文链接:https://www.haomeiwen.com/subject/bksabqtx.html