• RabbitMQ 集群环境安装


    突然发现自己的英语能力很差, 文档 看的云里雾里,在安装 RabbitMQ 集群的时候遇到了很大的麻烦。

    安装 RabbitMQ 的集群环境,首先得来讲如何安装非集群环境

    Step1 :安装 Erlang

    啥是 Erlang? Look –> http://en.wikipedia.org/wiki/Erlang_%28programming_language%29

    下载 Erlang 的 SRC - otp_src_R13B04.tar.gz

    ./configure  --prefix=/usr/local/erlang

    make

    make install

    Step2: 安装 Python 2.6 以上版本(大部分 Linux 版本都自带了 Python2.6 以上版本)

    Step3 :如果没有 simplejson-2.1.1 这个 Python lib ,需要从 此处 下载

    Step4 :下载 RabbitMQ Server Package rabbitmq-server-generic-unix-1.7.2.tar.gz

    Step5 :解压后,进入 /home/rabbitmq_server-1.7.2/sbin 目录,运行 ./rabbitmq-server

    如果出现:

    +---+   +---+

    |   |   |   |

    |   |   |   |

    |   |   |   |

    |   +---+   +-------+

    |                   |

    | RabbitMQ  +---+   |

    |           |   |   |

    |   v1.7.2  +---+   |

    |                   |

    +-------------------+

    AMQP 8-0

    Copyright (C) 2007-2010 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd.

    Licensed under the MPL.  See http://www.rabbitmq.com/

    node          : rabbit@replica1

    app descriptor: /home/rabbitmq_server-1.7.2/sbin/../ebin/rabbit.app

    home dir      : /root

    cookie hash   : pR5H9kY3Wra/XdLELT5hgQ==

    log           : /var/log/rabbitmq/rabbit.log

    sasl log      : /var/log/rabbitmq/rabbit-sasl.log

    database dir  : /var/lib/rabbitmq/mnesia/rabbit

    starting internal event notification system                           ...done

    starting logging server                                               ...done

    starting database                                                     ...done

    -- kernel ready

    starting alarm handler                                                ...done

    starting queue supervisor                                             ...done

    starting node monitor                                                 ...done

    starting cluster router                                               ...done

    -- core initialized

    starting empty DB check                                               ...done

    starting codec correctness check                                      ...done

    starting exchange recovery                                            ...done

    starting queue recovery                                               ...done

    starting persister                                                     ...done

    starting guid generator                                               ...done

    -- message delivery logic ready

    starting error log relay                                              ...done

    starting networking                                                    ...done

    -- network listeners available

    broker running

    则代表启动成功。

    接下来,就来阐述一下我安装 RabbitMQ 的方法

    首先:我非常欣赏 官方文档 的详细和无厘头。

    官方文档非常详细的介绍了手动配置和自动配置两种手段,手动配置是利用了 sbin 目录里提供的 rabbitmqctl 脚本,非常强大而 YD ,具体就不阐述了,里面有非常靠谱的介绍。但是,不靠谱的是,文档忘记说明三个问题,虽然可能在 RabbitMQ Erlang 开发人员的眼里,简直是小儿科。

    1. RabbitMQ 完全依赖 Erlang 的 Cluster ,所以,要构建起 RabbitMQ 的集群环境,还是需要了解一点 Erlang, 不然就是盲人摸象,摸到哪算哪。

    这里首先非常感谢 Erlang-China 上的文档说明:

    http://erlang-china.org/study/erlang-distribute-security.html , 让我明白了几个问题:

    1.              a.  为什么我的 .erlang.cookie 不在 RabbitMQ 文档里说的 /var/lib/rabbitmq/.erlang.cookie

    因为Erlang 产生的 .erlang.cookie是在 $HOME/.erlang.cookie

    既然你完全依赖 Erlang 的集群环境,你就没必要特别指出你是在 /var/lib/rabbitmq 里了,何苦呢,如果说你要设置 $HOME, 那也得问问我这个使用者感受,是不。

    1.              b.  节点间的通信,首要条件是互相可见, Erlang 的安全级别只有两种( All or No ),要么啥权限都有,要么啥都没有。我非常欣赏这种设计,比起所谓的 ACL ,在强大的网络和通信能力的光环之下,以及内部网络的基础上,简直是可有可无。
    2.             c.   如何保证节点( server )间互相能通信, Erlang 采用了 Cookie 匹配的做法:如果在命令行里面带上 -setcookie ,则在当前节点使用这个 cookie 值,否则会使用 $HOME/.erlang.cookie 。清晰啊···
    3.             d.  我非常喜欢 -setcookie 的做法,直接··

    具体的设置方法,该文章讲的非常清楚,我就不赘述了。从中我学到了 3 样事情:

    1.             f.   如何检查节点间是否可以通讯: net_adm:ping(‘foo@192.168.0.2‘ ).
    2.             g.   如何得知当前的 Erlang 集群中有哪些 server : node( ).
    3.             h.  特别注意 foo @192.168.0.2 ,这表明当前的用户, foo1@192.168.0.2foo2@192.168.0.2 是代表两个不一样的 Erlang 节点。

    Note: 由于我好暂时不需要 Security 相关的东西,所以也没花功夫去看。

    1.      2.  建立在 1 的基础上,我们已经知道如何配置 Erlang 的集群了,接下来就是 RabbitMQ
    2.            a.   删除 /var/lib/rabbitmq/mnesia

    似乎 Erlang 或者是 MQ 做了一些让人摸不着头脑的事情,一旦启动过了 MQ (单机版)就会随机产生一个 Cookie, 并且,这个 cookie 是会保存在 Mnesia的 Schema 中的。所以如果你在安装好 MQ 之后,异常兴奋,如我这般启动过了 MQ ,那就会掉入文档的一个陷阱中。

    1.            b.   修改 rabbit-server 脚本

    经管有文档中已经有非常傻瓜的配置方法了,并且也提到了:

    As an alternative, you can insert the option " -setcookie cookie " in the erl call in the rabbitmq-server and rabbitmqctl scripts.

    但是因为信任度的关系,我还是相信了 Erlang-China 。修改的 rabbit-server 日下:

        ${RABBITMQ_EBIN_PATH} \

        ${RABBITMQ_START_RABBIT} \

        -sname ${RABBITMQ_NODENAME} \

        -boot ${RABBITMQ_BOOT_FILE} \

        ${RABBITMQ_CONFIG_ARG} \

        +W w \

        ${RABBITMQ_SERVER_ERL_ARGS} \

        ${RABBITMQ_LISTEN_ARG} \

        -sasl errlog_type error \

        -kernel error_logger '{file,"'${RABBITMQ_LOGS}'"}' \

        -sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \

        -os_mon start_cpu_sup true \

        -os_mon start_disksup false \

        -os_mon start_memsup false \

        -mnesia dir "\"${RABBITMQ_MNESIA_DIR}\"" \

        ${RABBITMQ_CLUSTER_CONFIG_OPTION} \

        name rabbit@replica2 -setcookie rabbit \

        ${RABBITMQ_SERVER_START_ARGS} \

        "$@"

    其中,要注意的地方是:

    1.                          i.    rabbit@replica2 , replica2 是指的当前 server 的 hostName ( etc/hosts )。
    2.                          ii.    设置的 cookie 是叫 rabbit ,也就是说这个名字可以随便定,无所谓。
    3.                          iii.   同样,我试过不用 Host 而用 IP ,结果似乎不能运行(但是在 Erlang 的集群配置中, IP 还是 HostName 并不是一个 big issue 。
    1.         3.      启动 rabbit-server ,直接点,别 rabbitmq-server –detach 了。
    2.         4.     另起一个 console ,运行

    CentOS4.4-64:replica:root > ./rabbitmqctl status

    Status of node rabbit@replica ...

    [{running_applications,[{rabbit,"RabbitMQ","1.7.2"},

                            {mnesia,"MNESIA  CXC 138 12","4.4.13"},

                            {os_mon,"CPO  CXC 138 46","2.2.5"},

                            {sasl,"SASL  CXC 138 11","2.1.9"},

                            {stdlib,"ERTS  CXC 138 10","1.16.5"},

                            {kernel,"ERTS  CXC 138 10","2.13.5"}]},

      {nodes,[rabbit@replica2,rabbit@replica1,rabbit@replica]},

      {running_nodes,[rabbit@replica1,rabbit@replica2,rabbit@replica]}]

    ...done.

    转载自:http://hammer-nail.iteye.com/blog/640537

  • 相关阅读:
    Android开源项目发现---ImageView 篇(持续更新)
    Android开源项目发现---GridView 篇(持续更新)
    python的setup.py文件
    版本控制系统git
    python如何调用c编译好可执行程序
    Python特殊语法:filter、map、reduce、lambda [转]
    Apache+Mysql+PHP 套件
    django开发环境搭建(参考流程)
    C++ GUI Qt4编程-创建自定义窗口部件
    Qt学习笔记-Widget布局管理
  • 原文地址:https://www.cnblogs.com/langqi250/p/2703697.html
Copyright © 2020-2023  润新知