zoukankan      html  css  js  c++  java
  • RabbitMQ集群安装

    RabbitMQ安装

    集群准备工作

    现在有两台服务器:192.168.10.100,192.168.10.101

    //进入到100服务器中
    //查看hostname,或者使用hostname node1修改主机名
    hostname
    //配置hosts
    vi /etc/hosts 
    //修改如下
    192.168.10.100 homename1
    192.168.10.101 homename2
    //在101服务器中同样配置就OK了
    //注意:homename1是当前主机名哦!
    

    如果不设置主机名,那么就查看主机名是什么,在hosts里面配置上就OK了。

    linux安装

    RabbitMQ 基于Erlang实现的,所以在安装rabbitmq之前需要先安装erlang,安装的时候需要注意erlang的版本号与rabbitmq的版本号。
    安装注意:erlang版本号需要兼顾rabbitmq版本。版本不对,是无法启动rabbitmq的。
    官网版本对应表:http://www.rabbitmq.com/which-erlang.html

    //先安装erlang,如果不先安装erlang是无法安装rabbitmq的
    [root@xiaobao ~]# yum install http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el6.x86_64.rpm
    
    //安装rabbitmq
    [root@xiaobao ~]# yum install http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/rabbitmq-server-3.6.12-1.el6.noarch.rpm
    

    通过rpm文件安装的文件,直接就可以运行了, 无需配置环境变量之类的。如果是下载源码安装需要手动配置。

    运行

    //后台启动,如果不加-detached为直接启动,加了等于后台启动
    rabbitmq-server -detached
    
    //查看状态。
    rabbitmqctl status
    

    通过yum直接安装后,刚开始找不到安装的文件,以及配置文件,怎么办?
    上面不是启动了吗,然后根据启动的进程来看ps -ef|grep rabbit 就能看到安装目录,以及配置文件的目录了。

    插件管理

    //启用插件
    [root@xiaobao ~]# rabbitmq-plugins  enable plugins_name
    
    //停用插件
    [root@xiaobao ~]# rabbitmq-plugins disable plugins_name
    
    //查看插件列表
    [root@xiaobao ~]# rabbitmq-plugins list
    

    管理监控插件

    [root@xiaobao ~]# rabbitmq-plugins enable rabbitmq_management
    

    开始访问你的rabbitmq了。http://localhost:15672
    5672是rabbitmq的默认端口,15672是后台管理的端口。
    连接mq是使用IP 端口为5672.

    配置文件

    一般配置文件在/usr/local/etc/rabbitmq/rabbitmq-env.conf或者/etc/rabbitmq/rabbitmq-env.conf
    实在找不到,那就自己搜索呗。

    在配置文件里面可以修改端口各种参数之类的。

    //修改端口
    RABBITMQ_NODE_PORT=5672
    
    1. RABBITMQ_MNESIA_BASE
      默认指向 /var/lib/rabbitmq/mnesia ,更改该环境变量可以使您存放 Mnesia 数据库文件到希望的位置。

    2. RABBITMQ_LOG_BASE
      默认指向 /var/log/rabbitmq ,server 产生的 log 文件将存放于该目录。

    3. RABBITMQ_NODENAME
      默认指向 rabbit,当你打算在单台物理机上运行多于 1 个 node 时该环境变量有用 - RABBITMQ_NODENAME 在每一个 erlang-node-and-machine 搭配中应该是唯一的。 参见 clustering on a single machine 中的具体说明。

    4. RABBITMQ_NODE_IP_ADDRESS
      默认情况 RabbitMQ 将绑定到全部 interface (IPv4 和 IPv6,如果存在的话) 上。通过设置该环境变量可以让您只绑定到一个网络 interface 或者 address family 上。

    5. RABBITMQ_NODE_PORT
      默认为 5672。

    建议查看官网配置http://www.rabbitmq.com/configure.html
    注意mq有两个配置文件一个rabbitmq.conf参数变量配置 ,rabbitmq-env.conf全局环境变量配置。具体没怎么用过,我就用的后面这个配置一下端口啊,日志输出路径啊,rabbitmq的名称之类的。

    用户管理

    guest无法远程登录的问题

    由于mq为了安全起见,guest只能在本地登录,是无法远程登录的。不过可以在配置文件里面修改,自己网上找。
    最好的方法是添加一个新用户,这样是最安全,最保险的,看下面的用户管理。

    添加用户

    //添加用户
    rabbitmqctl add_user userName Password
    //给用户添加权限:userName为用户名, Tag为角色名(对应于administrator,monitoring,policymaker,management,或其他自定义名称)。
    rabbitmqctl set_user_tags userName tags
    
    //设置用户的接管队列的权限,这一步可以登陆后台管理页面Admin-Users-点击用户名,然后设置。
    //如果不设置这一步,是无法看到队列的,因为创建的队列默认在guest名下。
    rabbitmqctl set_permissions -p "/" userName ".*" ".*" ".*"
    

    关于角色的描述:
    用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。

    1. 超级管理员(administrator):可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
    2. 监控者(monitoring) 可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
    3. 策略制定者(policymaker) 可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
    4. 普通管理者(management) 仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

    修改密码

    //修改用户密码
    rabbitmqctl change_password username newpassword
    
    列出所有用户 
    rabbitmqctl list_users 
    

    权限控制

    1.创建虚拟主机 
    
    rabbitmqctl add_vhost vhostpath 
    
    2.删除虚拟主机 
    
    rabbitmqctl delete_vhost vhostpath 
    
    3.列出所有虚拟主机 
    
    rabbitmqctl list_vhosts 
    
    4.设置用户权限 
    
    rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp 
    
    5.清除用户权限 
    
    rabbitmqctl clear_permissions [-p vhostpath] username 
    
    6.列出虚拟主机上的所有权限 
    
    rabbitmqctl list_permissions [-p vhostpath] 
    
    7.列出用户权限 
    
    rabbitmqctl list_user_permissions username
    

    集群配置

    第一步:pc:192.168.10.100 节点一,直接启动rabbitmq-server -detached 就完了,其他不用操作什么。

    第二步:pc:192.168.10.101 节点二,暂时不用启动,配置步骤如下:

    1.找到.erlang.cookie的目录
    Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie

    //官网中有说明,要么在用户根目录下:
    /Users/xiaobao/.erlang.cookie
    //或者在/var/lib/rabbitmq目录下
    /var/lib/rabbitmq/.erlang.cookie
    

    2.在节点2中修改.erlang.cookie的权限:

    //
    chmod 777 /var/lib/rabbitmq/.erlang.cookie
    
    //将节点1中的.erlang.cookie这个里面的值拷贝到节点2里面来,直接替换节点2里面的值就可以了。为了节点1,2的cooki保持一致。
    vi /var/lib/rabbitmq/.erlang.cookie
    
    //修改完成后,还原权限,默认是400,如果不还原,启动mq时会报错,直接启动不起来。
    chmod 400 /var/lib/rabbitmq/.erlang.cookie
    

    3.启动节点二rabbitmq-server -detached。

    4.以节点一作为主节点,节点二中配置如下:

    //这里stop_app停止应用,而不是停止服务。
    [root@xiaobao ~]# rabbitmqctl  stop_app
    
    //重置rabbitmq
    [root@xiaobao ~]# rabbitmqctl reset
    
    //将rabbit@homename1服务器加入到集群中
    [root@xiaobao ~]# rabbitmqctl  join_cluster rabbit@homename1
    
    //或者这样配置
    //[root@xiaobao ~]# rabbitmqctl  join_cluster rabbit@homename1 -arm //这种就是告诉,他使用内存模式。默认是磁盘模式
    
    //重启应用
    [root@xiaobao ~]# rabbitmqctl  start_app
    
    //查看集群状态
    [root@xiaobao ~]# rabbitmqctl cluster_status
    

    现在到控制台查看会看到有2个节点哦。

    磁盘与内存模式说明

    rabbitmq存储消息有两种模式,一种是磁盘模式,一种是内存模式。听名字就知道,磁盘模式就是把消息存储到磁盘中,可以达到持久化的目标;内存模式就是把消息存储到内存中,读存速度上要快很多,但是一旦服务器重启就会有可能导致没有消费的消息丢失。

    了解了两种模式后,我们知道,单机的情况基本使用的是磁盘模式,这样安全性更高。当两台做集群时,就可以一台磁盘模式,一台内存模式了。这样既可以做到保存消息持久化,另外一台速度也有保障。

    [root@xiaobao ~]# rabbitmqctl join_cluster rabbit@homename1 -arm
    

    在搭建集群时在后面加入-arm模式,即为内存模式,如果不加,默认为磁盘模式。

    单机集群配置

    由于rabbitMq是服务,而不是容器,所以在同一台服务上启动多个时,不需要像tomcat一样,需要拷贝多个tomcat安装文件出来。对于服务来说,我们只需要改变端口就可以启动多个服务。
    所以单机集群就很简单了,只需要改变端口就好了。

    单机集群部署1

    //启动两个服务
    [root@xiaobao ~]# RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1@localhost rabbitmq-server -detached
    [root@xiaobao ~]# RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit2@localhost rabbitmq-server -detached
    
    //与rabbit1为主节点,在rabbit2中配置如下:
    [root@xiaobao ~]# rabbitmqctl -n rabbit2 stop_app
    [root@xiaobao ~]# rabbitmqctl -n rabbit2 join_cluster rabbit@localhost
    [root@xiaobao ~]# rabbitmqctl -n rabbit2 start_app
    

    这样就配置完成了。

    单机集群部署2

    如果你开启了rabbitMQ后台管理,可以需要修改一下端口。如下

    //bww为我的主机名
    
    //启动rabbit1节点
    [root@xiaobao ~]# RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit1@bww rabbitmq-server –detached
    
    //启动rabbit2节点
    [root@xiaobao ~]# RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2@bww rabbitmq-server -detached
    
    [root@xiaobao ~]# rabbitmqctl -n rabbit2 stop_app
    [root@xiaobao ~]# rabbitmqctl -n rabbit2 join_cluster rabbit@bww
    [root@xiaobao ~]# rabbitmqctl -n rabbit2 start_app
    

    启动报错,但是不知道错在哪里的时候,直接使用rabbitmq-server启动即可,不要使用rabbitmq-server -detached。

    有时候插件比较多,插件监听的端口也会导致冲突,怎么解决呢,要么先关闭插件,或者找到插件监听的端口,单独设置。
    如:

    [root@xiaobao ~]# RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}] -rabbitmq_stomp tcp_listeners [61614] -rabbitmq_mqtt  tcp_listeners [1884]" RABBITMQ_NODENAME=rabbit2@hostname  rabbitmq-server -detached
    

    实际操作过程中遇到的坑

    • RABBITMQ_NODE_PORT=5672,RABBITMQ_NODE_PORT与=号之间不能有空格。如果有空格就表示RABBITMQ_NODE_PORT =5672,RABBITMQ_NODE_PORT变成了一个命令,系统会提示,没有这个命令RABBITMQ_NODE_PORT。由于rabbitmq使用的是erlang语言编写的,所以传递参数和我们平常的不太一样,他是从后面传递参数的.
    • 我们平时传递参数应该是这样的:[root@xiaobao ~]# zk-server post=50 name=3222 命令在前,参数在后。

    在mq有一个配置文件在/usr/local/etc/rabbitmq/rabbitmq-env.conf
    在配置文件里面我配置了如下:

    CONFIG_FILE=/usr/local/etc/rabbitmq/rabbitmq
    NODE_IP_ADDRESS=127.0.0.1
    NODENAME=rabbit@localhost
    RABBITMQ_NODE_PORT=5672
    RABBITMQ_DIST_PORT=25673
    

    这里单机没问题,但是单机集群就把我坑死了,因为在上面启动中,这个属于环境变量配置文件,里面的参数会覆盖我们上面写的RABBITMQ_NODE_PORT=5673,所以导致在启动时RABBITMQ_NODE_PORT=5673这里配置了一直不起作用,提示我端口冲突,端口冲突,差一点崩溃了。

    单机集群要需要配置hosts

    vi /etc/hosts
    127.0.0.1 bww //自己的主机名
    

    集群之镜像模式

    上面搭建起来了,集群已经好了,但是,,但是,不是完整的集群模式。它只是rabbitmq的普通模式

    RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。

    • 普通模式:默认的集群模式,以两个节点(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高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
      普通模式说明:队列只能存在某个节点下,node1或者node2中,在创建节点时就决定了在某个节点下。
      p1–> node1—> node2 –>c1;//队列q在node1中,p生产者连接了node1,往队列q里面发送消息,c消费者连接了node2,接收q队列消息,他们通信是node1发送给node2,node2再发送给c消费着的。
      node1挂了,p1连接node2,c1也连接node2。由于队列q是在node1中的, 此时p1,发送消息失败,提示没有该队列。
      p1–> node1—> c2; //p,c都连接了node1,他们消息直接由node1发送就OK了。
      p1–> node2—> c2;

    镜像模式

    镜像模式配置非常简单,首先镜像模式是基于普通集群模式的,所以前面搭建的集群就是普通模式集群了。在搭建好的集群模式下,进入任意一台mq管理后台。
    http://ip:15672.点击Admin–> policies 选线,然后添加prolicy就可以了。

    添加prolicy参数说明如下:

    rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
    
    -p Vhost: 可选参数,针对指定vhost下的queue进行设置
    Name: policy的名字,随便自定义。
    Pattern: queue的匹配模式(正则表达式)
    Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
        ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
            all:表示在集群中所有的节点上进行镜像
            exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
            nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
        ha-params:ha-mode模式需要用到的参数
        ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
    priority:可选参数,policy的优先级,值越大,优先级越高
    
    特别说明:如果ha-mode指定为exactly,exactly个数,将在ha-params中设置。如果ha-mode指定为all,则ha-params不需要填写。
    

    例如:rabbitmqctl set_policy -p vhostName allName “^message” ‘{“ha-mode”:”all”}’ 10

    • “^message” :表示”message”开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为”^”
    • vhostName :表示虚拟host的名字,后台可以选择。
    • allName :表示名字,自定义的,随便
    • ‘{“ha-mode”:”all”}’ 应用到所有节点上。
      综合起来解释就是说:将message开头的队列名称,使用镜像模式,拷贝到所有节点。如:现在有一个hello-message的队列,mq服务器有node1,node2,node3.创建的时候hello-message在node1节点上面,然后我们创建了一个prolicy规则,所以hello-message就会被使用镜像模式把数据也一起拷贝到node2,node3节点上面(普通模式只拷贝队列的结构,不拷贝数据)。

    参考文档

    http://www.rabbitmq.com/clustering.html 官网集群搭建地址
    https://www.linuxidc.com/Linux/2016-12/137812.htm
    https://www.linuxidc.com/Linux/2017-09/147030.htm
    https://blog.csdn.net/woogeyu/article/details/51119101
    https://blog.csdn.net/zhu_tianwei/article/details/40936723
    https://blog.csdn.net/u013256816/article/details/71097186 镜像模式的原理说明

    ————————————————
    版权声明:本文为CSDN博主「piaoslowly」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/piaoslowly/article/details/81625335

  • 相关阅读:
    winform最大化后不遮挡任务栏
    TabControl控件重绘
    EXT gridPanel 添加图片
    好记性不如烂笔头——double
    好记性不如烂笔头——datagridview相关
    datagridview合并相同单元格
    datagridview问题
    Linux折腾记
    TSC打印机使用教程终极版
    在线直播流测试地址
  • 原文地址:https://www.cnblogs.com/yhongyin/p/12038760.html
Copyright © 2011-2022 走看看