rabbitmq部署使用笔记

本人在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主机,不加ramdisk模式

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

    设置TAGrabbitmqctl set_user_tags cc administrator monitoring policymaker management

    创建virtual hostrabbitmqctl add_vhost cc

    删除virtual hostrabbitmqctl delete_vhost cc

    查看virtual hostrabbitmqctl 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/

 

可靠性消息的一些记录

Diskram模式只是区别对于一些状态时存储在磁盘还是内存(还要查理解)

需要对exchang(duration=true)queue(duration=true)还有发送消息时候的 Delivery模式设定成PERSISTENTspring包中默认是这个模式)

创建队列时需要指定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只会存在内存中。当客户端设置exchangqueuedelivery mode都为持久化方式时候,disk节点会将信息写到磁盘,ram不会。

 

编程注意:

rabbitmq的编程注意:要使消息持久化保存,不仅要将集群设置有disk节点。还要在编程时候,定义exchangqueue时候将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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值