简介
消息性中间件
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协议的调度
网友评论