1. 程式人生 > >mq系列rabbitmq-02叢集+高可用配置

mq系列rabbitmq-02叢集+高可用配置

一。 rabbitmq 叢集高可用介紹

   rabbitmq的broker是由一個或者多個物理節點組成 rabbtmq程式之間共享使用者 虛擬主機 佇列 交換機,繫結和引數,也可以將多個節點

組合成一個叢集,所有的資料都會被拷貝到叢集中不同的節點 除了佇列資料  佇列資料可以通過一些策略分配到不同的節點 具體參考高可用佇列

對映(http://www.rabbitmq.com/ha.html)

二。 rabbitmq叢集

 參考文件

   http://www.rabbitmq.com/clustering.html

   http://www.rabbitmq.com/ha.html

1》叢集安裝

模擬環境 

192.168.58.149 node2
192.168.58.150 node3
192.168.58.151 node4
rabbitmq叢集需要通過主機名互相訪問 所以必須在三臺機器 /etc/hosts配置以上內容 確保主機名正確 

三臺機器使用rabbitmq進行通訊 使用的安全策略是 erlang.cookie 就是一個隨機字串 三個必須保持一致 否則 無法新增節點到叢集
該cookie檔案 可能位於  /var/lib/rabbitmq/.erlang.cookie 或者 ~/.erlang.cookie任何一臺機器(比如node1) 啟動

 service rabbitmq-server start 
拷貝生成的cookie檔案到node2和node3
scp ~/.erlang.cookie [email protected]:~/
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/
scp ~/.erlang.cookie [email protected]:~/
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/
分別三臺機器安裝 rabbitmq-server 具體參考(http://blog.csdn.net/liaomin416100569/article/details/78476783)
分別啟動三臺機器 三臺機器都執行
rabbitmq-server -detached
分別檢視叢集狀態 每個機器單獨的沒有關聯起來 所有各自就是各自的叢集

node2上(running_nodes表示執行的叢集 只有自己)

[[email protected] rabbitmq]# rabbitmqctl cluster_status
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected]]}]},
 {running_nodes,[[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]}]
...done.
node3上
[[email protected] ~]# rabbitmqctl cluster_status
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected]]}]},
 {running_nodes,[[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]}]
...done.
node4上
[[email protected] ~]# rabbitmqctl cluster_status
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected]]}]},
 {running_nodes,[[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]}]
...done.
建立叢集 叢集必須有一箇中心節點 所有的其他節點會被新增到這個中心節點 比如我這裡是node2 叢集有個叢集名稱 如果三個節點被新增到一個叢集中 叢集名稱必須是相同 預設的名字是rabbit 比如node2 一般在叢集中的叢集名 就是 叢集名@機器名 node2就是[email protected]將node3和node4 停止應用 新增到node2叢集中 重啟服務
[[email protected] ~]# rabbitmqctl stop_app
Stopping node [email protected] ...
...done.
[[email protected] ~]# rabbitmqctl join_cluster [email protected]
Clustering node [email protected] with [email protected] ...
...done.
[[email protected] ~]# rabbitmqctl start_app
Starting node [email protected] ...
...done.
任何一臺機器檢視叢集狀態 發現三臺叢集都加入了執行叢集中
[[email protected] ~]# rabbitmqctl cluster_status
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected],[email protected],[email protected]]}]},
 {running_nodes,[[email protected],[email protected],[email protected]]},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]}]
...done.

2》叢集維護

 》》 叢集重置

   如果需要將某個節點從叢集中移除 可以在當前節點 使用reset命令

 比如將node3節點移除(移除後集群狀態執行節點就只有自己了)

[[email protected] ~]# rabbitmqctl stop_app
Stopping node [email protected] ...
...done.
[[email protected] ~]# rabbitmqctl reset
Resetting node [email protected] ...
...done.
[[email protected] ~]# rabbitmqctl cluster_status
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected]]}]}]
...done.
如果某個中心節點被重置了 有可能一些其他節點無法重置可以使用
rabbitmqctl force_reset

rabbitmq支援遠端重置叢集 比如

假設 node2 網路中斷 (模擬 在node2上 執行 service network stop) 

node3執行

rabbitmqctl cluster_status
執行很長時間後 自動將叢集名稱 命名為  [email protected] 

》》其他維護命令 

  參考 (http://www.rabbitmq.com/cli.html  http://www.rabbitmq.com/man/rabbitmqctl.1.man.html)

三。 rabbitmq高可用

 rabbitmq的交換器等資料在所有叢集節點中共享比如在node2webgui上新增一個交換器test_ex


node3的webgui上檢視 發現多了test_ex交換器


試著新增使用者 bingding等 都會自動同步

但是當你試著去新增佇列時 發現新增介面有個選擇項 將佇列資訊新增到哪個節點上


新增後雖然你使用node3web檢視也能看到該佇列但是 該佇列的資料是被儲存在node2節點上

rabbitmq的高可用 也就是說 佇列以及佇列訊息資訊的高可用 防止一臺機器宕機後 佇列訊息的丟失

rabbitmq支援使用映象佇列(主從)模式將佇列通過某種策略匹配到不同的叢集節點上 交換器和繫結根據這些規則來獲取到對應的佇列

每個佇列都有主和從機(多個) 主負責讀寫 從用於備份

支援三種映象複製模式

ha-mode

ha-params

Result

all

(absent)

佇列對映到所有節點 新節點加入也會被對映

exactly

count

叢集中佇列的從機個數. 1就意味著沒從機 如果唯一節點掛了 意味著佇列無法訪問了,

數量 2意味 1主1從 如果主掛了 從自動接替稱為主,, 從機個數 = 配置引數- 1.

如果配置引數超過了叢集總節點數 預設是all對映到所有節點,如果指定數量節點掛了

其他節點自動成為它的從節點.

nodes

node names

指定由哪些節點稱為 從節點 比如linux rabbitmqctl set_policy ha-nodes "^nodes\." \
   '{"ha-mode":"nodes","ha-params":["[email protected]", "[email protected]"]}'

通過命令  rabbitmqctl set_policy 設定佇列複製的邏輯

該命令語法
rabbitmqctl set_policy ha-nodes "^nodes\." \
   '{"ha-mode":"nodes","ha-params":["[email protected]", "[email protected]"]}'

set_policy 策略名稱 匹配佇列名的正則表示式  被複制的方式(上面的ha-mode和引數)

以上三種模式舉例比如:

所有名字ha開頭的佇列都複製到所有的叢集主機

rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'
所有名字 two.開頭的佇列隨機複製到任意一臺叢集主機 數量應該是2 還有一個主機
rabbitmqctl set_policy ha-two "^two\." \
   '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
所有nodes開頭的佇列都複製到node2和node3
rabbitmqctl set_policy ha-nodes "^nodes\." \
   '{"ha-mode":"nodes","ha-params":["[email protected]", "[email protected]"]}'

四。 rabbitmqapi測試叢集和高可用
使用高可用two.開頭的自動複製到兩個節點測試

執行

rabbitmqctl set_policy ha-two "^two\." \
   '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

使用簡單模式釋出一個訊息
Pub.java程式碼

package cn.et.p6;

import java.io.IOException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * 訊息傳送者 - 生產者
 * @author jiaozi
 *
 */
public class Pub {
	/**
	 * 佇列名稱 應該以two.開頭
	 */
	private final static String QUEUE_NAME = "two.hello";
	public static void main(String[] args) throws Exception {
		//連線遠端rabbit-server伺服器
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("192.168.58.150");
		factory.setPort(5672);
		Connection connection = factory.newConnection();
		Channel channel = connection.createChannel();
		//定義建立一個佇列
		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		String message = "Hello World!";
		//傳送訊息
		channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
		System.out.println(" [x] Sent '" + message + "'");
		channel.close();
		connection.close();
	}

}
因為連線的 150(node3)所有 150是主機 剛好佇列名稱 是two.開頭 所以應該有個從機被複制 檢視佇列訊息


點選佇列名稱進入可以看到從節點 到底是哪臺


這裡 如果掛掉主節點node3  發現node2自動接管成為主節點

這裡訊息接受者 無論是從 node2,node3,node4都是可以消費的 

消費者測試

package cn.et.p6;

import java.io.IOException;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.QueueingConsumer;

/**
 * 訊息接受者 - 消費者
 * 
 * @author jiaozi
 *
 */
public class Rec {
	/**
	 * 獲取訊息佇列名稱
	 */
	private final static String QUEUE_NAME = "two.hello";
	/**
	 * 非同步接收
	 * @throws Exception 
	 */
	public static void asyncRec() throws Exception{
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("192.168.58.149");
		Connection connection = factory.newConnection();
		Channel channel = connection.createChannel();
		//消費者也需要定義佇列 有可能消費者先於生產者啟動 
		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
		//定義回撥抓取訊息
		Consumer consumer = new DefaultConsumer(channel) {
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
					byte[] body) throws IOException {
				String message = new String(body, "UTF-8");
				System.out.println(" [x] Received '" + message + "'");
			}
		};
		channel.basicConsume(QUEUE_NAME, true, consumer);
	}
	public static void main(String[] args) throws Exception {
		asyncRec();
	}
}
如果 150掛掉 程式碼中需要重連其他的機器 所以需要定義叢集叢集中所有機器 這裡生產者和消費者連線程式碼相同 只貼出生產者
package cn.et.p6;

