zoukankan      html  css  js  c++  java
  • rabbitmq集群安装与配置(故障恢复)

    0、首先按照http://www.cnblogs.com/zhjh256/p/5922562.html在至少两个节点安装好(不建议单机,没什么意义)

    1、先了解rabbitmq集群架构,http://www.cnblogs.com/zhjh256/p/6368288.html

    2、vi /etc/hosts 在两个节点分别添加别名,互ping对方,确保通。确保防火墙没有开或者相应的端口开放

    3、设置erlang集群通信用的cookie,通常每种集群都有一种机制,可能是共享磁盘比如rac或者session比如tomcat亦或是token比如分布式系统

    RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过rpm安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通过源码或者二进制解压安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。确保组成集群的每个erlang节点的cookie相同。

    [root@dev3 ~]# scp .erlang.cookie devel2:/root/
    The authenticity of host 'devel2 (172.18.30.192)' can't be established.
    RSA key fingerprint is e3:76:d5:eb:d3:7d:86:43:de:bc:5d:31:cb:21:0d:d2.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'devel2,172.18.30.192' (RSA) to the list of known hosts.
    root@devel2's password:
    .erlang.cookie 100% 20 0.0KB/s 00:00
    [root@dev3 ~]# cat .erlang.cookie
    YQSISAMKQWVOZMRQZJDV

    [root@dev3 ~]# chmod 400 .erlang.cookie

    # 必须确保.erlang.cookie的权限位400,否则启动的时候会报“{error_logger,{{2017,2,27},{20,11,25}},"Cookie file /root/.erlang.cookie must be accessible by owner only",[]}”

    [root@devel2 ~]# chmod 400 .erlang.cookie

    4、后台模式启动rabbitmq

    [root@dev3 ~]# rabbitmq-server -detached
    Warning: PID file not written; -detached was passed.

    [root@devel2 ~]# rabbitmq-server -detached
    Warning: PID file not written; -detached was passed.
    [root@devel2 ~]# rabbitmqctl cluster_status
    Cluster status of node rabbit@devel2 ...
    [{nodes,[{disc,[rabbit@devel2]}]},
    {running_nodes,[rabbit@devel2]},
    {cluster_name,<<"rabbit@devel2">>},
    {partitions,[]}]
    [root@devel2 ~]# rabbitmqctl stop_app
    Stopping node rabbit@devel2 ...

    [root@devel2 ~]# rabbitmqctl join_cluster rabbit@dev3
    Clustering node rabbit@devel2 with rabbit@dev3 ...
    [root@devel2 ~]# rabbitmqctl start_app
    Starting node rabbit@devel2 ...
    [root@devel2 ~]# rabbitmqctl cluster_status  ##默认都是disk模式,如果要ram模式,则加上--ram选项
    Cluster status of node rabbit@devel2 ...
    [{nodes,[{disc,[rabbit@dev3,rabbit@devel2]}]},
    {running_nodes,[rabbit@dev3,rabbit@devel2]},
    {cluster_name,<<"rabbit@dev3">>},
    {partitions,[]}]

    5、启用控制台插件

    [root@devel2 ~]# rabbitmq-plugins list
    Configured: E = explicitly enabled; e = implicitly enabled
    | Status: * = running on rabbit@devel2
    |/
    [ ] amqp_client 3.5.7
    [ ] cowboy 0.5.0-rmq3.5.7-git4b93c2d
    [ ] mochiweb 2.7.0-rmq3.5.7-git680dba8
    [ ] rabbitmq_amqp1_0 3.5.7
    [ ] rabbitmq_auth_backend_ldap 3.5.7
    [ ] rabbitmq_auth_mechanism_ssl 3.5.7
    [ ] rabbitmq_consistent_hash_exchange 3.5.7
    [ ] rabbitmq_federation 3.5.7
    [ ] rabbitmq_federation_management 3.5.7
    [ ] rabbitmq_management 3.5.7
    [ ] rabbitmq_management_agent 3.5.7
    [ ] rabbitmq_management_visualiser 3.5.7
    [ ] rabbitmq_mqtt 3.5.7
    [ ] rabbitmq_shovel 3.5.7
    [ ] rabbitmq_shovel_management 3.5.7
    [ ] rabbitmq_stomp 3.5.7
    [ ] rabbitmq_test 3.5.7
    [ ] rabbitmq_tracing 3.5.7
    [ ] rabbitmq_web_dispatch 3.5.7
    [ ] rabbitmq_web_stomp 3.5.7
    [ ] rabbitmq_web_stomp_examples 3.5.7
    [ ] sockjs 0.3.4-rmq3.5.7-git3132eb9
    [ ] webmachine 1.10.3-rmq3.5.7-gite9359c7
    [root@devel2 ~]# rabbitmq-plugins enable rabbitmq_management
    The following plugins have been enabled:
    mochiweb
    webmachine
    rabbitmq_web_dispatch
    amqp_client
    rabbitmq_management_agent
    rabbitmq_management

    Applying plugin configuration to rabbit@devel2... started 6 plugins.

    6、创建用户。默认情况下,内置的guest只能通过localhost访问,通常我们都是在linux服务器上安装rabbitmq,在本地客户端操作,所以需要创建管理用户。

    [root@devel2 ~]# rabbitmqctl add_user admin admin
    Creating user "admin" ..

    [root@devel2 ~]# rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'  ##仅仅设置权限是不足以登录服务器进行管理的,还需要为用户分配user_tag,简单理解就是角色
    Setting permissions for user "admin" in vhost "/" ...

    当前有如下tag:

    [root@devel2 ~]# rabbitmqctl set_user_tags admin administrator
    Setting tags for user "admin" to [administrator] ...
    [root@devel2 ~]# rabbitmqctl add_user monitor monitor
    Creating user "monitor" ...
    [root@devel2 ~]# rabbitmqctl set_user_tags monitor monitoring
    Setting tags for user "monitor" to [monitoring] ...

    7、登录控制台查看状态

    每个节点都需要启用manage插件才能显示统计信息。

     8、设置mirror,一般来说应该在设计阶段或者开发早期根据应用模块或者子系统规划exchange/queue的命名规范,这样便于从维护的角度进行统一处理,而不是将MQ作为一个临时补充。

    比如,设置sys开头的队列复制到所有节点:

    [root@dev3 ~]# rabbitmqctl set_policy -p / ha-allqueue "^sys" '{"ha-mode":"all"}'
    Setting policy "ha-allqueue" for pattern "^sys" to "{"ha-mode":"all"}" with priority "0" ...

    9、测试某节点宕机。

    [root@dev3 ~]# kill -9 19496

    宕机期间消费消息/并生成新的消息:

    重启宕机的节点:

    [root@dev3 ~]# rabbitmq-server -detached  #因为已经是cluster的一部分,所以就不需要重新join了,启动的时候会自动join。否则会出错如下:

    [root@dev3 ~]# rabbitmqctl join_cluster rabbit@devel2
    Clustering node rabbit@dev3 with rabbit@devel2 ...
    {"init terminating in do_boot",{function_clause,[{rabbit_ctl_misc,print_cmd_result,[join_cluster,already_member],[]},{rabbit_cli,main,3,[]},{init,start_it,1,[]},{init,start_em,1,[]}]}}
    
    Crash dump is being written to: erl_crash.dump...done
    init terminating in do_boot ()

    启动后,可以发现有些queue没有同步,需要人工进行同步。

     同步后可见消息都是正确的,已经消费的会删掉,新增的会拷贝过去。

    10、如果某些时候因为过去时间较长、消息较多,不想同步,而是作为新节点重新join,怎么办?

    可以在目标节点执行

    rabbitmqctl reset

    然后重新执行加入节点的步骤即可。

     11、rabbitmq集群日常维护的注意事项和故障恢复可参考rabbitmq集群故障恢复详解

    
    
  • 相关阅读:
    java去除字符串中的空格、回车、换行符、制表符
    Tomcat 7 'javax.el.ELException' 的解决方式(failed to parse the expression [${xxx}])
    quartz CronExpression表达式
    iconMoon:字体图标(iconfont)解决方案及使用教程
    小程序:前端防止用户重复提交&即时消息(IM)重复发送问题解决
    小程序:位置信息(Location)及微信小程序LBS解决方案实践
    小程序:web-view采坑指南
    小程序:如何让scroll-view包含内容完整滚动
    小程序:如何在wxml页面中调用JavaScript函数
    小程序:怎么在两层列表循环(wx:for)的时候判断是否为最后一个元素
  • 原文地址:https://www.cnblogs.com/zhjh256/p/6473574.html
Copyright © 2011-2022 走看看