为何需要分析区别?
理解 集群节点 存储类型 有利于理解 集群中各个模式的运行机制; 从而根据自己业务 选择不同存储类型的节点 和 选择 持久化或非持久化 的队列;
官方原文链接:https://www.rabbitmq.com/clustering.html#cluster-node-types
磁盘节点和 内存节点(Disk and RAM Nodes)
一个节点可以是内存或磁盘节点类型;内存节点只在内存中存储 内部数据库表, 不包括 消息,消息存储索引,队列索引和其他节点状态;
多少情况下,用户会希望所有节点是 磁盘节点; 内存节点是一种特殊的存储类型,主要用来 通过 exchange(交换机),binding churn,队列 等提高集群性能; 内存节点 不会提高消息速率.当有疑问时,请只使用磁盘节点
使用内存节点的集群(Clusters with RAM nodes)
内存节点只将 元数据 保存在内存中. 内存节点 不用像磁盘节点那样写入磁盘,因此 可以表现的更优秀. 然而, 由于持久化队列的数据 总是存储在磁盘上,所有 只会对资源管理(如添加删除 队列,交换机,vhost等)的 性能得以提升,对于 生产和消费 消息的速度不会有任何提升;
内存节点 是高级别用法;在用户设置第一个集群时,最好别用内存节点,用户应该 有足够的磁盘节点 出来荣誉的需求,然后 如果需要可以添加额外的 内存节点 用以扩展集群;
一个集群如果只有内存节点则不能提供稳定的服务;如果集群停止 会丢失 包括队列,交换机等等 任何所有的数据; rabbitmq在多少情况下会阻止创建只有内存节点的集群,但是 无法绝对阻止这种骚操作;
总结:
内存节点 只是 将 元数据 存在内存中; 磁盘节点 只是 将 元数据 存在磁盘中; 对于 队列(queue),消息(message) 的 持久化或非持久化 方式 和 磁盘节点/内存节点 没有任何关系,持久化就存磁盘,非持久化就存内存;
在持久化队列中,无论 选择哪种节点存储类型, 消息存取 速度没有任何区别; 言下 之意 在非持久化队列中, 消息存取会得到很大提升,但是 会出现 重启消息丢失的情况(无论节点存储类型);
因此 在 镜像模式中, 某些 非至关重要的 队列需求中,可以将 队列的 生产者 消费者 设置为 非持久化,再加上 好几个节点 进行容错, 在 只要不是狗屎运的情况下(所有节点都同时宕机),应该能 得到 很好的 消息存取速率,和保证消息不丢失;