Aldebaran

人生最棒的感觉,就是你做到别人说你做不到的事。

0%

搭建RabbitMQ集群

指原莉乃

前面讲述了RabbitMQ的架构,下面是来实战演练一下。

RabbitMQ 安装

  1. 准备工作

    • 准备3台机器,系统为centos7(其他版本也OK)。

        192.168.99.63 rabbit1
        192.168.99.65 rabbit2
        192.168.99.67 rabbit3
      
    • 修改hostname(每台都需要)

        $ hostname rabbit1
        $ hostname rabbit2
        $ hostname rabbit3
      

      centos7永久更改hostname的命令为:

        $ hostnamectl --static set-hostname [主机名]
      
    • 修改host file(每台都需要修改)

        $ vim /etc/hosts
        192.168.99.63 rabbit1
        192.168.99.65 rabbit2
        192.168.99.67 rabbit3
      

根据操作系统不同, 官网提供了相应的安装说明:Windows、Debian / Ubuntu、RPM-based Linux、Mac

这里是Redhat的安装方式

  1. 通过yum安装依赖包

     $ yum install epel-release
     $ yum makecache
     $ yum -y install socat compat-readline5
    
  2. 安装erlang

    安装 RabbitMQ 之前要安装 Erlang ,可以去Erlang官网下载。

    各个erlang的版本:https://github.com/rabbitmq/erlang-rpm/releases

     centos6: https://github.com/rabbitmq/erlang-rpm/releases/download/v21.1.1/erlang-21.1.1-1.el6.x86_64.rpm
     centos7: https://github.com/rabbitmq/erlang-rpm/releases/download/v21.1.1/erlang-21.1.1-1.el7.centos.x86_64.rpm
    

    直接wget下来,安装就完事了

  3. 安装rabbitmq

    接着去RabbitMQ官网下载安装包。

    安装文档: https://www.rabbitmq.com/install-rpm.html

    各个版本的安装包: https://github.com/rabbitmq/rabbitmq-server/releases

     centos6: https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.8/rabbitmq-server-3.7.8-1.el6.noarch.rpm
     centos7: https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.8/rabbitmq-server-3.7.8-1.el7.noarch.rpm
    

    直接wget下来,安装就完事了(需要先安装socat)

    修改最大连接数

    • With systemd (Recent Linux Distributions)

      在使用systemd的发行版上,操作系统限制通过/etc/systemd/system/rabbitmq-server.service.d/limits.conf中的配置文件进行控制

        [Service]
        LimitNOFILE=300000
      
    • Without systemd (Older Linux Distributions)

      在不使用systemd的发行版上调整RabbitMQ的每用户限制的最直接方法是编辑rabbitmq-env.conf并在服务启动之前调用ulimit

        $ ulimit -S -n 4096
      

开机自启动

      $ chkconfig rabbitmq-server on

启动

      $ /sbin/service rabbitmq-server start
  1. 安装插件

    常用的插件:http://www.rabbitmq.com/community-plugins.html

    进入插件安装目录{rabbitmq-server}/plugins/(可以查看一下当前已存在的插件)

     $ cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.8/plugins
    
    • rabbitmq_delayed_message_exchange

        $ wget https://dl.bintray.com/rabbitmq/community-plugins/3.7.x/rabbitmq_delayed_message_exchange/rabbitmq_delayed_message_exchange-20171201-3.7.x.zip -O rabbitmq_delayed_message_exchange-20171201-3.7.x.zip
        $ unzip rabbitmq_delayed_message_exchange-20171201-3.7.x.zip
        $ rabbitmq-plugins enable rabbitmq_delayed_message_exchange
      
    • rabbitmq_management

        $ rabbitmq-plugins enable rabbitmq_management
        $ rabbitmq-plugins list
      

      默认的用户名为:guest 默认的密码为:guest, rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问添加一个用户,用来访问

      这里要提一下, RabbitMQ的用户角色分类:

      none、management、policymaker、monitoring、administrator

        $ rabbitmqctl add_user admin admin
        $ rabbitmqctl set_user_tags admin administrator
      

      rabbitmq更多的权限信息可以参考: RabbitMQ用户角色及权限控制

      访问web控制台

        $ curl http://server-name:15672
      
  2. 复制配置文件

    RabbitMQ等数据服务通常具有许多可调参数。有些配置对开发很有意义,但并不适合生产。没有一种配置适合每个用例。因此,在投入生产之前评估系统配置非常重要。

    默认配置文件路径:/etc/rabbitmq/ 为空,需要复制模板进去修改

     $ cp -rpv /usr/share/doc/rabbitmq-server-3.7.8/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
    

    如果elang版本支持HIPE,那么可以把hipe_compile开启

     $ vim /etc/rabbitmq/rabbitmq.config
     {hipe_compile, true}
    

    注意: HiPE代表高性能Erlang。启用HiPE后,Erlang应用程序在执行之前会预编译为机器代码。我们的基准测试显示,这使RabbitMQ的性能提升高达30%。(如果您遇到这种情况,可以在此处找到基准测试详细信息,结果在此处。)

    以这种方式执行操作的缺点是,在编译Erlang应用程序时,应用程序初始启动时间会显着增加。使用HiPE,第一个RabbitMQ启动大约需要2分钟。

    另一个微妙的缺点是,如果启用了HiPE,调试RabbitMQ可能会很困难,因为HiPE可以破坏错误回溯,使其无法读取。

    若日志出现erlang vm segfaults,应关掉。

  3. 默认的MQ使用端口情况

     4369 (epmd), 25672 (Erlang distribution)
     5672, 5671 (AMQP 0-9-1 without and with TLS)
     n15672 (if management plugin is enabled)
     61613, 61614 (if STOMP is enabled)
     1883, 8883 (if MQTT is enabled)
    