import java.io.IOException;

import com.rabbitmq.client.Address;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * 訊息傳送者 - 生產者
 * @author jiaozi
 *
 */
public class Pub {
	static Address[] addresses=new Address[]{
			new Address("192.168.58.149"),
			new Address("192.168.58.150"),	
			new Address("192.168.58.151")	
		};
	/**
	 * 佇列名稱 應該以two.開頭
	 */
	private final static String QUEUE_NAME = "two.hello";
	public static void main(String[] args) throws Exception {
		//連線遠端rabbit-server伺服器
		ConnectionFactory factory = new ConnectionFactory();
		factory.setPort(5672);
		//預設自動恢復重連 http://www.rabbitmq.com/api-guide.html#recovery
		factory.setAutomaticRecoveryEnabled(true);
		//連線不上之後 多少毫秒重連
		factory.setNetworkRecoveryInterval(10000);
		//不會負載均衡只會抓取第一個可用的連線 
		Connection connection = factory.newConnection(addresses);
		Channel channel = connection.createChannel();
		//定義建立一個佇列
		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		String message = "Hello World!";
		//傳送訊息
		channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
		System.out.println(" [x] Sent '" + message + "'");
		channel.close();
		connection.close();
	}

}
預設只是抓取可以連線的第一個伺服器 預設可以自己實現一個客戶端負責均衡器  弄成rr輪詢(連不上就輪詢下一個 重寫該類 重寫newConnection方法)


這裡我就懶得去實現了  也可以使用第三方反向代理來負載均衡 比如nginx或者haproxy或者lvs+keepalived

相關推薦

mq系列rabbitmq-02叢集+可用配置

一。 rabbitmq 叢集高可用介紹    rabbitmq的broker是由一個或者多個物理節點組成 rabbtmq程式之間共享使用者 虛擬主機 佇列 交換機,繫結和引數,也可以將多個節點 組合成一個叢集,所有的資料都會被拷貝到叢集中不同的節點 除了佇列資料  佇列資料

HaProxy+keepalived+mycat叢集可用配置

部署圖 叢集部署圖的理解: 1、keepalived和haproxy必須裝在同一臺機器上(如172.17.210.210.83機器上,keepalived和haproxy都要安裝),keepalived負責為該伺服器搶佔vip(虛擬ip),搶佔到vip後,對該主機的訪問

rabbitmq+haproxy 叢集可用

