序言

清风万里的季节,周末本该和亲人朋友一起消遣这烂漫的花花草草,或是懒洋洋的晒个太阳听听风声鸟鸣。无奈工作使然,理想使然,我回到啦公司,敲起啦键盘,撸起啦代码,程序狗的世界一片黯然,一片黯然,愿天下所有努力的程序狗都梦想成真吧!!

回到正题,为什么搭建rabbitmq集群?rabbitmq集群有那些模式?如何搭建Rabbitmq集群?rabbitmq镜像高可用策略有那些?

1、首先这款产品本身的优点众多,大家最看好的便是他的异步化提高系统抗峰值能力,然后便是系统及功能结构解耦,那么照此两点来说,他的在整个系统中的作用还是至关重要的,那么如此重要,当然要考虑他的高可用性,那么便有啦第一个问题的解答。

2、rabbitmq有3种模式,但集群模式是2种。详细如下:

  • 单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。
  • 普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
  • 镜像模式:把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。

准备集群环境安装RabbitMQ

我的环境如下:

1、两台Centos7的机器,hostname分别为:F , G .

2、IP地址分别为:F—172.18.8.229 , G—172.18.8.224。

3、修改hosts文件如下,下面是G这台机器的hosts文件内容,F也需要如下配置:

[root@G bin]# cat /etc/hosts
127.0.0.1 G localhost localhost.localdomain localhost4 localhost4.localdomain4
:: G localhost localhost.localdomain localhost6 localhost6.localdomain6 172.18.8.224 G
172.18.8.229 F

4、保证两台机器都能够相互ping通,如下图:

好啦,环境到此就就能满足啦,接下来我们把rabbitmq装在2台机器上。

学习不看官方文档,那就别学啦,地址如下:http://www.rabbitmq.com/install-rpm.html

安装rabbitmq依赖erlang环境,所以我们要先安装erlang环境。

安装完成之后,下载rabbitmq的rpm包ivh即可。如果实在不会安装,Linux系统(二)软件的安装与卸载 里面有安装rabbitmq的实例,看官笑纳,实在不会装那加入左上方群,或者点击网页右上方的X吧,一定要相信不是你的错,是你与rabbitmq缘分不到。

安装启动过程中如果出现error,那可参考下面几个方案试试:

  • vim /etc/rabbitmq/enable_plugins :删除文件中的内容。
  • 查看hosts文件是否配置完善,相互是否可以ping通
  • 查看相关端口是否被占用,如若占用kill掉
  • 如果已经集群,那么要查看所有集群中的/var/lib/rabbitmq/.erlang.cookie是否一致。
  • 如果不存在上述文件,echo $HOME ,打开此文件夹,查看cookie文件是否一致。
  • 重启电脑,防止缓存数据配置未更新过来。

这里安装启动成功之后,来几个常用的操作。

[root@G bin]# ./rabbitmq-server -deched  --后台启动服务
[root@G bin]# ./rabbitmqctl start_app --启动服务
[root@G bin]# ./rabbitmqctl stop_app --关闭服务
[root@G bin]# ./rabbitmq-plugins enable rabbitmq_management --启动web管理插件
[root@G bin]# ./rabbitmqctl add_user zlh zlh --添加用户,密码
[root@G bin]# ./rabbitmqctl set_user_tags zlh administrator --设置zlh为administrator权限

如果你看到如下操作,即表明启动成功啦,并且web管理页面的插件也启动成功,如果下面的6为0,则需要启动web管理插件

那具体rabbitmqctl 的命令详细还要看官网文档:http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

搭建rabbitmq的一般模式集群

在上述的两台机器上安装rabbitmq完成之后,你可以看到你的机器中有如下1个文件。路径在$HOME中或者在/var/lib/rabbitmq中,文件名称为.erlang.cookie,他是一个隐藏文件。那么这文件存储的内容是什么,是做什么用的呢?

这样说吧:RabbitMQ的集群是依赖erlang集群,而erlang集群是通过这个cookie进行通信认证的,因此我们做集群的第一步就是干cookie。怎么干?

1、必须使集群中也就是F,G这两台机器的.erlang.cookie文件中cookie值一致,且权限为owner只读。

机器G中的Cookie: 机器F中的Cookie:

修改文件权限如下:

[root@F ~]# chmod 600 .erlang.cookie

2、查看集群状态,我的是已经做好的。

[root@F bin]# ./rabbitmqctl cluster_status
Cluster status of node rabbit@F ...
[{nodes,[{disc,[rabbit@G]},{ram,[rabbit@F]}]},
{running_nodes,[rabbit@G,rabbit@F]},
{cluster_name,<<"rabbit@F">>},
{partitions,[]},
{alarms,[{rabbit@G,[]},{rabbit@F,[]}]}]

3、停止当前机器中rabbitmq的服务

[root@F bin]# ./rabbitmqctl stop_app

4、把G中的rabbitmq加入到集群中来

[root@F bin]# ./rabbitmqctl join_cluster --ram rabbit@G

5、开启当前机器的rabbitmq服务

[root@F bin]# ./rabbitmqctl start_app