注意: 将上述的步骤在每一台rabbitmq server上执行


RabbitMQ集群设置

  1. 设置 Erlang Cookie

    需要有相同的Erlang Cookie,否则不能进行通信,为保证cookie的完全一致,采用从一个节点copy的方式,

    注意:

    官方在介绍集群的文档中提到过.erlang.cookie一般会存在这两个地址:第一个是$home/.erlang.cookie也就是/root 目录下,第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在${home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。这个文件权限是 400!

     $ chmod 400 /var/lib/rabbitmq/.erlang.cookie
     $ chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
    
  2. 修改rabbitmq-env.conf(RABBITMQ_NODENAME值需要根据/etc/hosts修改)

     $ mkdir -pv /data/rabbitmq/{mnesia,logs}
     $ chown -R rabbitmq:rabbitmq /data/rabbitmq
     $ chmod 750 /data/rabbitmq/mnesia
     $ chmod 755 /data/rabbitmq/logs
     $ vim /etc/rabbitmq/rabbitmq-env.conf
     RABBITMQ_NODENAME=rabbit@rabbit1
     RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia
     RABBITMQ_LOG_BASE=/data/rabbitmq/logs
    
  3. 启动/重启各节点

     $ systemctl daemon-reload
     $ systemctl start rabbitmq-server
     $ systemctl stop rabbitmq-server
     $ systemctl restart rabbitmq-server
     # 开机启动
     $ systemctl enable rabbitmq-server
    
  4. 加入集群

     $ rabbitmqctl stop_app
     $ rabbitmqctl reset
    
     # 默认都是磁盘节点,如果要使自己成为内存节点,则加上--ram参数
     # **在RabbitMQ集群里,必须至少有一个磁盘节点存在。**
     $ rabbitmqctl join_cluster rabbit@rabbit1
     $ rabbitmqctl start_app
    
     # 查看集群状态
     $ sudo rabbitmqctl cluster_status
    
  5. 配置策略: 镜像模式(可选)

    在任一集群节点上运行

     $ sudo rabbitmqctl set_policy -p / ha-allqueue "^" '{"ha-mode":"all"}'
    

    备注:这行命令在名称为”/“的vhost上创建了一个策略,策略名称为 ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为“^”表示所有匹配所有队列名称

    在高可用模式(镜像模式)下,每个镜像队列包含一个 master 和若干 slaver,他们之间存在着复制的关系,当 master 因为各种原因突然消失(挂掉),最老的 slaver 会自动变成新的 master

    set_policy01

    set_policy02

    或者如果只是想匹配以ha开头的队列名称,则:

     $ rabbitmqctl set_policy ha-all "^ha\." "{""ha-mode"":""all""}"
    
  6. 配置调整(会另起一个章节来写)

     $ sudo vim /etc/rabbitmq/rabbitmq.config
    
     [
         {
             rabbit, [
                 {tcp_listeners, [{"127.0.0.1", 5672}, {"192.168.99.63", 5672}]},
                 {cluster_partition_handling, pause_minority},
                 {log_levels, [{connection, info}, {channel, info}]},
    
                 {vm_memory_high_watermark, 0.5},
                 {vm_memory_high_watermark_paging_ratio, 0.5},
                 {memory_monitor_interval, 2500},
    
                 {hipe_compile, true},
                 {disk_free_limit, "300MB"},
                 %% Set the default AMQP heartbeat delay (in seconds).
                 %%
                 {heartbeat, 60},
    
                 %% Set the max permissible size of an AMQP frame (in bytes).
                 %%
                 {frame_max, 131072},
    
                 %% Set the max frame size the server will accept before connection
                 %% tuning occurs
                 %%
                 {initial_frame_max, 4096},
    
                 %% Set the max permissible number of channels per connection.
                 %% 0 means "no limit".
                 %%
                 {channel_max, 512}
             ]
         }
     ].
    

参考链接

https://www.rabbitmq.com/configure.html

https://www.rabbitmq.com/production-checklist.html

RabbitMQ运维

CentOs7.3 搭建 RabbitMQ 3.6 Cluster 集群服务与使用

rabbitmq集群搭建(多机)

rabbitmq安装配置与基本操作