環境 主機 192.168.2.47      hidden1(主機名) 主機 192.168.2.48      hidden2 (主機名) 介紹:1, 先兩臺主機更改好主機名 2,部署單機rabbitmq   3,然後再加入 叢集 一,rabbitmq 單機安裝(兩臺主

eureka叢集可用配置

網上講這個東西的很多,抄來抄去的,大部分類似,多數沒講明白為什麼那麼配置。譬如eureka.client.register-with-eureka和fetch-registry是否要配置,配不配區別在哪裡;eureka的客戶端新增service-url時,是不是需要把所有的e

ZooKeeper+Hadoop的ResourceManager HA叢集可用配置

1.修改Linux主機名 2.修改IP 3.修改主機名和IP的對映關係 注意######如果你們公司是租用的伺服器或是使用的雲主機(如華為用主機、阿里雲主機等) /etc/hosts裡面要配置的是內網IP地址和主機名的對映關係 4.關閉防火牆 5

RabbitMQ 叢集可用配置

此文轉自:http://88250.b3log.org/rabbitmq-clustering-ha 未實驗過 叢集概述 通過 Erlang 的分散式特性(通過 magic cookie 認證節點)進行 RabbitMQ 叢集,各 RabbitMQ 服務為對等節點

RabbitMQ 集群與可用配置

rabbitmq 集群與高可用配置RabbitMQ 集群與高可用配置集群概述通過 Erlang 的分布式特性(通過 magic cookie 認證節點)進行 RabbitMQ 集群,各 RabbitMQ 服務為對等節點,即每個節點都提供服務給客戶端連接,進行消息發送與接收。 這些節點通過 RabbitMQ

rabbitmq安裝與可用集群配置

可用 get -s found 方法 for 集群配置 rabbitmq 環境變量 rabbitmq版本:3.6.12 1.安裝openssl wget http://www.openssl.org/source/openssl-1.0.0a.tar.gz &&

(十)RabbitMQ訊息佇列-可用叢集部署實戰

前幾章講到RabbitMQ單主機模式的搭建和使用,我們在實際生產環境中出於對效能還有可用性的考慮會採用叢集的模式來部署RabbitMQ。 RabbitMQ叢集基本概念 Rabbit模式大概分為以下三種:單主機模式、普通叢集模式、映象叢集模式。 單主機模式:

Spring Cloud系列(二十九)可用配置中心—Finchley版本

傳統作法 通常在生產環境,Config Server與服務註冊中心一樣,我們也需要將其擴充套件為高可用的叢集。在之前實現的config-server基礎上來實現高可用非常簡單,不需要我們為這些服務端做任何額外的配置,只需要遵守一個配置規則:將所有的Config Serv

Hadoop叢集可用搭建的配置檔案

一、core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value>

Hadoop叢集的ResourceManager HA可用配置

ResourceManager HA yarn-site.xml: <configuration> <!-- Site specific YARN configuration properties --> <property> <n

Hadoop叢集的Namenode HA可用配置

HA配置首先要有zookeeper叢集,這裡就不再說明zookeeper叢集的搭建了,可以在我的前面的文章中找到 我這裡是在之前Hadoop單點的基礎上進行HA配置的 叢集HA規劃: cdh0: Namenode   Datanode  JournalNod

大資料之Spark(八)--- Spark閉包處理,Spark的應用的部署模式,Spark叢集的模式,啟動Spark On Yarn模式,Spark的可用配置

一、Spark閉包處理 ------------------------------------------------------------ RDD,resilient distributed dataset,彈性(容錯)分散式資料集。 分割槽列表,fun

Docker下配置redis叢集可用

Docker下Redis叢集搭建 注:本文中紅色字型為命令 藍色字型為指令碼內容 綠色字型為備註 一:建立redis映象 1:mkdir docker_redis_cluster   cd docker_redis_cluster   wget http://d

HBase 叢集搭建和可用配置

HBase叢集建立在hadoop叢集基礎之上,所以在搭建HBase叢集之前需要把Hadoop叢集搭建起來,並且要考慮二者的相容性.現在就以3臺機器為例,搭建一個簡單的叢集. 1.進入hbase的配置目錄,在hbase-env.sh檔案裡面加入java環境變數.即: JAVA_HOME=exp

Spring Cloud | 第七篇: Eureka叢集可用配置

       一直在網上查閱資料,配置高可用的叢集,看完了發現還是不明白,或者按照文章的內容一步一步去實現發現根本實現不了,真的很懷疑他們寫的時候是否真的自己測試過了還是大家都是轉發來轉發去的,自己弄了好久,發現沒有一個拿來就可以用的,並且裡面很多的東西也沒有講解清楚,於是打

springcloud系列—Config—第6章-3: Spring Cloud Config 可用配置、安全與加密解密

資料參考:《Spring Cloud 微服務實戰》 目錄 安全保護 加密解密 使用前提 相關端點 配置金鑰 非對稱加密 高可用配置 安全保護 由於配置中心儲存的內容比較敏感,做一定的安全處理是必要的。為配置中心實現安全保護的方式有很多,比如物理網路限制,O

Rabbitmq叢集可用部署詳細

序言 清風萬里的季節,週末本該和親人朋友一起消遣這爛漫的花花草草,或是懶洋洋的晒個太陽聽聽風聲鳥鳴。無奈工作使然,理想使然,我回到啦公司,敲起啦鍵盤,擼起啦程式碼,程式狗的世界一片黯然,一片黯然,願天下所有努力的程式狗都夢想成真吧!! 回到正題,為什麼搭建rabbitmq叢

快速掌握RabbitMQ(五)——搭建可用RabbitMQ叢集

  RabbitMQ的叢集是依賴erlang叢集的,而erlang叢集是通過.erlang.cookie檔案進行通訊認證的,所以我們使用RabbitMQ叢集時只需要配置一下.erlang.cookie檔案即可。下邊簡單演示一下RabbitMQ高可用叢集的搭建,附帶一個簡單使用C#驅動RabbtiMQ叢集的小栗