6、打开网页管理页面查看nodes

如此便可以啦,你可以做下测试,验证下我们序言中说的普通模式的说明,那必须是杠杠对的。

搭建rabbitmq的镜像高可用模式集群

写到这里,接下来,有朋友要请我吃饭啦,我就速战速决赴会去啦,即便如此该有的也会都有的。go,go,go。

这一节要参考的文档是:http://www.rabbitmq.com/ha.html

首先镜像模式要依赖policy模块,这个模块是做什么用的呢?

policy中文来说是政策,策略的意思,那么他就是要设置,那些Exchanges或者queue的数据需要复制,同步,如何复制同步?对就是做这些的。

这里有点内容的,我先上例子慢慢说:

[root@G ~]# ./rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

参数意思为:

ha-all:为策略名称。

^:为匹配符,只有一个^代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue。

ha-mode:为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如["3rabbit@F","rabbit@G"]这样指定为F与G这2台机器。)。

参考示例如下

当然在web管理界面也能配置:

配置完看队列如下,其中表示ha-haall的说明用我的ha-haall策略啦,属于镜像模式,没有表示的就是普通模式:

总结

接下来是大家最喜欢的总结内容啦,内容有二,如下:

1、希望能关注我其他的文章。

2、博客里面有没有很清楚的说明白,或者你有更好的方式,那么欢迎加入左上方的2个交流群,我们一起学习探讨。

Rabbitmq集群高可用部署详细的更多相关文章

  1. Rabbitmq集群高可用测试

    Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...

  2. Rabbitmq集群高可用

    转载:https://www.cnblogs.com/flat_peach/archive/2013/04/07/3004008.html RabbitMQ是用erlang开发的,集群非常方便,因为e ...

  3. Centos 7 RabbitMQ + Haproxy 集群高可用部署

    一.   功能和原理介绍 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionSc ...

  4. 原创hadoop2.6.4 namenode HA+Federation集群高可用部署

    今天下午刚刚搭建了一个高可用hadoop集群,整理如下,希望大家能够喜欢.   namenode HA:得有两个节点,构成一个namenode HA集群 namenode Federation:可以有 ...

  5. bitmq集群高可用测试

    Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...

  6. openstack pike 集群高可用 安装 部署 目录汇总

    # openstack pike 集群高可用 安装部署#安装环境 centos 7 史上最详细的openstack pike版 部署文档欢迎经验分享,欢迎笔记分享欢迎留言,或加QQ群663105353 ...

  7. RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列

    系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...

  8. RabbitMQ从零到集群高可用(.NetCore5.0) -高可用集群构建落地

    系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...

  9. 浅谈MySQL集群高可用架构

    前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...

随机推荐

  1. double减法不准确的那些事儿

    CREATE TABLE `helei` (   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `num1` double DEFAULT NULL ...

  2. Canvas 图片灰度

    我们可以通过下面几种方法,将其转换为灰度: 1.浮点算法:Gray=R*0.3+G*0.59+B*0.11 2.整数方法:Gray=(R*30+G*59+B*11)/100 3.移位方法:Gray = ...

  3. JavaScript基础:创建对象

    先来看两种简单的对象创建方式: 1.Object构造函数方法 var person = new Object(); person.name = "Nicholas"; person ...

  4. oracle的位图索引和函数索引

    1.位图索引 位图索引适用于性别.婚姻状态.行政区等只有几列固定值的类型列,身份证号等就不适合位图索引,位图索引适用于静态数据,频繁更新的字段不适用建立位图索引,因为更新会导致索引块区的变更,还会引起 ...

  5. Oracle RAC学习笔记01-集群理论

    Oracle RAC学习笔记01-集群理论 1.集群相关理论概述 2.Oracle Clusterware 3.Oracle RAC 原理 写在前面: 最近一直在看张晓明的大话Oracle RAC,真 ...

  6. C语言函数名与函数指针详解

    一.通常的函数调用 一个通常的函数调用的例子: /* 自行包含头文件 */ void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */ int main(in ...

  7. Android客户端连接服务器端,向服务器端发送请求HttpURLConnection

    在Java中想后台服务器发送请求一般都直接使用了Java的网络编程,或者使用HttpClient向后台服务器端发送HTTP请求.虽然在安卓中,所有Java的API都可以使用,而却使用其并不会出现什么问 ...

  8. Spring Boot 基础教程系列学习文档

    Spring Boot基础教程1-Spring Tool Suite工具的安装 Spring Boot基础教程2-RESTfull API简单项目的快速搭建 Spring Boot基础教程3-配置文件 ...

  9. Swift 网络请求数据与解析

    一: Swift 网络数据请求与处理最常用第三方 又有时间出来装天才了,还是在学swift,从中又发现一些问题,这两天上网找博客看问题弄的真的心都累.博客一篇写出来,好多就直接照抄,就没有实质性的把问 ...

  10. React库

    一.React概述 React是一个是一个开源的js库,用来为数据渲染视图的,由facebook,Instagram社区维护的.(例如美团.阿里.airbnb都在使用React开发) 为什么会出现Re ...