zoukankan      html  css  js  c++  java
  • rabbitmq集群部署及配置

    消息中间件rabbitmq,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步。本篇将以rabbitmq+HA方式进行部署。

    一、原理介绍

    rabbitmq是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的,所以部署rabbitmq分布式集群时要先安装erlang,并把其中一个服务的cookie复制到另外的节点。

    rabbitmq集群中,各个rabbitmq为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般的,均应建立为磁盘节点,为了防止机器重启后的消息消失;

    RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过rabbitmq HA镜像队列进行消息队列实体复制。

    普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。

    镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

    二、部署方案

    本方案中是在多台机器之间部署rabbitmq的cluster,要求如下:这几个节点需要再同一个局域网内;这几个节点需要有相同的erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。

    1、环境介绍

    rabbitmq01 192.168.101.11  

    rabbitmq02 192.168.101.12 

    rabbitmq03 192.168.101.13

    操作系统:centos6.7

    2、部署过程

    (1)分别在3台机器上配置/etc/hosts,如下

    node1 192.168.101.11  

    node2 192.168.101.12 

    node3 192.168.101.13

    (2)分别在3台机器上安装erLang和rabbitmq

    安装erlang

    安装依赖包

    yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
    编译安装
    tar -zxvf otp_src_19.0.tar.gz
    cd otp_src_19.0
    ./configure --prefix=/usr/local/bin/erlang --without-javac
    make && make install
    echo "export PATH=$PATH:/usr/local/bin/erlang/bin:/usr/local/bin/rabbitmq_server-3.6.5/sbin" >> /etc/profile
    source /etc/profile
    出现erl命令则说明安装成功;
    安装rabbitmq

    编译安装

    wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-generic-unix-3.6.5.tar.xz
    yum install -y xz
    xz -d rabbitmq-server-3.6.3.tar.xz
    tar -xvf rabbitmq-server-generic-unix-3.6.5.tar -C /usr/local/bin/
    echo "export PATH=$PATH:/usr/local/bin/erlang/bin:/usr/local/bin/rabbitmq_server-3.6.5/sbin" >> /etc/profile
    source /etc/profile
    导入rabbitmq的管理界面
    rabbitmq-plugins enable rabbitmq_management
    设置erlang
    找到erlang cookie文件的位置,官方在介绍集群的文档中提到过.erlang.cookie一般会存在这两个地址:第一个是$home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在${home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。

    这里将 node1 的该文件复制到 node2、node3,注意这个文件的权限是 400(默认即是400),因此采用scp的方式只拷贝内容即可;

    可以通过cat  $home/.erlang.cookie来查看三台机器的cookie是否一致,设置erlang的目的是要保证集群内的cookie内容一致。

    使用-detached参数运行各节点

    rabbitmqctl stop
    rabbitmq-server -detached
    然后可以通过rabbitmqctl cluster_status查看节点状态。PS:要先拷贝cookie到另外两台机器上,保证三台机器上的cookie是一致的,然后再启动服务。

    由于guest这个用户,只能在本地访问,所以我们要新增一个用户并赋予权限:

    添加用户并设置密码:

    rabbitmqctl add_user admin 123456
    添加权限(使admin用户对虚拟主机“/” 具有所有权限):
    rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
    修改用户角色(加入administrator用户组)
    rabbitmqctl set_user_tags admin administrator
    然后就可以远程访问了,然后可直接配置用户权限等信息。到此,就可以通过http://ip:15672 使用admin 123456 进行登陆了。

    到这里的话,每个节点是作为单独的一台RabbitMQ存在的,也可以正常提供服务了
    (3)组成集群

    rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。

    将 node2、node3与 node1 组成集群,这里以node2为例

    node2# rabbitmqctl stop_app     

    node2# rabbitmqctl join_cluster rabbit@node1               ####这里集群的名字一定不要写错了

    node2# rabbitmqctl start_app

    将node3重复上述操作,也加入node1的集群。

    则此时 node2 与 node3 也会自动建立连接,集群配置完毕;(PS:如果要使用内存节点,则可以使用node2 # rabbitmqctl join_cluster --ram rabbit@node1加入集群)集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。

    node3# rabbitmqctl cluster_status

    Cluster status of node rabbit@node3 ...
    [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
     {running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]},
     {cluster_name,<<"rabbit@node1">>},
     {partitions,[]},
     {alarms,[{rabbit@node1,[]},{rabbit@node2,[]},{rabbit@node3,[]}]}]
    可知,集群的名称默认为rabbit@node1;

    PS:另外一种查看集群是否成功的方式,在web页面上的“Queues”的列表中,查看有如下显示为“同步镜像到node2”,则也表示集群配置成功

    (4)设置镜像队列策略

    在任意一个节点上执行如下操作(这里在node1上执行)

    首先,在web界面,登陆后,点击“Admin--Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);

    然后,在linux中执行如下命令

    rabbitmqctl set_policy -p coresystem ha-all "^" '{"ha-mode":"all"}'
    "coresystem" vhost名称, "^"匹配所有的队列, ha-all 策略名称为ha-all, '{"ha-mode":"all"}' 策略模式为 all 即复制到所有节点,包含新增节点。

    则此时镜像队列设置成功。(这里的虚拟主机coresystem是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息的隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)。

    --------------------------------------------#########################--------------------------------------------------------------------------------------------------

    PS:这里补充一些对于设置镜像队列策略的说明

    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的优先级
    ------------------------------------------------########################-----------------------------------------------------------------------------------------------------
    将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。完成这 6 个步骤后,RabbitMQ 高可用集群就已经搭建好了,最后一个步骤就是搭建均衡器。

    (5)安装并配置HA

    PS:可以使用阿里云的内网slb来实现负载均衡,不用自己搭建HA。这里仅演示如下:

    在192.168.101.11上yum安装HAProxy(yum -y install HAProxy),然后修改 /etc/haproxy/haproxy.cfg:

    global

    log 127.0.0.1 local2

    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    maxconn 4000
    user haproxy
    group haproxy
    daemon

    stats socket /var/lib/haproxy/stats

    defaults
    log global
    mode tcp
    option tcplog
    option dontlognull
    retries 3
    option redispatch
    maxconn 2000
    contimeout 5s
    clitimeout 120s
    srvtimeout 120s

    listen rabbitmq_cluster 192.168.101.11:5670
    mode tcp
    balance roundrobin
    server rabbit1 192.168.101.11:5672 check inter 5000 rise 2 fall 2
    server rabbit2 192.168.101.12:5672 check inter 5000 rise 2 fall 2
    server rabbit3 192.168.101.13:5672 check inter 5000 rise 2 fall 2
    listen private_monitoring :8100 mode http option httplog stats enable stats uri /rabbitmqstats stats refresh 5s
    重启HAProxy
    service haproxy restart
    登录浏览器输入地址http://192.168.101.11:8100/rabbitmqstats查看HAProxy的状态

    三、常见问题
    常见错误:

    1、使用 rabbitmq-server -detached命令启动rabbitmq时,出现以下提示Warning: PID file not written; -detached was passed,此时使用rabbitmqctl status提示服务已启动,可知此问题不用解决。

    2、由于更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就报错,提示大概如下

    Cluster status of node rabbit@web2 ...
    Error: unable to connect to node rabbit@web2: nodedown

    DIAGNOSTICS
    ===========

    attempted to contact: [rabbit@web2]

    rabbit@web2:
      * connected to epmd (port 4369) on web2
      * epmd reports node 'rabbit' running on port 25672
      * TCP connection succeeded but Erlang distribution failed

      * Hostname mismatch: node "rabbit@mq2" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@mq2"


    current node details:
    - node name: 'rabbitmq-cli-11@web2'
    - home dir: /root
    - cookie hash: SGwxMdJ3PjEXG1asIEFpBg==

    此时先ps aux | grep mq,然后kill -9 该进程,然后再rabbitmq-server -detached即可解决。(即先强杀,再重新启动)

    3、使用rabbitmqctl stop,rabbitmq-server -detached重新启动后,原先添加的用户admin、虚拟主机coresystem等均丢失,还需要重新添加。

    采用脚本启动,在脚本中写好启动好需要加载的各配置项(创建admin用户并授权,创建虚拟主机并授权,配置镜像队列)。

    3、命令

    rabbitmqctl stop_app 仅关闭应用,不关闭节点
    rabbitmqctl start_app 开启应用
    rabbitmq--server -detached 启动节点和应用
    rabbitmqctl 关闭节点和应用
    4、常用命令:

    Rabbitmq服务器的主要通过rabbitmqctl和rabbimq-plugins两个工具来管理,以下是一些常用功能。

    1). 服务器启动与关闭

    启动: rabbitmq-server –detached
    关闭:rabbitmqctl stop
    若单机有多个实例,则在rabbitmqctlh后加–n 指定名称

    2). 插件管理

    开启某个插件:rabbitmq-plugins enable xxx
    关闭某个插件:rabbitmq-plugins disable xxx
    注意:重启服务器后生效。
    3).virtual_host管理

    新建virtual_host: rabbitmqctl add_vhost xxx
    撤销virtual_host:rabbitmqctl delete_vhost xxx

    4). 用户管理

    新建用户:rabbitmqctl add_user xxxpwd
    删除用户: rabbitmqctl delete_user xxx
    查看用户:rabbitmqctl list_users
     改密码: rabbimqctlchange_password {username} {newpassword}
    设置用户角色:rabbitmqctlset_user_tags {username} {tag ...}
    Tag可以为 administrator,monitoring, management

    5). 权限管理

    权限设置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
    Vhostpath
    Vhost路径
    user
    用户名
    Conf
    一个正则表达式match哪些配置资源能够被该用户访问。
    Write
    一个正则表达式match哪些配置资源能够被该用户读。
    Read
    一个正则表达式match哪些配置资源能够被该用户访问。

    6). 获取服务器状态信息

    服务器状态:rabbitmqctl status ##其中可查看rabbitmq的版本信息
    7).获取集群状态信息

    rabbitmqctl cluster_status

  • 相关阅读:
    一个常见数据库操作错误的分析(四)
    一个常见数据库操作错误的分析(六)
    vc6 配置使用 boost 1.34.1
    string tips
    greta 编译,配置,使用
    xml学习笔记(一)
    火狐插件Firebug的使用
    浅谈编写高性能的Javascript代码 【重要】
    WebConfig加密/解密
    微软发布3款SQL Injection(SQL 注入)攻击检测工具
  • 原文地址:https://www.cnblogs.com/ExMan/p/10268883.html
Copyright © 2011-2022 走看看