当前位置: 首页 > news >正文

rabbitmq单机多实例集群搭建

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.安装单机版的


2.要搭建集群,先将之前单机版中历史记录干掉,删除rabbitmq /var/lib/rabbitmq/mnesia下的所有内容。


3.启动3个实例
#因为我配置了web管理插件,所以还要指定其web插件占用的端口号,如果不指定,将不能启动多个节点,因为端口号被占用

RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached


4.在浏览器访问每一个rabbitmq实例,是够可以显示登录页面,如果显示成功,继续往下进行


5.我们以rabbit为主节点,剩下两个为从节点(在从节点执行以下命令,主节点不用动,-n指定具体那个节点)
          [root@localhost mnesia]# rabbitmqctl -n rabbit2 stop_app
          Stopping rabbit application on node rabbit2@localhost ...
          [root@localhost mnesia]# rabbitmqctl -n rabbit2 reset
          Resetting node rabbit2@localhost ...
          [root@localhost mnesia]# rabbitmqctl -n rabbit2 join_cluster rabbit@`hostname -s`
          Clustering node rabbit2@localhost with rabbit@localhost ...
          [root@localhost mnesia]# rabbitmqctl -n rabbit2 start_app
          Starting node rabbit2@localhost ...
          [root@localhost mnesia]# rabbitmqctl -n rabbit3 stop_app
          Stopping rabbit application on node rabbit3@localhost ...
          [root@localhost mnesia]# rabbitmqctl -n rabbit3 reset
          Resetting node rabbit3@localhost ...
          [root@localhost mnesia]# rabbitmqctl -n rabbit3 join_cluster rabbit@`hostname -s`
          Clustering node rabbit3@localhost with rabbit@localhost ...
          [root@localhost mnesia]# rabbitmqctl -n rabbit3 start_app
          Starting node rabbit3@localhost ...
这是查看每一个rabbitmq的节点,可以看到以下场景,证明多实例启动成功

6.如果想加入一个新的节点到集群,只需要执行第五步相同的命令即可!

删除节点:rabbitmqctl forget_cluster_node rabbit3@hostname

7.使用rabbitmqctl -n rabbit cluster_status查看集群信息
          [root@localhost mnesia]# rabbitmqctl -n rabbit cluster_status
          Cluster status of node rabbit@localhost ...
          [{nodes,[{disc,[rabbit2@localhost,rabbit3@localhost,rabbit@localhost]}]},
           {running_nodes,[rabbit3@localhost,rabbit2@localhost,rabbit@localhost]},
           {cluster_name,<<"rabbit@localhost">>},
           {partitions,[]},
           {alarms,[{rabbit3@localhost,[]},
                    {rabbit2@localhost,[]},
                    {rabbit@localhost,[]}]}]
搭建过程中,可能会出现如下错误,我感觉只要是出现带mnesia关键字的,把rabbitmq/var/lib/rabbitmq/mnesia下所有内容删掉(rm -rf *)。
Clustering node hare@localhost with rabbit@localhost ...
Error: mnesia_not_running


8.测试,生产者使用5672生产消息,消费者使用5673获取消息,如果能获取到表示集群搭建成功
Producer类:

package com.rabbitmq.test.T_helloworld;
 
 
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.test.util.ConnectionUtil;
 
 
/**
 * helloworld
 * @author lenovo
 *
 */
