历史:
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"}'