除了HAProxy,RabbitMQ集群还可以这样用

全网最简单的安装手册

<code>// 安装erlang
wget https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh
bash>

配置用户

<code>rabbitmqctl  add_user username passwd  // 添加用户
rabbitmqctl  set_user_tags username administrator  // 给用户分配权限
rabbitmqctl  list_users  // 查看系统中有哪些用户/<code>

启用web控制台

<code>sudo rabbitmq-plugins list // 查看启用了哪些插件
sudo rabbitmq-plugins enable rabbitmq_management  // 启用Web管理界面,默认端口是15672/<code>

经过上述几个步骤,打开浏览器,输入服务器的ip和端口,就能看到久违的登录界面了。


除了HAProxy,RabbitMQ集群还可以这样用

配置集群

至少需要两个节点才能组成集群,简单起见,就选两台啦。在另一台服务上,重复上面的安装过程,配置用户和管理界面步骤可以略过。

复制前一台服务器上的cookie到新安装的这台服务器,cookie所在目录为:/var/lib/rabbitmq/.erlang.cookie。

Tips:如果copy,需要注意.erlang.cookie文件的权限必须是400。同时,不要用vim编辑器编辑,会留下换行符导致cookie不一致。cookie文件的大小为20字节。上述两个小问题,确实困扰了笔者挺长时间,导致安装不成功。

<code>sudo rabbitmqctl cluster_status  // 查看集群状态
sudo rabbitmqctl stop_app  // 停止app
sudo rabbitmqctl join_cluster rabbit@ip-10-0-5-62  // 把当前节点添加到集群中
sudo rabbitmqctl start_app  // 启动app/<code>

通过简单的几步,这两台服务器已经组成集群了。登录web控制台,效果如下:

除了HAProxy,RabbitMQ集群还可以这样用

节点之间同步配置信息,关于集群的特点,这是最正确的描述。其他的一些特性,都是可配置的,例如内存节点、磁盘节点;镜像模式等;持久化等等。在可用性和性能之间,用不同的配置,做相应的取舍。这方面的话题,后续展开介绍,敬请关注。

代理中间件

在上一章节中介绍了集群的安装,纵观网上绝大多数的教程,到这里并没有结束,还有很重要的一步,那就是HAProxy+KeepAlived。笔者并没有研究过HAProxy,更别提KeepAlive了,看到这样的东东一脸懵逼。好在业务运行在云上,云服务上有TCP层的负载均衡(LB)组件,用LB代替HAProxy+KeepAlive是一样的。结构如下:

除了HAProxy,RabbitMQ集群还可以这样用

从体系结构的角度考虑,集群中的节点是对等的,即客户端连接任意一个节点都能正常工作,因为只有这样,我们才能用粗暴的负载均衡器做代理。

从实现的细节看,也却是如此。对生产者来说,发送给那个节点并不重要,路由到相应的queue master节点存储即可。消费者若是连接到了master节点,直接取数据即可;如果连接到非master节点,创建一个master节点到目标节点的通道传输数据。

在软件架构实践中,这是非常普遍的一种模式,例如调用微服务的多个实例、例如访问某个域名对应的多个IP地址,例如eureka注册中心等,有些用了中心化的代理中间件,有些则是在客户端实现的。同样的道理,访问rabbitmq集群,除了常见的代理中间件,也可采用客户端代理实现。

除了HAProxy,RabbitMQ集群还可以这样用


客户端代理

支持多个地址

通常,初始化ConnectionFactory只能接受一个地址。这么看来,用官方SDK完成客户端代理,要重写基础的访问组件了,这条路肯定是没有错的,就像sharding-jdbc。仔细研究官方提供的API文档,ConnnectionFactory有个newConnection函数,是可以传入一个地址列表的,实现逻辑如下

<code>factory.newConnection(addresses);/<code>
除了HAProxy,RabbitMQ集群还可以这样用

根据地址列表依次创建连接,直到创建成功为止。Tips:这段代码并不优雅,如果直接用到这段代码,会客户端都连接到第一个正常的节点。

恢复连接

ConnectFactory个重要的功能,那就是自动恢复连接,代码很简单,在4.0版本以后是默认开启的。按照官方的解释,在连接失败后,可以做到打开连接、恢复连接上的listeners、重新创建channel、恢复channel上的listeners以及配置信息。

<code>factory.setAutomaticRecoveryEnabled(true);/<code>

结合这两个特性,经测试,集群中的节点宕机后,确实可以重新连接到另一个节点。但是,中间有一段时间连接是中断的,生产者发送消息,会连续失败!

补丁

为了解决这个问题,在生产者增加重试机制,问题得到解决。发送消息失败后,要等待创建连接和channel,重新发送消息。

<code>public void send(String exchange, MQMessage message) {
    try {
        sentMsg(exchange, message);
    } catch (Exception ex) {
        connnect();
        sentMsg(exchange, message);
    }
}/<code>

到此为止,验证了通过客户端代理模式访问rabbitmq集群。但是,笔者在生产中真不敢这么用。你知道有哪些好用的客户端中间件吗?欢迎留言讨论。


分享到:


相關文章: