RabbitMQ模式大概分为如下三种:
(1)单一模式。
(2)普通模式(默认的集群模式)。
(3) 镜像模式(把须要的队列作成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用)。
要实现镜像模式,须要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。node
RabbitMQ的集群节点包括内存节点、磁盘节点。
RabbitMQ支持消息的持久化也就是数据写在磁盘上,默认是磁盘节点。浏览器
RabbitMQ相关端口服务器
4369 (epmd), 25672 (Erlang distribution) 5672, 5671 (AMQP 0-9-1 without and with TLS) 15672 (if management plugin is enabled) 61613, 61614 (if STOMP is enabled) 1883, 8883 (if MQTT is enabled)
RabbitMQ 集群节点设置cookie
server103.example.com IP: 192.168.72.103 Node: disk
server105.example.com IP: 192.168.72.105 Node: disk
server106.example.com IP: 192.168.72.106 Node: diskapp
1. 安装erlang依赖yum install -y epel-release
或者经过yum源安装
#添加EPEL源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
添加Erlang源
rpm -Uvh http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpmtcp
2. 安装RabbitMQ Serveryum install -y rabbitmq-server
(默认安装目录为:/usr/lib/rabbitmq/bin/)ide
或者经过yum源安装oop
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-3.6.1-1.noarch.rpm rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc yum install rabbitmq-server-3.6.1-1.noarch.rpm
3. 单机配置
#调整系统限制阿里云
vi /etc/sysctl.conf fs.file-max = 300000
#设置生效sysctl -p
#查看sysctl fs.file-max
插件
#调整用户限制
vi /etc/security/limits.conf
* soft nofile 65536 * hard nofile 65536
#添加hostecho "192.168.72.103 server103" >> /etc/hosts
#防火墙打开端口
firewall-cmd --permanent --add-port=15672/tcp firewall-cmd –-reload
#设置自动重启
chkconfig rabbitmq-server on service rabbitmq-server start
#启动监控插件
rabbitmq-plugins list //查看插件安装状况 rabbitmq-plugins enable rabbitmq_management //启用rabbitmq_management服务
4. 用户管理
#添加用户
rabbitmqctl add_user admin admin rabbitmqctl add_user travel 88gongxiangrbq
#设置用户角色
rabbitmqctl set_user_tags admin administrator rabbitmqctl set_user_tags travel administrator
#设置用户权限(设置admin用户配置、写、读的权限)
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" rabbitmqctl set_permissions -p / travel ".*" ".*" ".*"
#删除guest用户rabbitmqctl delete_user guest
rabbitmq从3.3.0开始禁止使用guest/guest权限经过除localhost外的访问。
若是想使用guest/guest经过远程机器访问,须要在rabbitmq配置文件中(/etc/rabbitmq/rabbitmq.config)中设置loopbackusers为[]。
[{rabbit, [{loopbackusers, []}]}].
#管理界面
在浏览器中打开http://192.268.72.104:15672
#默认配置说明
cat /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.1/sbin/rabbitmq-defaults
1. 配置三台机器的主机名(三台机器分别执行)
hostnamectl set-hostname server103 hostnamectl set-hostname server105 hostnamectl set-hostname server106
查看效果:
hostname
配置三台机器的hosts解析(三台机器都添加以下配置)
vi /etc/hosts 192.168.72.103 server103 192.168.72.105 server105 192.168.72.106 server106
2. 设置每一个节点Cookie
Rabbitmq的集群是依赖于erlang的集群来工做的,因此必须先构建起erlang的集群环境。Erlang的集群中各节点是经过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的权限。因此必须保证各节点cookie保持一致,不然节点之间就没法通讯
选择其中一台做为集群主节点,将其cookiecopy到另外两台机器上。
chmod 700 /var/lib/rabbitmq/.erlang.cookie echo -n "YACWQCCKIKHSVKFFJYBL" > /var/lib/rabbitmq/.erlang.cookie chmod 400 /var/lib/rabbitmq/.erlang.cookie
网上看到有些朋友,将其中一台的cookie,远程发送到其余节点服务器,这样容易致使cookie文件的属组变化,默认为rabbitmq,下面的一个错误会提到。
#修改cookie后须要重启mq
ps -ef | grep ^rabbitmq | awk '{print $2}' | xargs kill -9 service rabbitmq-server start
常见的启动失败:
Starting rabbitmq-server (via systemctl): Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.
查看日志:
tail -f /var/log/rabbitmq/startup_log {error_logger,{{2019,2,19},{16,10,19}},"Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces",[]} {error_logger,{{2019,2,19},{16,10,19}},crash_report,[[{initial_call,{auth,init,['Argument__1']}},{pid,<0.20.0>},{registered_name,[]},{error_info,{exit,{"Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces",[{auth,init_cookie,0,[{file,"auth.erl"},{line,285}]},{auth,init,1,[{file,"auth.erl"},{line,139}]},{gen_server,init_it,6,[{file,"gen_server.erl"},{line,304}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]},[{gen_server,init_it,6,[{file,"gen_server.erl"},{line,328}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]}},{ancestors,[net_sup,kernel_sup,<0.10.0>]},{messages,[]},{links,[<0.18.0>]},{dictionary,[]},{trap_exit,true},{status,running},{heap_size,610},{stack_size,27},{reductions,643}],[]]}
主要是访问cookie失败致使的,能够尝试修改cookie的权限和属组:
cd /var/lib/rabbitmq/ chown rabbitmq:rabbitmq .erlang.cookie chmod 400 .erlang.cookie
启动成功后查看状态:rabbitmqctl status
状态显示可能会遇到连接不上的错误,以下:
Status of node rabbit@server104 ...
Error: unable to connect to node rabbit@server104: nodedown
DIAGNOSTICS attempted to contact: [rabbit@server104] rabbit@server104: * connected to epmd (port 4369) on server104 * epmd reports node 'rabbit' running on port 25672 * TCP connection succeeded but Erlang distribution failed * suggestion: hostname mismatch? * suggestion: is the cookie set correctly? * suggestion: is the Erlang distribution using TLS?
缘由:
RabbitMQ的erlang.cookie和用户的cookie冲突了,须要用rabbitmq的cookie去覆盖用户的cookie。
解决方式: sudo cp /var/lib/rabbitmq/.erlang.cookie ~/.erlang.cookie
重启
rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@server106 --ram rabbitmqctl start_app
#将节点从集群中去掉rabbitmqctl forget_cluster_node rabbit@server104
节点恢复过程当中把数据删掉很重要,恢复一单结点,再清数据
节点增长:
1. rabbitmq-server -detached --- .erlang.cooike的权限,400 属主rabbitmq 2. rabbitmqctl stop_app 3. rabbitmqctl join_cluster --ram rabbit@rabbitmq1 4. rabbitmqctl start_app 5. rabbitmqctl cluster_status
节点删除
1. rabbitmq-server -detached 以上为基础,正常运行的mq节点直接进行二、3两步;4可省略或更改成rabbitmqctl stop 2. rabbitmqctl stop_app 3. rabbitmqctl reset 4. rabbitmqctl start_app
若是想切换节点类型,譬如由disc-->ram,能够先恢复到单结点,重启,清数据,再添加集群。