美文网首页
Ubuntu16.04搭建rabbitmq集群

Ubuntu16.04搭建rabbitmq集群

作者: 小手冰冰凉啊 | 来源:发表于2018-12-13 15:18 被阅读0次

    1、RabbitMQ介绍

    1.1、什么是RabbitMQ?

    RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成,因此也是继承了这些优点。

    1.2、什么是AMQP?

    AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。它从生产者接收消息并递送给消费者,在这个过程中,根据规则进行路由,缓存与持久化。

    AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    1.3、RabbitMQ的基础概念

    • Broker:简单来说就是消息队列服务器实体
    • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列
    • Queue:消息队列载体,每个消息都会被投入到一个或多个队列
    • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来
    • Routing Key:路由关键字,exchange根据这个关键字进行消息投递
    • vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离
    • producer:消息生产者,就是投递消息的程序
    • consumer:消息消费者,就是接受消息的程序
    • channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务

    1.4、RabbitMQ的特性

    • 可靠性:包括消息持久化,消费者和生产者的消息确认
    • 灵活路由:遵循AMQP协议,支持多种Exchange类型实现不同路由策略
    • 分布式:集群的支持,包括本地网络与远程网络
    • 高可用性:支持主从备份与镜像队列
    • 多语言支持:支持多语言的客户端
    • WEB界面管理:可以管理用户权限,exhange,queue,binding,与实时监控
    • 访问控制:基于vhosts实现访问控制
    • 调试追踪:支持tracing,方便调试

    2、RabbitMQ安装

    2.1、环境:两台Ubuntu16.04主机
    10.27.0.53 rabbitmq-1
    10.27.0.130 rabbitmq-2

    root@rabbitmq-1:/usr/sbin# cat /etc/hosts
    10.27.0.53 rabbitmq-1
    10.27.0.130 rabbitmq-2
    
    root@rabbitmq-2:/usr/sbin# cat /etc/hosts
    10.27.0.53 rabbitmq-1
    10.27.0.130 rabbitmq-2
    

    必须保证各个主机名之间可以ping通
    2.2、安装Erlang

    root@rabbitmq-1:~# apt-get update
    root@rabbitmq-1:~# apt-get install -y erlang-nox erlang-dev erlang-src
    

    2.3、安装rabbitmq

    root@rabbitmq-1:~# echo 'deb http://www.rabbitmq.com/debian/ testing main' |  tee /etc/apt/sources.list.d/rabbitmq.list
    deb http://www.rabbitmq.com/debian/ testing main
    
    root@rabbitmq-1:~# wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | apt-key add -
    --2018-12-13 01:36:08--  https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
    Resolving www.rabbitmq.com (www.rabbitmq.com)... 104.20.63.197, 104.20.62.197, 2606:4700:10::6814:3ec5, ...
    Connecting to www.rabbitmq.com (www.rabbitmq.com)|104.20.63.197|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: unspecified [text/plain]
    Saving to: ‘STDOUT’
    -                                       [ <=>                                                                ]   3.11K  --.-KB/s    in 0s      
    2018-12-13 01:36:09 (53.9 MB/s) - written to stdout [3187]
    
    OK
    
    root@rabbitmq-1:~# apt-get install rabbitmq-server
    

    2.4、安装完成后,验证一下服务是否正常

    root@rabbitmq-1:~# service rabbitmq-server start
    
    root@rabbitmq-1:~# service rabbitmq-server status
    
    ● rabbitmq-server.service - RabbitMQ broker
     Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2018-12-13 01:39:09 UTC; 1min 11s ago
     Main PID: 11471 (beam.smp)
     Status: "Initialized"
     CGroup: /system.slice/rabbitmq-server.service
     ├─11471 /usr/lib/erlang/erts-7.3/bin/beam.smp -W w -A 64 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -K true -- -root /usr/lib/erlan
     ├─11551 /usr/lib/erlang/erts-7.3/bin/epmd -daemon
     ├─11678 inet_gethost 4
     └─11679 inet_gethost 4
    

    搭建好的rabbitmq默认是没有配置文件的,需要我们来手动添加

    root@rabbitmq-1:~# vim /etc/rabbitmq/rabbitmq.config
    
    [{rabbit, [{loopback_users, []}]}].
    
    • 这里的意思是开放使用。rabbitmq默认创建的用户guest,密码也是guest,这个用户默认只能是本机访问。需要添加上面的配置才能从外部访问。

    Rabbitmq的一些运行脚本存放在 /usr/sbin 下面

    root@rabbitmq-1:/usr/sbin# ll rabbit*
    -rwxr-xr-x 1 root root 1883 Jan 17 2018 rabbitmqctl*
    -rwxr-xr-x 1 root root 1883 Jan 17 2018 rabbitmq-plugins*
    -rwxr-xr-x 1 root root 1883 Jan 17 2018 rabbitmq-server*
    

    2.5、开启web管理插件

    2.5.1、创建一个用户nova,并设置密码为123456

    root@rabbitmq-1:/usr/sbin# ./rabbitmqctl add_user nova 123456
    
    Creating user "nova"
    

    2.5.2、查看现有用户表

    root@rabbitmq-1:/usr/sbin# ./rabbitmqctl list_users
    Listing users
    rabbit []
    guest [administrator] //默认管理员
    nova []
    

    这个时候nova用户是不能访问web管理插件的,需要配置用户角色,用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。

    • 超级管理员(administrator)

    可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

    • 监控者(monitoring)

    可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

    • 策略制定者(policymaker)

    可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息。

    • 普通管理者(management)

    仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

    • 其他

    无法登陆管理控制台,通常就是普通的生产者和消费者。

    将nova添加到administrator用户组

    root@rabbitmq-1:/usr/sbin# ./rabbitmqctl set_user_tags nova administrator
    Setting tags for user "nova" to [administrator]
    

    此时的nova用户只能通过本地来登录其他的IP无法直接使用这个账号。所以需要对他进行授权,使用户nova /(可以访问虚拟主机) 中所有资源的配置、写、读权限以便管理其中的资源

    root@rabbitmq-1:/usr/sbin# ./rabbitmqctl set_permissions -p "/" nova ".*" ".*" ".*"
    Setting permissions for user "nova" in vhost "/"
    

    查看用户授权

    root@rabbitmq-1:/usr/sbin# ./rabbitmqctl list_permissions -p /
    Listing permissions in vhost "/"
    nova .* .* .*
    guest .* .* .*
    

    2.5.3、开启web管理插件并重启rabbitmq服务

    root@rabbitmq-1:/usr/sbin# ./rabbitmq-plugins enable rabbitmq_management
    The following plugins have been enabled:
     amqp_client
     cowlib
     cowboy
     rabbitmq_web_dispatch
     rabbitmq_management_agent
     rabbitmq_management
    Applying plugin configuration to rabbit@rabbitmq-1... started 6 plugins.
    
    root@rabbitmq-1:/usr/sbin# service rabbitmq-server restart
    

    以下为关闭插件命令

    root@rabbitmq-1:/usr/sbin# ./rabbitmq-plugins disable rabbitmq_management
    

    通过浏览器访问 [http://10.27.0.53:15672]输入用户名nova 密码123456就可以看到后台了


    111.png

    3、配置集群

    3.1、从管理界面可以看到,此时只有一个节点rabbitmq-1,我们需要把rabbitmq-2加进来,rabbitmq-2按照步骤2进行一系列安装就可以。此处不再细说。


    222.png

    3.2、添加节点
    两台主机上安装的 RabbitMQ 都保证都可以正常启动,才可以进行以下操作
    3.2.1、设置不同节点间统一认证的Erlang Cookie
    这里将 rabbitmq-1 的该文件复制到 rabbitmq-2由于这个文件权限是 400为方便传输,先修改权限,非必须操作,所以需要先修改rabbitmq-2中的该文件权限为 777

    root@rabbitmq-2:~# chmod 777 /var/lib/rabbitmq/.erlang.cookie
    

    然后将rabbitmq-1中的该文件拷贝的rabbitmq-2中

    root@rabbitmq-1:/var/lib/rabbitmq# scp /var/lib/rabbitmq/.erlang.cookie rabbitmq-2:/var/lib/rabbitmq/
    

    最后将权限和所属用户/组修改回来

    root@rabbitmq-2:~# chmod 400 /var/lib/rabbitmq/.erlang.cookie
    root@rabbitmq-2:~# chown rabbitmq /var/lib/rabbitmq/.erlang.cookie
    root@rabbitmq-2:~# chgrp rabbitmq /var/lib/rabbitmq/.erlang.cookie
    root@rabbitmq-2:~# ll /var/lib/rabbitmq/.erlang.cookie
    -r-------- 1 rabbitmq rabbitmq 20 Dec 13 05:37 /var/lib/rabbitmq/.erlang.cookie
    

    此时rabbitmq-2节点需要重启一下服务

    root@rabbitmq-2:/usr/sbin# service rabbitmq-server restart
    

    注意事项
    cookie在所有节点上必须完全一样,同步时一定要注意。
    erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。

    3.2.2、通过rabbitmqctl cluster_status命令,可以查看和个节点的状态,节点的名称是rabbit@shorthostname,
    rabbitmq-1

    root@rabbitmq-1:/usr/sbin# ./rabbitmqctl cluster_status
    Cluster status of node 'rabbit@rabbitmq-1'
    [{nodes,[{disc,['rabbit@rabbitmq-1']}]},
     {running_nodes,['rabbit@rabbitmq-1']},
     {cluster_name,<<"rabbit@rabbitmq-1">>},
     {partitions,[]},
     {alarms,[{'rabbit@rabbitmq-1',[]}]}]
    

    rabbitmq-2

    root@rabbitmq-2:/usr/sbin# ./rabbitmqctl cluster_status
    Cluster status of node 'rabbit@rabbitmq-2'
    [{nodes,[{disc,['rabbit@rabbitmq-2']}]},
     {running_nodes,['rabbit@rabbitmq-2']},
     {cluster_name,<<"rabbit@rabbitmq-2">>},
     {partitions,[]},
     {alarms,[{'rabbit@rabbitmq-2',[]}]}]
    

    3.2.3
    将两个节点组成集群
    因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。使用rabbitmqctl stop_app仅仅关闭应用。

    root@rabbitmq-2:/usr/sbin# ./rabbitmqctl stop_app
    Stopping rabbit application on node 'rabbit@rabbitmq-2'
    

    将2加入1中

    root@rabbitmq-2:/usr/sbin# ./rabbitmqctl join_cluster rabbit@rabbitmq-1
    Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1'
    

    启动节点2的应用

    root@rabbitmq-2:/usr/sbin# ./rabbitmqctl start_app
    Starting node 'rabbit@rabbitmq-2'
    

    如果要使用内存节点,则可以使用以下命令:其中–ram指的是作为内存节点,要是想做为磁盘节点的话,就不用加–ram这个参数了

    root@rabbitmq-2:/usr/sbin# ./rabbitmqctl join_cluster --ram rabbit@ rabbitmq-1
    

    集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。
    Rabbitmq-1

    root@rabbitmq-1:/usr/sbin# ./rabbitmqctl cluster_status
    Cluster status of node 'rabbit@rabbitmq-1'
    [{nodes,[{disc,['rabbit@rabbitmq-1','rabbit@rabbitmq-2']}]},
     {running_nodes,['rabbit@rabbitmq-2','rabbit@rabbitmq-1']},
     {cluster_name,<<"rabbit@rabbitmq-1">>},
     {partitions,[]},
     {alarms,[{'rabbit@rabbitmq-2',[]},{'rabbit@rabbitmq-1',[]}]}]
    

    Rabbitmq-2

    root@rabbitmq-2:/usr/sbin# ./rabbitmqctl cluster_status
    Cluster status of node 'rabbit@rabbitmq-2'
    [{nodes,[{disc,['rabbit@rabbitmq-1','rabbit@rabbitmq-2']}]},
     {running_nodes,['rabbit@rabbitmq-1','rabbit@rabbitmq-2']},
     {cluster_name,<<"rabbit@rabbitmq-1">>},
     {partitions,[]},
     {alarms,[{'rabbit@rabbitmq-1',[]},{'rabbit@rabbitmq-2',[]}]}]
    

    同时在Web管理工具中也可以看到效果


    333.png

    4、设置镜像队列策略

    上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。

    镜像队列概念:镜像队列可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作。镜像队列是基于普通的集群模式的,所以你还是得先配置普通集群,然后才能设置镜像队列。镜像队列设置后,会分一个主节点和多个从节点,如果主节点宕机,从节点会有一个选为主节点,原先的主节点起来后会变为从节点。queue和message虽然会存在所有镜像队列中,但客户端读取时不论物理面连接的主节点还是从节点,都是从主节点读取数据,然后主节点再将queue和message的状态同步给从节点,因此多个客户端连接不同的镜像队列不会产生同一message被多次接受的情况。

    设置镜像队列策略
    在普通集群的中任意节点启用策略,策略会自动同步到集群节点
    命令格式

    set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
    

    在任意一个节点上执行

    root@rabbitmq-1:/usr/sbin# ./rabbitmqctl set_policy -p / ha-allqueue "^message" '{"ha-mode":"all"}'
    Setting policy "ha-allqueue" for pattern "^message" to "{\"ha-mode\":\"all\"}" with priority "0"
    

    集群重启
    集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:
    先在一个节点上执行

    $ ./rabbitmqctl force_boot
    $ service rabbitmq-server start
    

    在其他节点上执行

    $ ./service rabbitmq-server start
    

    查看cluster状态是否正常(要在所有节点上查询)。

    $ ./rabbitmqctl cluster_status
    

    5、操作授权

    添加用户
    处于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,其他的IP无法直接使用这个账号。所以我们需要添加一个其他用户。
    命令格式

    ./rabbitmqctl add_user <username> <newpassword>
    $ ./rabbitmqctl add_user nova 123456
    Creating user "nova"
    

    删除用户
    命令格式

    ./rabbitmqctl delete_user <username>
    $ ./rabbitmqctl  delete_user penglei
    Deleting user "penglei"
    

    修改密码
    命令格式

    ./rabbitmqctl change_password <username> <newpassword>
    $ ./rabbitmqctl  change_password  nova 123456
    Changing password for user "nova"
    

    用户授权
    命令格式

    ./rabbitmqctl set_permissions [-pvhostpath] {user} {conf} {write} {read}
    

    该命令使用户nova /(可以访问虚拟主机) 中所有资源的配置、写、读权限以便管理其中的资源

    $ ./rabbitmqctl set_permissions -p "/"nova ".*" ".*" ".*"
    Setting permissions for user "nova" in vhost "/"
    

    查看用户授权
    命令格式

    ./rabbitmqctl list_permissions [-p VHostPath]
    $./ rabbitmqctl list_permissions -p /
    Listing permissions in vhost "/"
    guest    .*    .*    .*
    nova    .*    .*    .*
    

    查看当前用户列表
    可以看到添加用户成功了,但不是administrator角色

    $ ./rabbitmqctl list_users
    Listing users
    guest    [administrator]
    nova    
    

    添加角色
    这里我们也将nova用户设置为administrator角色
    命令格式

    ./rabbitmqctl set_user_tags <username> <tag>
    $ ./rabbitmqctl set_user_tags nova administrator
    Setting tags for user "nova" to [administrator]
    

    再次查看权限

    $ ./rabbitmqctl list_users
    Listing users
    guest    [administrator]
    nova    [administrator]
    

    清除权限信息
    命令格式

    ./rabbitmqctl clear_permissions [-p VHostPath] nova
    $./rabbitmqctl  clear_permissions  -p /  nova
    Clearing permissions for user "nova" in vhost "/"
    

    下一篇为测试文章https://www.jianshu.com/p/f4153f72e4c1

    相关文章

      网友评论

          本文标题:Ubuntu16.04搭建rabbitmq集群

          本文链接:https://www.haomeiwen.com/subject/izxbhqtx.html