本人在ubantu16.04上部署rabbitmq集群,有以下总结。写的稍乱,要选择性参考
安装
echo 'deb http://www.rabbitmq.com/debian/ testing main' |
sudo tee /etc/apt/sources.list.d/rabbitmq.list
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc |
sudo apt-key add -
sudo apt-get update
sudo apt-get install rabbitmq-server
集群
可参考http://blog.csdn.net/zyz511919766/article/details/41896747
集群内用同样的erlang.cookie,哪那个主机都行。
vim /var/lib/rabbitmq/.erlang.cookie(先赋权)
配置hosts文件各个主机之间
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@VMS00781(本机用ram的模式加入到VMS00781主机,不加ram为disk模式)
rabbitmqctl start_app
rabbitmqctl cluster_status
也可在配置文件’/etc/rabbitmq/rabbitmq.config’中加入相应的配置建立集群
管理界面
rabbitmq-plugins enable rabbitmq_management
配置监听信息
[
{rabbitmq_management,[
{listener,[
{port, 15672},
{ip, "10.28.118.98"}
]}
]}
].
服务
invoke-rc.d rabbitmq-server start
invoke-rc.d rabbitmq-server status
invoke-rc.d rabbitmq-server stop
日志
less /var/log/rabbitmq/rabbit@mach1.log.1
node : rabbit@mach1
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)
cookie hash : 3T7a99w9DnFUjw6UG6bRYQ==
log : /var/log/rabbitmq/rabbit@mach1.log
sasl log : /var/log/rabbitmq/rabbit@mach1-sasl.log
database dir : /var/lib/rabbitmq/mnesia/rabbit@mach1
(s) : /etc/rabbitmq/rabbitmq.config (not found)
cookie hash : 3T7a99w9DnFUjw6UG6bRYQ==
log : /var/log/rabbitmq/rabbit@mach1.log
sasl log : /var/log/rabbitmq/rabbit@mach1-sasl.log
database dir : /var/lib/rabbitmq/mnesia/rabbit@mach1
配置
RabbitMQ环境配置文件:rabbitmq-env.conf,可通过修改环境变量RABBITMQ_CONF_ENV_FILE修改其位置
RabbitMQ配置文件:rabbitmq.config,可通过环境变量RABBITMQ_CONFIG_FILE修改其位置
配置文件例子在/usr/share/doc/rabbitmq-server/rabbitmq.config.example.gz
这两个配置文件的默认位置在:
Generic UNIX - $RABBITMQ_HOME/etc/rabbitmq/
Debian - /etc/rabbitmq/
RPM - /etc/rabbitmq/
Mac OS X (Homebrew) - ${install_prefix}/etc/rabbitmq/, the Homebrew prefix is usually /usr/local
Windows - %APPDATA%\RabbitMQ\
/etc/rabbitmq/rabbitmq.config,配置“AMQP 0-9-1”的监听接口为192.168.0.41,监听端口为5672(默认端口)
[
{rabbit, [
{tcp_listeners, [{"192.168.0.41", 5672}]}
]}
].
文档
安装:https://www.rabbitmq.com/install-debian.html
访问控制:https://www.rabbitmq.com/access-control.html
网络:https://www.rabbitmq.com/networking.html
配置:https://www.rabbitmq.com/configure.html
集群:https://www.rabbitmq.com/clustering.html
命令:https://www.rabbitmq.com/man/rabbitmqctl.1.man.html#set_user_tags
命令
查看用户:rabbitmqctl list_users
创建用户:rabbitmqctl add_user cc 076iWqx6
删除用户:rabbitmqctl delete_user cc
修改密码:rabbitmqctl change_password cc 076iWqxZ
清除密码:rabbitmqctl clear_password cc
认证用户:rabbitmqctl authenticate_user cc 076iWqxZ
设置TAG:rabbitmqctl set_user_tags cc administrator monitoring policymaker management
创建virtual host:rabbitmqctl add_vhost cc
删除virtual host:rabbitmqctl delete_vhost cc
查看virtual host:rabbitmqctl list_vhosts
设置权限:rabbitmqctl set_permissions -p cc cc ".*" ".*" ".*"(为cc用户分配虚拟主机cc的配置,写和读权限)
清除权限:rabbitmqctl clear_permissions -p cc cc
查询主机分配出去的权限:rabbitmqctl list_permissions -p cc
查询用户权限:rabbitmqctl list_user_permissions cc
镜像模式
修改成镜像模式rabbitmqctl set_policy -p cc ha-allqueue "^" '{"ha-mode":"all"}'
查看镜像规则rabbitmqctl list_policies -p cc
(下一句话有很多文章都这么说,但是我这里刚开始不设置这个值时候不会镜像,设置完一次之后,就可以镜像了,以后再次创建队列不用设置也可以了镜像)创建队列时需要指定map.put("x-ha-policy", "all"),才会触发镜像复制功能
http://chyufly.github.io/blog/2016/04/10/rabbitmq-cluster/
可靠性消息的一些记录
Disk和ram模式只是区别对于一些状态时存储在磁盘还是内存(还要查理解)
需要对exchang(duration=true),queue(duration=true)还有发送消息时候的 Delivery模式设定成PERSISTENT(spring包中默认是这个模式)
创建队列时需要指定map.put("x-ha-policy", "all"),才会触发镜像复制规则(要设定镜像复制规则)
管理界面访问
http://ip:15672
配置haproxy
apt-get install haproxy
vi /etc/haproxy/haproxy.cfg
添加下部分,其中红色为本次设定,其他配置为默认
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
contimeout 5000
clitimeout 50000
srvtimeout 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
listen rabbitmq_local_cluster
bind 192.168.0.63:5673
mode tcp
option tcplog
balance roundrobin
server rabbit1 192.168.0.61:5672 check inter 5000 rise 2 fall 2 weight 1
server rabbit3 192.168.0.63:5672 check inter 5000 rise 2 fall 2 weight 2
listen private_monitoring
bind 192.168.0.63:8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 30s
stats auth admin:1234
启动
haproxy -f /etc/haproxy/haproxy.cfg
重启动
service haproxy restart
如何选择RabbitMQ的消息保存方式
RabbitMQ对于queue中的message的保存方式有两种方式:disc和ram。如果采用disc,则需要对 exchange/queue/delivery mode都要设置成durable模式。Disc方式的好处是当RabbitMQ失效了,message仍然可以在重启之后恢复。而使用ram方 式,RabbitMQ处理message的效率要高很多,ram和disc两种方式的效率比大概是3:1。所以如果在有其它HA手段保障的情况下,选用 ram方式是可以提高消息队列的工作效率的。
如果使用ram方式,RabbitMQ能够承载的访问量则取决于可用的内存数了。RabbitMQ使用两个参数来限制使用系统的内存,避免系统被自己独占。
Disk和ram节点
Disk会将数据存储在内存和磁盘中,ram只会存在内存中。当客户端设置exchang、queue、delivery mode都为持久化方式时候,disk节点会将信息写到磁盘,ram不会。
编程注意:
rabbitmq的编程注意:要使消息持久化保存,不仅要将集群设置有disk节点。还要在编程时候,定义exchang、queue时候将duration(持久化)参数设置为true,要将delivery mode(消息分发机制)设置为持久化方式。我看了下咱们程序cc-mq-exchang都设置成持久化了,消息分发机制,spring默认设置为持久化方式。如果有其他地方使用rabbitmq对列,注意上边这些设置
其他关键点知识:
集群中至少有一个disk node,否则无法启动。
为用户赋权:
1. $sudo rabbitmqctl set_permissions -p /vhost1 user_admin '.*' '.*' '.*'
该命令使用户user_admin具有/vhost1这个virtual host中所有资源的配置、写、读权限以
https://my.oschina.net/OpenSourceBO/blog?catalog=3271990&temp=1483332412199
声明队列的方式,发布到空的exchange中,producer传送值会存储在队列中,直到有人来这个队列中获取
声明交换机和路由值(routekey),producer传送消息到exchange,如果没有匹配的queue,则丢弃这条消息,有则发送到对应的queue中。Consume自己定义一个queue,然后即使consume断开连接,该队列不会消失。实现了数据的持久化,不丢失
“channel.queueDeclare().getQueue();”这种方式获取的默认队列consume断开连接队列就消失了
发送到指定队列
指明消息队列名字(routekey),用默认exchange(“”)
如果有多个consume监听,则循环依次分发
消息持久化:持久化是针对重启mqserver,数据还存在
boolean durable = true;
channel.queueDeclare("task_queue", durable, false, false, null);
可以指定公平分发如下:
int prefetchCount = 1;
channel.basicQos(prefetchCount);
同一时间点只能处理一个消息,当轮询带这个consume时候,如果里边存在,则轮询下一个
Fanout
发送消息给当前exchange中所有的consume,即使设定了routekey,也发送到所有
Direct
发送信息到指定exchange,通过routekey查找匹配的queue,一条消息匹配多少queue就发送到多少个queue中
Topic
发送信息到指定exchange,通过routekey查找匹配的queue,一条消息匹配多少queue就发送到多少个queue中。这个类型和direct相似,只不过在consume端可以通过“#”(匹配全部)“*”(匹配一个单词)
Headers
Map<String, Object>做key去匹配
Consume端可以设置规则all或者any来匹配map
Consume端接收到消息不发送异常时,是一直处在unack状态的
Publisher的消息确认机制
channel.basicPublish方法传送的以下这些参数:
首先要区别AMQP协议mandatory和immediate标志位的作用。
mandatory和immediate是AMQP协议中basic.pulish方法中的两个标志位,它们都有当消息传递过程中不可达目的地时将消息返回给生产者的功能。具体区别在于:
1. mandatory标志位
当mandatory标志位设置为true时,如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,那么会调用basic.return方法将消息返还给生产者;当mandatory设为false时,出现上述情形broker会直接将消息扔掉。
2. immediate标志位
当immediate标志位设置为true时,如果exchange在将消息route到queue(s)时发现对应的queue上没有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的所有queue(一个或多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。
集群
当组件rabbitmq集群时,队列信息及队里中的信息数量会显示在各个client端,但是如果请求一个client中数据,但是这个数据在另一个client中,则会去另一个client中去拉取数据
镜像
镜像是rabbitmq自带的功能,执行一条命令就会设置一个队列消息转发的规则(rabbitmqctl set_policy -p / ha-allqueue "^" '{"ha-mode":"all"}'),这种情况下信息是存储在多个client中的
Haproxy可以对rabbitmq集群做负载均衡
Linux主机上修改配置
主要针对两项“打开文件数量”参数:
1.OS kernel allows (fs.file-max)--系统级别
/proc/sys/fs/file-max
上述设置只是针对proc文件系统,相当于修改了操作系统的运行时参数,重启后失效。要想永久生效,需要修改/etc/sysctl.conf文件,加入配置项fs.file-max=10240。
2.per-user limit (ulimit -n)--用户级别
修改/etc/security/limits.conf,重新登录生效
例如:
1 2 | user soft nofile 10240 user hard nofile 10240 |
建议生产环境将值设置为65535
注意:
若rabbitmq-server第一次启动后hostname不能被解析或者发生了更改则会导致启动失败
需执行如下操作
sudo rm -rf /var/lib/rabbitmq/mnesia(因为相关信息会记录在此数据库)
重装RabbitMQ Server