上一篇文章提到,节点按照metadata的存储方式在集群中可以是RAM node 或者 disc node.这两种node有什么差别?在实际操作的时候又如何选择呢?本文回答这一问题.
RAM Node 的性能优势
在集群中声明(declare)创建exchange queue binding,这类操作要等到所有的节点都完成创建才会返回:如果是内存节点就要修改内存数据,如果是disk node 就要等待写磁盘,节点过多这里的速度就会被大大的拖慢.
有些场景exchang queue相当固定,变动很少,那即使全都是disc node,也没有什么影响.之前提到过使用Rabbitmq做RPC,如果是RPC或者类似RPC的场景这个问题就严重了,频繁创建销毁临时队列,磁盘读写能力就很快成为性能瓶颈了.
所以,大多数情况下,我们尽量把Node创建为RAM Node.这里就有一个问题了,要想集群重启后元数据可以恢复就需要把集群元数据持久化到磁盘,那怎么规划RabbitMQ集群中的RAM Node和Disc Node呢?
RAM Node or Disc Node
只要有一个节点是Disc Node 就能提供条件把集群元数据写到磁盘,RabbitMQ的确也是这样要求的:集群中只要有一个disk node就可以,其它的都可以是RAM node.节点加入或退出集群一定至少要通知集群中的一个disk node,来记录这种变动.这个在上一篇文章中我们做过这种实验:在只有RAM Node的情况下增加节点或者退出节点,各种混乱啊.
如果集群中disk node都当掉了,就不要变动集群的元数据(集群元数据有哪些?看上一篇文章).声明 exchange queue 修改用户权限,添加用户等等这些变动在节点重启之后无法恢复.
有一种情况要求所有的disk node都要在线情况在才能操作,那就是增加或者移除节点.RAM node启动的时候会连接到预设的disk node下载最新的集群元数据.如果你有两个disk node(d1 d2),一个RAM node加入的时候你只告诉d1,而恰好这个RAM node重启的时候d1并没有启动,重启就会失败.上一篇文章的测试中我们尝试让集群中的RAM节点先于其他的节点启动,RAM找不到可以下载集群元数据的disk node 就启动失败了.所以我们加入RAM节点的时候,把所有的disk node信息都告诉它,RAM node会把disk node的信息持久化到磁盘以便后续启动可以按图索骥.
./rabbitmq-util -n z_91@zen.com reset 在加入退出节点的时候会频繁用到reset命令.reset要完成的清理工作有:
[1] reset命令会将当前节点内的集群元数据全部清空.
[2] 告诉集群中的所有disc nodes:这个节点要退出集群了
第二步对于RabbitMQ集群很重要:如果不通知集群会认为这个节点当掉了,会等待这个节点恢复,如果要退出的节点是disk node,这种集群内部告知的重要性就更不言而喻了.
在集群元数据有变动的时候需要有disk node在线,但是在节点加入或退出的时候所有的disk node必须全部在线.如果没有正确退出disk node,集群会认为这个节点当掉了,在这个节点恢复之前不要加入其它节点.所以从节点中移除节点要慎之又慎,确保执行了reset.
最后,小图一张 她是卡米拉·贝勒 美国百万网友选出的四大“最美脸蛋”第一名 2011年12月被评为全球最美脸蛋第二名
全球最美脸蛋第一名是谁? Emma Watson