public class Producer {
 
 
    private final static String QUEUE_NAME = "test_queue";
 
 
    public static void main(String[] argv) throws Exception {
        //定义一个链接工厂
        ConnectionFactory factory=new ConnectionFactory();            
        //设置服务地址,IP,端口,账号密码信息
        factory.setHost("192.168.1.103");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        //vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
        //factory.setVirtualHost("/testrabbit");
        // 获取到连接以及mq通道
        Connection connection = factory.newConnection();
        
        //Connection connection = ConnectionUtil.getConnection();
        // 从连接中创建通道
        Channel channel = connection.createChannel();
 
 
        /*
         * 声明(创建)队列
         * 参数1:队列名称
         * 参数2:为true时server重启队列不会消失
         * 参数3:队列是否是独占的,如果为true只能被一个connection使用,其他连接建立时会抛出异常
         * 参数4:队列不再使用时是否自动删除(没有连接,并且没有未处理的消息)
         * 参数5:建立队列时的其他参数
         */
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
 
 
        // 消息内容
        String message = "Hello World!";
        /*
         * 向server发布一条消息
         * 参数1:exchange名字,若为空则使用默认的exchange
         * 参数2:routing key
         * 参数3:其他的属性
         * 参数4:消息体
         * RabbitMQ默认有一个exchange,叫default exchange,它用一个空字符串表示,它是direct exchange类型,
         * 任何发往这个exchange的消息都会被路由到routing key的名字对应的队列上,如果没有对应的队列,则消息会被丢弃
         */
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println(" [生产者] Sent '" + message + "'");
 
 
        //关闭通道和连接
        channel.close();
        connection.close();
    }
}

Consumer类:

package com.rabbitmq.test.T_helloworld;
 
 
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.test.util.ConnectionUtil;
 
 
public class Consumer {
 
 
    private final static String QUEUE_NAME = "test_queue";
 
 
    public static void main(String[] argv) throws Exception {
 
 
        //定义一个链接工厂
        ConnectionFactory factory=new ConnectionFactory();            
        //设置服务地址,IP,端口,账号密码信息
        factory.setHost("192.168.1.103");
        factory.setPort(5673);
        factory.setUsername("admin");
        factory.setPassword("admin");
        //vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
        //factory.setVirtualHost("/testrabbit");
        // 获取到连接以及mq通道
        Connection connection = factory.newConnection();
        // 从连接中创建通道
        Channel channel = connection.createChannel();
 
 
        // 声明队列(如果你已经明确的知道有这个队列,那么下面这句代码可以注释掉,如果不注释掉的话,也可以理解为消费者必须监听一个队列,如果没有就创建一个)
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
 
 
        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
       /*
         * 监听队列
         * 参数1:队列名称
         * 参数2:是否发送ack包,不发送ack消息会持续在服务端保存,直到收到ack。  可以通过channel.basicAck手动回复ack
         * 参数3:消费者
         */ 
        channel.basicConsume(QUEUE_NAME, true, consumer);
 
 
        // 获取消息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" [消费者] Received '" + message + "'");
        }
    }
}


 

转载于:https://my.oschina.net/u/4008390/blog/3011606

相关文章:

  • j2EE监听器-listener
  • jQuery EasyUI使用教程之使用虚拟滚动视图显示海量数据
  • DevOps团队结构类型汇总:总有一款适合你
  • CSS学习笔记(五)背景
  • 独家!支付宝小程序技术架构全解析
  • linux关闭ssh连接
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [Redis]Redis的数据类型
  • Leetcode题目:Balanced Binary Tree
  • 我是如何设计 Upload 上传组件的
  • 团队项目第一阶段冲刺站立会议6(4月23日)
  • You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
  • 云HBase Spark分析引擎对接云数据库POLARDB
  • Hive基本操作
  • IDEA之配置svn
  • ----------
  • ES6系列(二)变量的解构赋值
  • go append函数以及写入
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • spring学习第二天
  • 聚簇索引和非聚簇索引
  • 2017年360最后一道编程题
  • 国内开源镜像站点
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $ git push -u origin master 推送到远程库出错
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (day6) 319. 灯泡开关
  • (java)关于Thread的挂起和恢复
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)Windows2003安全设置/维护
  • *** 2003
  • ***详解账号泄露:全球约1亿用户已泄露
  • *1 计算机基础和操作系统基础及几大协议
  • .NET命令行(CLI)常用命令
  • .py文件应该怎样打开?
  • .sh 的运行
  • @Autowired和@Resource的区别
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [CSS] 点击事件触发的动画
  • [HDU]2161Primes
  • [HITCON 2017]SSRFme perl语言的 GET open file 造成rce
  • [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
  • [LeetCode]—Roman to Integer 罗马数字转阿拉伯数字
  • [python] 之 装饰器