1 Erlang旧版卸载:
cluster集群中的所有节点的erlang版本和rabbitmq版本必须一致, 否则无法加入cluster
on Ubuntu
:
sudo apt-get purge erlang*
on Fedora
:sudo yum remove erlang*
installed erlang from source
:rm -rf {erlang
home directory}.
2 源码安装Erlang
sudo tar -zxvf otp_src_20.1.tar.gz
cd
otp_src_20.1
export
ERL_TOP=`
pwd
`
sudo ./configure //ps:默认安装在
/usr/local/{bin,lib/erlang}
sudo make
sudo make release_tests
cd
release/tests/test_server
sudo $ERL_TOP
/bin/erl -s ts install -s ts smoke_test batch -s init stop
cd
$ERL_TOP
sudo make install
sudo ln -s /usr/local/lib/erlang/bin/erl /usr/bin/erl
//非root用户也可以访问
浏览器打开查看test结果: $ERL_TOP/release/tests/test_server/index.html
3 安装rabbitmq二进制包
sudo xz -d rabbitmq-server-generic-unix-3.6.14.tar.xz
sudo tar -xvf rabbitmq-server-generic-unix-3.6.14.tar
添加环境变量:sudo vi /etc/profile,最末尾添加,保存后source /etc/profile
RABBITMQ_HOME=/data/project/soft/rabbitmq_server-3.6.14
export PATH=${PATH}:${RABBITMQ_HOME}/sbin
常用命令:
后台运行:sudo rabbitmq-server -detached
停止服务:sudo rabbitmqctl stop
启动/停止应用运行(进程还在,主要用于执行其他变更管理命令如reset):
sudo rabbitmqctl stop_app
sudo rabbitmqctl start_app
查询状态:sudo rabbitmqctl status
用户管理:
sudo rabbitmqctl add_user admin admin_159753
sudo rabbitmqctl delete_user usename
sudo rabbitmqctl change_password usename newpass
清除密码后该用户将无法登录:
sudo rabbitmqctl clear_password usename
sudo rabbitmqctl authenticate_user usename passw
设置用户标签,可以设置多个,空格分隔 标签用于控制用户的管理功能。
sudo rabbitmqctl set_user_tags usename administrator
激活管理组件:
sudo rabbitmq-plugins enable rabbitmq_management
默认guest/guest 用户只能在localhost登录,需要新建一个用户,并赋予管理员标签。
删除默认用户:
sudo rabbitmqctl delete_user guest
修改nodename(vi rabbitmq-env):
#Rename the node
NODENAME='rabbit1'
#Config file location and new filename CONFIG_FILE=/data/project/soft/rabbitmq_server-3.6.14/etc/rabbitmq/rabbitmq.config
4 同一台主机启动多节点(方便测试集群配置):
sudo RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
sudo RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
rabbit2 与rabbit1组成集群(join_cluster --ram
指定结点类型 为ram,默认为disc,集群中至少要有一个disc结点):
sudo rabbitmqctl -n rabbit2 stop_app
sudo rabbitmqctl -n rabbit2 join_cluster rabbit1@`hostname -s`
sudo rabbitmqctl -n rabbit2 start_app
rabbit1脱离集群:
sudo rabbitmqctl -n rabbit1 stop_app
sudo rabbitmqctl -n rabbit1 reset
sudo rabbitmqctl -n rabbit1 start_app
查询集群状态:
sudo rabbitmqctl -n rabbit1 cluster_status
sudo rabbitmqctl -n rabbit2 cluster_status
变更rabbit1 node types为ram:
sudo rabbitmqctl -n rabbit1 stop_app
sudo rabbitmqctl -n rabbit1 change_cluster_node_type ram
sudo rabbitmqctl -n rabbit1 start_app
测试环境:
4核心 Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz
8G内存 126G硬盘
x86_64 GNU/Linu
单机测试数据(100w条20字节内的文本数据):
生产者数量
|
消费者数量
|
autoAck
|
发送速率(/s)
|
接收速率(/s)
|
MQ服务器cpu
|
1
|
0
|
1
|
11495
|
0
|
130%
|
1
|
1
|
1
|
36230
|
35098
|
280%
|
1
|
2
|
1
|
35293
|
17032/个
|
300%
|
2
|
1
|
1
|
23932/个
|
47984
|
348%
|
1
|
1
|
0
|
20045
|
19,800
|
270%
|
1
|
2
|
0
|
19691
|
9,774/个
|
323%
|
集群测试数据(100w条20字节内的文本数据):
集群结点 :rabbit1(hello队列在此结点) rabbit2
生产者数量
|
消费者数量
|
autoAck
|
发送速率(/s)
|
接收速率(/s)
|
MQ服务器cpu
|
备注
|
1
|
0
|
1
|
13666
|
0
|
130%
(rabbit2没有cpu消耗)
|
生产者连接到rabbit1
|
1
|
0
|
1
|
16983
|
0
|
200%
(rabbit2高于rabbit1)
|
生产者连接到rabbit2
|
1
|
1
|
1
|
19121
|
19,245
|
280%
|
生产者连接到rabbit1
消费者连接到rabbit2
|
1
|
1
|
1
|
13835
|
13,964
|
160%(相当)
|
生产者连接到rabbit2
消费者连接到rabbit1
|
1
|
1
|
1
|
14769
|
14,813
|
240%
(rabbit2高于rabbit1)
|
生产者连接到rabbit2
消费者连接到rabbit2
|
1
|
1
|
1
|
36142
|
35980
|
282%
|
生产者连接到rabbit1
消费者连接到rabbit1
|
1
|
2
|
1
|
29456
|
15408/个
|
300%(rabbit1高)
|
生产者连接到rabbit1
消费者分别连接到
rabbit1 rabbit2
|
1
|
2
|
1
|
35166
|
17809/个
|
320%
|
生产者连接到rabbit1
消费者全部连接到
rabbit1 rabbit1
|
1
|
2
|
1
|
17104
|
8,893/个
|
270%(rabbit2高)
|
生产者连接到rabbit2
消费者全部连接到rabbit2
|
2
|
2
|
1
|
17914
13005
|
15875
14768
|
310%(rabbit1高)
|
生产者、消费者分别
连接到rabbit1、rabbit2
|
结论:单机mq性能最高,当消费者消费的消息不在当前节点,TPS会下降的30%-50%.
集群主要用于高可用部署以及简化客户端接入逻辑。
对于追求吞吐量,数据不要求强一致性的业务来说,使用kafka会更适合。
要求高可用强一致性的业务,如果业务并发量过大, 可采用按业务分离mq,分散流量。
无法拆分的业务,则可以部署多个独立mq节点,非cluster,通过在mq客户端做负载均衡,
确保每个节点的连接数是均衡的。
使用HAproxy可以简单实现负载,但无法保证所有节点都有合适数量的生产者和消费者。
关于autoAck参数,如果设置为true,则服务器发送之后自动确认,无需等待客户端确认。这种方式TPS最高,但容易出现消息丢失。
autoAck设置为false,则消息不会丢失,客户端还有可能会收到重复消息,需要在客户端做好幂等逻辑。这种情况下,TPS会下降50%