Rabbitmq安装、集群与高可用配置

时间:2023-12-25 21:29:01

历史:

RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。

应用场景:

RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSource(VMWare的一个部门)收购。在2013年5月被并入Pivotal。其实VMWare,Pivotal和EMC本质上是一家的。不同的是VMWare是独立上市子公司,而Pivotal是整合了EMC的某些资源,现在并没有上市。

对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component or submodule)。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展 (Scalability);如果使用socket那么不同的模块的确可以部署到不同的机器上,但是还是有很多问题需要解决。比如:

1)信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据如何方式丢失?

2)如何降低发送者和接收者的耦合度?

3)如何让Priority高的接收者先接到数据?

4)如何做到load balance?有效均衡接收者的负载?

5)如何有效的将数据发送到相关的接收者?也就是说将接收者subscribe 不同的数据,如何做有效的filter。

6)如何做到可扩展,甚至将这个通信模块发到cluster上?

7)如何保证接收者接收到了完整,正确的数据?

AMDQ协议解决了以上的问题,而RabbitMQ实现了AMQP

Rabbitmq安装:

1. 安装系统编译环境所需的软件包
yum install gcc glibc-devel make ncurses-devel openssl-devel autoconf
yum install unixODBC unixODBC-devil

2.Rabbitmq基于erlang语言开发,因此需要安装erlang虚拟机
wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo
yum install erlang
3.OTP是Erlang库和设计原则的集合,提供了开发各种系统的中间件。它包含了自己的分布式数据库、面向其它编程语言的接口、调试和发布处理工具等。
wget http://www.erlang.org/download/otp_src_18.0.tar.gz
tar zxvf otp_src_18.0.tar.gz
./configure --prefix=/usr/local/erlang_18.0 --enable-halfword-emulator --enable-m64-build
make
make install

4.安装rabbitm-server
rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
yum install rabbitmq-server-3.5.6-1.noarch.rpm

5.安装官方web管理工具(rabbitmq_management)
安装rabbitmq后,默认安装了该管理工具,执行命令即可启动
rabbitmq-plugins enable rabbitmq_management

6.启动rabbitmq
/etc/init.d/rabbitmq-server start
http://192.168.12.22:15672/   
注:直接用ip访问是访问不了的,默认支持127.0.0.1:15672,
要想远程访问,需要进行下面的操作,
参考官方文档:
    http://www.rabbitmq.com/access-control.html
网上找到的文档:
    http://www.cnblogs.com/rollenholt/p/4098089.html
6.1添加账号密码
rabbitmqctl add_user admin 123qwe
rabbitmqctl set_user_tags root administrator
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"

6.2在rabbitmq.config.example最后一行添加
vim /usr/share/doc/rabbitmq-server-3.5.6/rabbitmq.config.example

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Send {
    private final static String QUEUE_NAME = "hello";

public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.12.22");
        factory.setUsername("admin");
        factory.setPassword("123qwe");
        factory.setPort(5672);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        String message = "Hello!";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");
        channel.close();
        connection.close();
    }
}

ls /usr/lib/rabbitmq/bin
rabbitmqctl            管理工具
rabbitmq-defaults    默认参数设置
rabbitmq-env        环境配置
rabbitmq-plugins    插件管理工具
rabbitmq-server        rabbitmq服务
/usr/share/doc/rabbitmq-server-3.5.6/rabbitmq.config.example rabbitmq配置文件

RabbitMQ 集群与高可用配置

7.在22、25上开启 RabbitMQ 监控插件:
rabbitmq-plugins enable rabbitmq_management

7.1 192.168.12.22操作
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.12.25:/cacti/

7.2 192.168.12.25操作
然后将192.168.12.22中的该文件拷贝到192.168.12.25,最后将权限和所属用户/组修改回来:,最后将权限和所属用户/组修改回来:
mv .erlang.cookie /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie
使用 -detached 参数运行各节点
rabbitmqctl stop
rabbitmq-server -detached
8.组成集群
将192.168.12.22与192.168.12.25组成集群,如果有多个节点就在每个节点上都运行一下命令
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@lvs-web2
rabbitmqctl start_app
9.查看集群是否配置成功
rabbitmqctl cluster_status

Cluster status of node 'rabbit@lvs-web2' ...
[{nodes,[{disc,['rabbit@lvs-web1','rabbit@lvs-web2']}]},
 {running_nodes,['rabbit@lvs-web1','rabbit@lvs-web2']},
 {cluster_name,<<"rabbit@lvs-web2">>},
 {partitions,[]}]
10.设置镜像队列策略
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'