RabbitMQ 集群与网络分区(理论知识)
关于network partition
网络设备故障导致的网络分裂。比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连。若两个子网间的交换机故障了即发生了网络分区,A\B和C\D\E便不能通讯。
某些系统是partition-tolerant的,也即,即使发生了网络分区系统分裂为了多个子系统,整个系统仍能正常工作。
RabbitMQ cluster不能很好地处理Network Partition。RabbitMQ将queue、exchange、bindings等信息存储在Erlang的分布式数据库Mnesia中。所以出现Network partition时RabbitMQ的众多行为与Mnesia的行为密切相关。
Network Partition的检测
若某一node在一段时间内(取决于net_ticktime的设置)不能与另一node取得联系,则Mnesia认为未能与之取得联系的node宕掉了。若两个node彼此恢复联系了,但都曾以为对方宕掉了,则Manesia断定发生过Network partition。
发生Network Partition后RabbitMQ的行为
若发生了network partition,cluster中的双方(或多方)将独立存在,每一方都将认为其他方已经崩溃了。Queues、bindings、exchanges可以各自独立的创建、删除。对于Mirrored queues,处于不同network partition的每一方都会拥有各自的master,且各自独立的读写。(也可能发生其他诡异的行为)。若network partition恢复了,cluster的状态并不能自动恢复到network partition发生前的状态,直至采取措施进行修复。
由suspend/resume引起的 partitions
只要cluster中的不同node自身没有失效但之间的通信发生了中断都可认为是发生了Partitions。比如,整个OS的挂起会导致其中的cluster nodes的挂起,但这些nodes却不认为自身失效或停止了,而cluster中的其它nodes不能与之取得联系,会认为这些nodes down掉了。举个例子:若cluster中的一个node运行在笔记本电脑上,合上电脑屏幕就有可能导致node挂起。另外,若cluster中的node运行在虚拟机中,则管理程序可能导致虚拟机挂起,从而使node挂起。
如何从network partition中恢复
首先选一个最信任的partition,Mnesia使用该partition中的状态,其他partitions中发生的变化都将丢失。
停止其他partitions中的所有nodes,之后重启这些nodes。当这些nodes重新加入cluster后将从信任的partition恢复状态。
最后还需重启信任的partition中的所有nodes以清除network partition的警告信息
RabbitMQ自动处理partitions
RabbitMQ提供了两种自动处理network partitions的方式:pause-minority模式和autoheal模式(默认为ignore模式,也即需要手工处理)
在pause-minority模式下,察觉其他nodes down掉后RabbitMQ将自动暂停认为自己是少数派的 nodes(例如小于或等于总nodes数的一半),network partition一旦发生,“少数派”的nodes将立刻暂停,直至partition结束后重新恢复。这可以保证在network partition发生时,至多只有一个partition中的nodes继续运行。(牺牲可用性保证一致性)
在autoheal模式下一旦发生了partition,RabbitMQ将自动确定一个优胜partition,然后重启所有不在优胜partition中的nodes。获胜的partition为拥有最多客户端连接的partition(若连接相同则为节点最多的partition)。关于自动处理partitions的设置在配置文件的cluster_partition_handling参数中进行。
两种自动处理partitions模式的适用场景
network partitions自动处理并不能保证cluster不出任何问题。一般来说可作如下选择:
ignore:若网络非常可靠。所有nodes在同一机架,通过交换机连接,该交换机也是通往外部网络的出口。在cluster的某一部分故障时不希望其余部分受影响。或者cluster只有两个node。
pause_minority:网络较不可靠。cluster处于EC2的3个AZ中,假定每次至多只有其中一个AZ故障,想要剩余的AZ继续提供服务而故障的AZ中的nodes在AZ恢复后重新自动加入到cluster。
autoheal:网络很不可靠。与数据完整性相比更关注服务的持续性。cluster只有两个node。
关于pause-minority模式
暂停的nodes上Erlang VM将继续运行但不监听任何端口或者做其他工作。它们将每秒检测一次cluster中的其他nodes是否可见,若可见则从pause状态唤醒。
注意:
nodes在启动时不会进入paused状态,即使是处于“少数派”;
RabbitMQ可能会暂停非严格意义上的“少数派”中的nodes。如,包含多于总nodes总数一半的nodes。因此在只包含两个nodes的cluster中使用pause-minority模式并非好主意,因为在network partition发生或者node失败时有可能两个node都会暂停。然而,在包含两个以上nodes的cluster中pause_minority模式要比ignore更安全;
对于因cluster nodes 挂起引起的partitions pause_minority模式无能为力。因为挂起的node将不能看到剩余node是否恢复“可见”,因而不能触发从cluster中断开。
RabbitMQ 集群与网络分区(理论知识)的更多相关文章
- 【rabbitmq】RabbitMQ 集群与网络分区
网络分区(network partitions) 官网-网络分区 网络设备故障导致的网络分裂.比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连.若 ...
- Centos6.9下RabbitMQ集群部署记录
之前简单介绍了CentOS下单机部署RabbltMQ环境的操作记录,下面详细说下RabbitMQ集群知识,RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言, ...
- 高可用rabbitmq集群服务部署步骤
消息队列是非常基础的关键服务,为保证公司队列服务的高可用及负载均衡,现通过如下方式实现: RabbitMQ Cluster + Queue HA + Haproxy + Keepalived 3台ra ...
- Docker swarm结合Openresty部署rabbitmq集群
Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...
- 基于Kubernetes(k8s)的RabbitMQ 集群
目前,有很多种基于Kubernetes搭建RabbitMQ集群的解决方案.今天笔者今天将要讨论我们在Fuel CCP项目当中所采用的方式.这种方式加以转变也适用于搭建RabbitMQ集群的一般方法.所 ...
- CentOS7安装RabbitMQ集群
实验环境 RabbitMQ 集群 server1.example.com IP: 10.10.10.11 Node: diskserver2.example.com IP: 10.1 ...
- RabbitMQ集群和失败处理
RabbitMQ内建集群的设计用于完成两个目标:允许消费者和生产者在RabbitMQ节点在奔溃的情况下继续运行,以及通过添加更多的节点来线性扩展消息通信的吞吐量.当失去一个RabbitMQ节点时客户端 ...
- 用 HAproxy 搭建 RabbitMQ 集群
构建参考: [ Rabbitmq cluster setup with HAproxy ] [ python demo ] RabbitMQ Cluster 遇到的问题 python pika 作为c ...
- RabbitMQ 集群原理和完善
一.RabbitMQ集群方案的原理 RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现 ...
随机推荐
- 项目群MSP课程最大的特点
1.课程中间让大家去了解和理解项目群管理的知识体系.方法论,更关注大家的个性化需求: 2.课程中间还会有很多练习和讨论,特别是会请到一些业界在实践MSP的客户,进行他们的实践案例分享.所以从知识到实际 ...
- Tihinkphp3.2整合最新版阿里大鱼进行短信验证码发送
阿里大鱼最新下载地址:阿里大鱼SDK下载 或者从官网进行下载:阿里大鱼SDK官网下载 下载完成后,将压缩包内的api_sdk文件夹放到ThinkPHP\Library\Vendor目录下,修改文件名为 ...
- 更改一个链接的文本、URL 以及 target
<html> <head> <script type="text/javascript"> function changeLink() { do ...
- for 循环为何可恨?
Java的闭包(Closure)特征最近成为了一个热门话题. 一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征. 然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈 ...
- mysql统计类似SQL语句查询次数
mysql统计类似SQL语句查询次数 vc-mysql-sniffer 工具抓取的sql分析. 1.先用shell脚本把所有enter符号替换为null,再根据语句前后的字符分隔语句 grep -Ev ...
- golang基础- ElasticSearch搜索引擎、kibana可视化工具、向ES输出数据
转载自:https://blog.csdn.net/u013210620/article/details/78647366 安装ElasticSearch ElasticSearch是一个基于Luce ...
- DELETE_FAILED_INTERNAL_ERROR Error while Installing APK
真是Android2.3的特殊版本问题,问题原因是android2.3的instant run的测试版安装方式有所特别,解决办法有2: 1.手动adb install 安装包 2.把Instant r ...
- 8人/天,小记一次 JAVA(APP后台) 项目改造 .NET 过程(后台代码已完整开源于 Github)
Github: https://github.com/iccb1013/Jade.Net 我们只消耗了8人/天的时间,完成了全部工作,基于我们 Jade.Net 的开源后台代码,任何小规模的后台管理系 ...
- 高性能网络IO模型
同步阻塞式IO开发简单,但在处理IO密集的并发任务时,非常浪费CPU资源,性能低:并且,当一个进程(线程)含有多个套接字上时,同步阻塞式IO会带来问题:因为同步阻塞式IO只支持进程(线程)阻塞在一个套 ...
- 从一个微型例子看“C/C++的内存分配机制”和“数组变量名与指针变量名”(转)
C++的内存有五大分区:堆区.栈区.自由存储区.全局/静态存储区.常量存储区. 五个数据段:数据段.代码段.BSS段.堆.栈 内存分配方式有三种: 从静态存储区域分配.内存在程序编译的时候就已经分配好 ...