说明

核心概念

》集群搭建说明

  • 集群搭建是为了解决什么问题呢?

    • 大量消息情况下性能问题
  • 注意点有哪些呢?

    • 每个node(机器)需要设置正确的host(hostname、hosts),保证通过host能互相连通。
    • 所有加入集群的node地位相等,新加入node只需要连接任意一个node都能加入到集群,任意一个node丢失都不会影响整个node。
    • 所有加入集群的node必须保证erlang.cookie与其他相同
  • 搭建集群后为什么要配置镜像队列?

    • 默认搭建好集群,来一个消息会被随机分配到其中一台节点,一旦该节点宕机而该消息未被消费就会丢失,为了解决这个问题就需要配置镜像队列。
    • 镜像队列一般是备份两份(主node、备node各一份),你也可以设置备份多份(最多不能超过所有node数量),但是这样是大大的浪费,没必要。
    • 配置备份两份以后,当其中一个node宕机,会自动备份到其他node,保证数据永远有两份,即使剩下最后一台节点也不会数据丢失,除非所有节点全部宕机。
    • 配置镜像队列必须配置好集群,单台node是没有镜像队列选项值的。
    • 配置完镜像队列就基本上可以保证消息不丢失了。

操作步骤

》准备环境

  • 准备三台服务器(虚拟机),先准备一台配置好RabbitMQ,如果是本地虚拟机的话其他两台用这一台创建链接克隆,如此一来就不用分别配置了。

》开始搭建集群

  • 分别修改三台服务器主机名

    # 第一个节点
    [root@host0202 admin]# vi /etc/hostname
    host0202
    
    # 第二个节点
    [root@host0203 admin]# vi /etc/hostname
    host0203
    
    # 第三个节点
    [root@host0204 admin]# vi /etc/hostname
    host0204
  • 分别修改三台服务器hosts文件

    # 第一个节点
    [root@host0202 admin]# vi /etc/hosts
    192.168.0.202   host0202
    192.168.0.203   host0203
    192.168.0.204   host0204
    
    # 第二个节点
    [root@host0203 admin]# vi /etc/hosts
    192.168.0.202   host0202
    192.168.0.203   host0203
    192.168.0.204   host0204
    
    # 第三个节点
    [root@host0204 admin]# vi /etc/hosts
    192.168.0.202   host0202
    192.168.0.203   host0203
    192.168.0.204   host0204
  • 统一三台服务器的erlang.cookie,在第一台(host0202)执行以下操作(如果你是跟我一样直接克隆的虚拟机那么这一步可以省略)

    [root@host0202 admin]# cd /var/lib/rabbitmq/
    [root@host0202 rabbitmq]# ls -al
    total 8
    drwxr-xr-x.  3 rabbitmq rabbitmq   42 Dec 28 18:29 .
    drwxr-xr-x. 27 root     root     4096 Dec 28 18:23 ..
    -r--------.  1 rabbitmq rabbitmq   20 Dec 28 00:00 .erlang.cookie
    drwxr-x---.  4 rabbitmq rabbitmq  104 Dec 28 21:39 mnesia
    
    [root@host0202 rabbitmq]# scp .erlang.cookie root@host0203:/var/lib/rabbitmq/
    
    [root@host0202 rabbitmq]# scp .erlang.cookie root@host0204:/var/lib/rabbitmq/
  • 分别在三台服务器中重启RabbitMQ、Erlang虚拟机

    # 第一个节点
    [root@host0202 rabbitmq]# rabbitmq-server -detached
    
    # 第二个节点
    [root@host0203 rabbitmq]# rabbitmq-server -detached
    
    # 第三个节点
    [root@host0204 rabbitmq]# rabbitmq-server -detached
  • 将第二个节点加入第一个节点

    [root@host0203 rabbitmq]# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@host0203 ...
    
    [root@host0203 rabbitmq]# rabbitmqctl reset
    Resetting node rabbit@host0203 ...
    
    [root@host0203 rabbitmq]# rabbitmqctl join_cluster rabbit@host0202
    Clustering node rabbit@host0203 with rabbit@host0202
    
    [root@host0203 rabbitmq]# rabbitmqctl start_app
    Starting node rabbit@host0203 ...
    • rabbitmqctl stop_app:关闭RabbitMQ不关闭Erlang虚拟机
    • rabbitmqctl stop:关闭RabbitMQ和Erlang虚拟机
  • 将第三个节点加入第二个节点

    [root@host0204 rabbitmq]# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@host0204 ...
    
    [root@host0204 rabbitmq]# rabbitmqctl reset
    Resetting node rabbit@host0204 ...
    
    [root@host0204 rabbitmq]# rabbitmqctl join_cluster rabbit@host0203
    Clustering node rabbit@host0204 with rabbit@host0203
    
    [root@host0204 rabbitmq]# rabbitmqctl start_app
    Starting node rabbit@host0204 ...
  • 查看集群状态(任意一个节点都行)

    [root@host0202 rabbitmq]# rabbitmqctl cluster_status
    • 或者登陆RabbitMQ管理后台查看:Overview -> Nodes
  • 如果配置完后台登陆不了,重新创建用户,具体参考我的安装RabbitMQ相关教程
  • 解除集群节点

    # 第一种方式:在第三个节点执行:
    [root@host0204 rabbitmq]# rabbitmqctl stop_app
    [root@host0204 rabbitmq]# rabbitmqctl reset
    [root@host0204 rabbitmq]# rabbitmqctl start_app
    [root@host0204 rabbitmq]# rabbitmqctl cluster_status
    
    # 第二种方式:在第一个节点执行(该方式执行前需先stop掉要解除的节点):
    [root@host0202 rabbitmq]# rabbitmqctl forget_cluster_node rabbit@host0204

》配置镜像队列

  • 启动所有集群中的node,登陆任意一个node的RabbitMQ后台
  • 配置策略policy:Admin -> Policies -> Add/update a policy

    • name:策略名字,随便写
    • Pattern:正则匹配规则,(比如^mirror=以mirror开头)
    • Apply to:应用到交换机还是队列或全部
    • Priority:优先级,默认空即可
    • Definition:

      • ha-mode:备份模式,exactly=备份模式,指备份几份
      • ha-params:备份的分数
      • ha-sync-mode:同步模式,automatic=自动
  • 策略说明

    - name:my-policy001
    - Pattern:^mirror
    - Apply to:
    - Priority:
    - Definition:
        - ha-mode:exactly
        - ha-params:2
        - ha-sync-mode:automatic

备注

  • 该教程部分内容收集自网络,感谢原作者。

附录

标签: Java, RabbitMq

添加新评论


手机号仅后台超管可见,普通注册用户以及网站前台全站不可见,请勿担心泄露风险!