(三)RabbitMQ集群(Ⅰ)
安裝RabbitMQ:https://blog.csdn.net/ycj_xiyang/article/details/79926586
RabbitMQ集群(Ⅱ):https://blog.csdn.net/YCJ_xiyang/article/details/79958507
什么是集群?什么是分布式?
分布式:一個業務分拆多個子業務,部署在不同的服務器上????集群:同一個業務,部署在多個服務器上?
RabbitMQ基于erlang語言開發,而erlang是一門分布式語言開發,適用于集群開發;rabbitmq自身也提供了多種集群方案:http://www.rabbitmq.com/ha.html?
?
??1.集群管理:沒有明顯的主從,主要的是disk和ram節點的區別
??2.做集群的需求:不支持跨網段(erlang限制)
??3.集群類型:普通集群、鏡像集群
????普通集群:結構同步,消息實體只存在一個節點中,但consumer在非消息節點獲取是,節點間存在消息拉取,易產生性能瓶頸。
????鏡像集群:集群中一個master,負責調度,處理消息實體,其他節點保存一份數據到本地;性能主要靠master承載。
??4.持久化,分兩部分:
????Rabbitmq服務器配置持久化:默認的就是持久化(disc類型);
????代碼持久化:默認情況下,代碼創建的消息隊列和存放在隊列里的消息都是非持久化的,需要在建立隊列時指定。
啟動節點
? ? 一共三種啟動方式
????? ? 一般啟動:service rabbitmq-server satrt
????? ? 前臺啟動:rabbitmq-server
?????????????????????????如果當前的窗口終結,則這個服務會退出
????? ? 后臺啟動:rabbitmq-server -detached
同步Erlang cookie
????集群中node必須使用相同的cookie才能相互通訊
? ??????cookie的位置一般在 /var/lib/rabbitmq/.erlang.cookie(內容任意)
查看集群的狀態
? ? rabbitmqctl cluster_status????
[root@h101 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@h101 ... [{nodes,[{disc,[rabbit@h101]}]},{running_nodes,[rabbit@h101]},{cluster_name,<<"rabbit@h101.temp">>},{partitions,[]}] [root@h101 ~]# [root@h102 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@h102 ... [{nodes,[{disc,[rabbit@h102]}]},{running_nodes,[rabbit@h102]},{cluster_name,<<"rabbit@h102.temp">>},{partitions,[]}] [root@h102 ~]#創建集群
? ? 集群中node是平等的,新node可以選擇任意一個節點加入
? ? 加入集群分三步(更多的節點加入也是一樣的方法)
????????首先關閉本地應用?rabbitmqctl stop_app
[root@h101 ~]# rabbitmqctl stop_app Stopping node rabbit@h101 ...? ? ????加入集群 rabbitmqctl join_cluster 節點名
? ? ????啟動應用 rabbitmqctl start_app
[root@h102 ~]# rabbitmqctl start_app Starting node rabbit@h102 ... [root@h102 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@h102 ... [{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},{running_nodes,[rabbit@h101,rabbit@h102]},{cluster_name,<<"rabbit@h101.temp">>},{partitions,[]}] [root@h102 ~]# [root@h101 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@h101 ... [{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},{running_nodes,[rabbit@h102,rabbit@h101]},{cluster_name,<<"rabbit@h101.temp">>},{partitions,[]}] [root@h101 ~]#重啟集群node
? ? 加入集群的節點可以任意關停、下線或宕機
關閉h101
[root@h101 ~]# rabbitmqctl stop Stopping and halting node rabbit@h101 ... [root@h101 ~]#
h101上的日志
=INFO REPORT==== 23-Mar-2018::22:19:33 === Stopping RabbitMQ=INFO REPORT==== 23-Mar-2018::22:19:33 === stopped TCP Listener on [::]:5672=INFO REPORT==== 23-Mar-2018::22:19:33 === Stopped RabbitMQ application=INFO REPORT==== 23-Mar-2018::22:19:33 === Halting Erlang VMh102上的日志 =INFO REPORT==== 23-Mar-2018::22:19:33 === rabbit on node rabbit@h101 down=INFO REPORT==== 23-Mar-2018::22:19:33 === Keep rabbit@h101 listeners: the node is already back=INFO REPORT==== 23-Mar-2018::22:19:34 === node rabbit@h101 down: connection_closedh102上的集群狀態
[root@h102 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@h102 ... [{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},{running_nodes,[rabbit@h102]},{cluster_name,<<"rabbit@h101.temp">>},{partitions,[]}] [root@h102 ~]#啟動h101
[root@h101 ~]# /etc/init.d/rabbitmq-server start Starting rabbitmq-server: SUCCESS rabbitmq-server. [root@h101 ~]#h102上的日志
=INFO REPORT==== 23-Mar-2018::22:26:04 === node rabbit@h101 up=INFO REPORT==== 23-Mar-2018::22:26:05 === rabbit on node rabbit@h101 uph102上的集群狀態
[root@h102 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@h102 ... [{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},{running_nodes,[rabbit@h101,rabbit@h102]},{cluster_name,<<"rabbit@h101.temp">>},{partitions,[]}] [root@h102 ~]#h101上的集群狀態
[root@h101 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@h101 ... [{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},{running_nodes,[rabbit@h102,rabbit@h101]},{cluster_name,<<"rabbit@h101.temp">>},{partitions,[]}] [root@h101 ~]#拆分集群
? ? 本地退出
????? ? 移除某個node分三步
????????? ? 停止本地應用 rabbitmqctl stop_app
????????? ? 重啟node rabbitmqctl reset
????????? ? 啟動應用 rabbitmqctl start_app
? ? 遠程剔除
????????? ? 無法響應的node,一段時間里無法交互,可以從集群中剔除
????????????? ? 首先停掉本地應用 rabbitmqctl stop_app
????????????? ? 在另一個服務上進行剔除 rabbitmqctl forget_cluster_node 無法響應的節點名
[root@h102 ~]# rabbitmqctl forget_cluster_node rabbit@h101 Removing node rabbit@h101 from cluster ... [root@h102 ~]#???????????????此時在另一個服務上無法響應的節點已經剔除,但是無法響應的節點還認為自己是集群的一部分,一旦它的應用恢復,它會嘗試與集群聯絡,從而報錯
[root@h101 ~]# rabbitmqctl start_app Starting node rabbit@h101 ...BOOT FAILED ===========Error description:{error,{inconsistent_cluster,"Node rabbit@h101 thinks it's clustered with node rabbit@h102, but rabbit@h102 disagrees"}}Log files (may contain more information):/var/log/rabbitmq/rabbit@h101.log/var/log/rabbitmq/rabbit@h101-sasl.logStack trace:[{rabbit_mnesia,check_cluster_consistency,0},{rabbit,'-start/0-fun-0-',0},{rabbit,start_it,1},{rpc,'-handle_call_call/6-fun-0-',5}]Error: {error,{inconsistent_cluster,"Node rabbit@h101 thinks it's clustered with node rabbit@h102, but rabbit@h102 disagrees"}} [root@h101 ~]#?????解決的辦法是 ?一旦有機會連上無法響應的節點,就對它進行重置
[root@h101 ~]# rabbitmqctl reset Resetting node rabbit@h101 ... [root@h101 ~]# rabbitmqctl start_app Starting node rabbit@h101 ... [root@h101 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@h101 ... [{nodes,[{disc,[rabbit@h101]}]},{running_nodes,[rabbit@h101]},{cluster_name,<<"rabbit@h101.temp">>},{partitions,[]}] [root@h101 ~]#??????????????????
?????????????????
總結
以上是生活随笔為你收集整理的(三)RabbitMQ集群(Ⅰ)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有一个函数y=x(x「1),y=2x-1
- 下一篇: 苹果7【】闪存测试软件,教你如何查看自己