一.rabbitmq介绍
对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。
当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。
所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。
该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。
如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,然后就没有然后了
使用rabbitmq作为消息队列,经测试显示redis豌豆荚开源redis集群codis方案测试不成功,这里选择了rabbitmq集群,支持100t/s 。
3. 镜像模式:把需要的队列做成镜像队列,存在于多个节点上,属于RABBITMA集群
该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。
该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。
所以在对可靠性要求较高的场合中适用
设计架构:集群一般使用三个节点,一个磁盘节点,两个内存节点。这样设计速度更快。由于实验环境有限,仅仅做两台vm部署。集群搭建:
[root@kvm ~]#yum -y install erlang
注:rabbitmq是用erlang语言开发的,所以erlang作为rabbitmq的依赖包
[root@kvm ~]# yum install -y rabbitmq-server –y
[root@kvm~]# systemctl start rabbitmq-server
[root@kvm~]# systemctl enable rabbitmq-server
启动web管理界面的插件,静态html页面
[root@kvm~]# rabbitmq-plugins enable rabbitmq_management
两台机器做同样的操作
二.配置rabbitmq集群
在kvm上
more /var/lib/rabbitmq/.erlang.cookie
把.erlang.cookie里面的文家拷贝num2,两个文家保持一样。
解释:
Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信。