zoukankan      html  css  js  c++  java
  • rabbitmq集群-2

    rabbitmq集群

    原文地址:https://www.cnblogs.com/lion.net/p/5725474.html

    rabbitmq集群介绍

    rabbitmq有3种模式,但集群模式是2种。详细如下:
    
    单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。
    普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。
    对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。
    当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,
    把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。
    即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
    当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;
    如果没有持久化的话,就会产生消息丢失的现象。
    镜像模式:把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案。
    该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。
    该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。
    所以在对可靠性要求较高的场合中适用。

    安装环境

    192.168.0.31 node1
    192.168.0.32 node2
    192.168.0.33 node3

    安装rabbitmq

    3个节点都安装rabbitmq
    
    安装请参考:http://www.cnblogs.com/hanxiaohui/p/8822443.html

    设置 Erlang Cookie

    RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。
    当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。
    如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie 1. rabbitmq-server -detached #首先启动Node1上的rabbitmq 2. 在家目录下产生.erlang.cookie 文件,权限400 3. 复制.erlang.cookie 文件到node2,node3 4.最后分别在确认三台机器上的.erlang.cookie的值是一致的. #cat .erlang.cookie 内容要一致

    使用detached参数,在后台启动Rabbit Node

    3个节点都需要操作
    
    rabbitmqctl stop  #关闭
    rabbitmq-server -detached  #启动
    
    node1:
    lion@node1:~$ rabbitmqctl cluster_status
    Cluster status of node rabbit@node1 ...
    [{nodes,[{disc,[rabbit@node1]}]},
     {running_nodes,[rabbit@node1]},
     {cluster_name,<<"rabbit@node1">>},
     {partitions,[]},
     {alarms,[{rabbit@node1,[]}]}]
    
    
    node2:
    lion@node2:~$ rabbitmqctl cluster_status
    Cluster status of node rabbit@node2 ...
    [{nodes,[{disc,[rabbit@node2]}]},
     {running_nodes,[rabbit@node2]},
     {cluster_name,<<"rabbit@node2">>},
     {partitions,[]},
     {alarms,[{rabbit@node2,[]}]}]
    
    
    node3:
    lion@node3:~$ rabbitmqctl cluster_status
    Cluster status of node rabbit@node3 ...
    [{nodes,[{disc,[rabbit@node3]}]},
     {running_nodes,[rabbit@node3]},
     {cluster_name,<<"rabbit@node3">>},
     {partitions,[]},
     {alarms,[{rabbit@node3,[]}]}]

     将node1、node2、node3组成集群

    因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。
    要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。
    如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。 node2: lion@node2:~$ rabbitmqctl stop_app Stopping node rabbit@node2 ... lion@node2:~$ rabbitmqctl join_cluster rabbit@node1 Clustering node rabbit@node2 with rabbit@node1 ... lion@node2:~$ rabbitmqctl start_app Starting node rabbit@node2 ... node3: lion@node3:~$ rabbitmqctl stop_app Stopping node rabbit@node3 ... lion@node3:~$ rabbitmqctl join_cluster rabbit@node1 Clustering node rabbit@node3 with rabbit@node1 ... lion@node3:~$ rabbitmqctl start_app Starting node rabbit@node3 ... 此时 node2 与 node3 也会自动建立连接。 如果要使用内存节点,则可以使用以下命令: lion@node2:~$ rabbitmqctl join_cluster --ram rabbit@node1 集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。 lion@node1:~$ rabbitmqctl cluster_status Cluster status of node rabbit@node1 ... [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]}, {running_nodes,[rabbit@node1]}, {cluster_name,<<"rabbit@node1">>}, {partitions,[]}, {alarms,[{rabbit@node1,[]}]}]

    修改节点存储类型

    集群中必须存活一个磁盘节点
    ./rabbitmqctl stop_app
    ./rabbitmqctl change_cluster_node_type {ram|disk}
    ./rabbitmqctl start_app

    将xxx节点踢除集群

    ./rabbitmqctl forget_cluster_node rabbit@xxx

    RabbitMQ镜像功能

    使用Rabbit镜像功能,需要基于RabbitMQ策略来实现,策略是用来控制和修改群集范围的某个vhost队列行为和Exchange行为
    
    lion@node2:~$ rabbitmqctl set_policy -p test ha-allqueue "^" '{"ha-mode":"all"}'   
    #这行命令,在vhost名称为test创建了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 “^” 表示所有匹配所有队列名称。 例如下面的命令,^message 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为"^"。 lion@node2:~$ rabbitmqctl set_policy -p test ha-allqueue "^message" '{"ha-mode":"all"}' 更多set_policy说明:http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

     安装软件负载均衡器HAProxy

    通过软件负载均衡器haproxy实现分发(通过7562端口)
    https://www.cnblogs.com/lion.net/p/5725474.html

     rabbitmq集群验证

    1)
    #随意一台操作
    
    
    
    #添加用户test 密码为test
    rabbitmqctl  add_user  test  test
    #设置test用户为administrator
    rabbitmqctl set_user_tags test administrator
    
    #添加vhost 名为test
    rabbitmqctl add_vhost test
    #设置test用户对 test vhost的所有权限  -p 后的第一个test为vhost名 第二个test为用户名
    rabbitmqctl set_permissions -p test test '.*' '.*' '.*'

    #添加镜像策略(同步消息到其它节点,消息持久化)
    rabbitmqctl  set_policy -p test ha-allqueue "^" '{"ha-mode":"all"}'
    #在vhost test中添加一个队列,名为test   durable=truerabbitmq重启队列还在,即对队列做持久化】
    rabbitmqadmin --vhost=test --username=test --password=test  declare queue name=test durable=true
    
    #往队列里添加一条消息
    rabbitmqadmin --vhost=test --username=test --password=test publish routing_key=test payload="this is a testing" 
    
    #查看队列情况
    rabbitmqadmin --vhost=test --username=test --password=test list queues
    
    
    #从test queue消费一条信息
    rabbitmqadmin --vhost=test --username=test --password=test get queue=test requeue=true   #requeue=true 这条消息消费后还在,反之如果为false消费后消息就不在了。
    
    
    2)
    停掉rabbitmq1,在另外两台查看队列情况,可以看到test队列还是存在,获取队列的消息也是可以获取到的。
    再重新开启rabbitmq1 可以看到test队列还是存在,获取队列的消息也是可以获取到的.
  • 相关阅读:
    json
    用data的方法获取值的时候,要注意的问题一定要在先封装好
    勾选框图片代替,两张图片进行切换
    Google统计
    1,全局变量;2,图形验证码;3,解决bug的毅力
    怎么快速写好看的手机menu菜单
    用css、如何让图片自动适应屏幕大小,不出现滚动条,不变形,兼容各个浏览器?急!!!
    怎么安装mybatis以及快速生成xml文件
    mysql连接数据库时报2003错误怎么解决
    屏幕的遮挡层,js得到屏幕宽高、页面宽高 (window.screen.availHeight)等--
  • 原文地址:https://www.cnblogs.com/hanxiaohui/p/8853387.html
Copyright © 2011-2022 走看看