久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      RabbitMQ集群跨網(wǎng)段消息遷移

      需求背景

      將阿里云同一個(gè)VPC下的RabbitMQ集群的消息從一個(gè)網(wǎng)段集群遷移到另一個(gè)網(wǎng)段集群。消息中間件的消息是即時(shí)消費(fèi),為何還有歷史消息,因?yàn)槭菤v史遺留問題。故要遷移

      整個(gè)網(wǎng)絡(luò)拓?fù)鋱D如下

      注意:

      若對(duì)于跨VPC網(wǎng)絡(luò)

      1. 確保各主機(jī)網(wǎng)絡(luò)互通

      2. 配置好各主機(jī)名

      兩邊安全組出方向開發(fā):15672、25672、5672、4369端口

      否在在加入集群會(huì)出現(xiàn)問題

      RabbitMQ集群跨網(wǎng)段消息遷移

      資源清單

      主機(jī)名

      IP地址

      角色

      備注

      node171

      172.20.0.171

      老的MQ集群_1

       

      node172

      172.20.0.172

      老的MQ集群_2

       

      node173

      192.168.0.173

      MQ集群_1

       

      node174

      192.168.0.174

      新的MQ集群_2

       

      基礎(chǔ)軟件及環(huán)境信息

      操作系統(tǒng):CentOS Linux release 7.3.1611

      Erlang:Erlang/OTP 20 [erts-9.3.3.3]

      RabbitMQ:rabbitmq_server-3.7.8

      集群的部署

      node171、node172組成集群A

      node173、node174組成集群B

      這里的環(huán)境部署略

      創(chuàng)建測(cè)試賬戶

      在【node171上進(jìn)行操作】

      rabbitmqctl add_user root root123

      rabbitmqctl add_vhost kcvhost

      rabbitmqctl set_permissions -p kcvhost root  “.*” “.*” “.*”

      rabbitmqctl add_user admin admin123

      rabbitmqctl set_permissions -p kcvhost admin  “.*” “.*” “.*”

      rabbitmqctl set_user_tags admin administrator

      rabbitmq-plugins enable rabbitmq_management

      rabbitmqctl stop_app

      rabbitmqctl start_app

      生成測(cè)試數(shù)據(jù)

      消息生產(chǎn)者代碼:

      package com.zjkj.rabbitmq.demo;
       
      import Java.io.IOException;
      import java.util.concurrent.TimeoutException;
       
      import com.rabbitmq.client.Channel;
      import com.rabbitmq.client.Connection;
      import com.rabbitmq.client.ConnectionFactory;
      import com.rabbitmq.client.MessageProperties;
       
      /**
       * 消息的生產(chǎn)者
       * @author zjkj
       *
       */
      public class Rabbitmq_Producer {

      private static final String EXCHANGE_NAME = “exchange_test_3”;
      private static final String ROUTING_KEY = “routingkey_demo”;
      private static final String QUEUE_NAME = “queue_test_3”;
      private static final String IP_ADDRESS = “172.20.0.171”;
      private static final int PORT = 5672; //RabbitMQ服務(wù)默認(rèn)端口號(hào)為5672

      public static void main(String[] args) throws IOException,TimeoutException,InterruptedException{
      ConnectionFactory factory = new ConnectionFactory();
      factory.setHost(IP_ADDRESS);
      factory.setPort(PORT);
      factory.setUsername(“root”);
      factory.setPassword(“root123”);
      Connection connection = factory.newConnection(); //創(chuàng)建連接
      Channel channel = connection.createChannel(); // 創(chuàng)建信道
       //創(chuàng)建一個(gè)type=”direct”、持久化、非自動(dòng)刪除的交換器
      channel.exchangeDeclare(EXCHANGE_NAME, “direct”,true, false, null);
      // 創(chuàng)建一個(gè)持久化、非排他的、非自動(dòng)刪除的隊(duì)列
      channel.queueDeclare(QUEUE_NAME, true, false, false,null);
      // 將交換器與隊(duì)列通過路由鍵綁定
      channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
      // 發(fā)送一條持久化的消息:hello world!
      for(int i=1;i<=100000;i++){
      String msg = “交換器_1與隊(duì)列1綁定:Message_”+i;
      channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
      }
      // 關(guān)閉資源
      channel.close();
      connection.close();
       
      }
       
      }

      消費(fèi)者代碼

      package com.zjkj.rabbitmq.demo;
       
      import java.io.IOException;
      import java.util.concurrent.TimeUnit;
      import java.util.concurrent.TimeoutException;
       
      import com.rabbitmq.client.AMQP;
      import com.rabbitmq.client.Address;
      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;
       
      /**
       * 消息的消費(fèi)者
       * @author zjkj
       *
       */
      public class Rabbitmq_Consumer {
       
      private static final String QUEUE_NAME = “queue_test_3”;
      private static final String IP_ADDRESS = “192.168.6.171”;
      private static final  int PORT = 5672;

      public static void main(String[] args) throws IOException,TimeoutException,InterruptedException{
      Address[] addresses = new Address[]{
      new Address(IP_ADDRESS,PORT)
      };
      ConnectionFactory factory = new ConnectionFactory();
      factory.setUsername(“root”);
      factory.setPassword(“root123”);
      // 這里的連接方式與生產(chǎn)者的demo略有不同,注意區(qū)別
      Connection connection = factory.newConnection(addresses); //創(chuàng)建連接
      final Channel channel = connection.createChannel(); // 創(chuàng)建信道
      channel.basicQos(64);// 設(shè)置客戶端最多接收未被ack的消息的個(gè)數(shù)

      /**
       * 這里采用了繼承DefaultConsumer的方式來實(shí)現(xiàn)消費(fèi),有過RabbitMQ使用經(jīng)驗(yàn)的開發(fā)者
       * 可能喜歡使用QueueingConsumer的方式來實(shí)現(xiàn)消費(fèi)
       * 因?yàn)槭褂肣ueueingConsumer會(huì)有一些隱患。
       * 同時(shí)在RabbitMQ Java客戶端4.0.0版本開始將QueueingConsumer標(biāo)記為@Deprecated了
       */
      Consumer consumer = new DefaultConsumer(channel){
      @Override
      public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body)
        throws IOException{
      System.out.println(“recv message : ” + new String(body));
      try{
      TimeUnit.SECONDS.sleep(1);

      }catch(InterruptedException e){
      e.printStackTrace();
      }
      channel.basicAck(envelope.getDeliveryTag(),false);
      }
      };
      channel.basicConsume(QUEUE_NAME,true, consumer);
      //等待回調(diào)函數(shù)執(zhí)行完畢之后,關(guān)閉資源
      TimeUnit.SECONDS.sleep(5);
      channel.close();
      connection.close();
       
      }
       
      }

      查看集群中諸如用戶數(shù)、交換器數(shù)量、隊(duì)列數(shù)量等

      [root@node171 rabbitmq]# rabbitmqctl list_users

      Listing users …

      admin  [monitoring]

      guest  [administrator]

      root    []

      [root@node171 rabbitmq]# rabbitmqctl list_exchanges

      Listing exchanges for vhost / …

      amq.topic      topic

      amq.headers    headers

      exchange_test_3 direct

      amq.direct      direct

      exchange_test_2 direct

      amq.rabbitmq.trace      topic

      amq.match      headers

              direct

      exchange_test_1 direct

      amq.fanout      fanout

      [root@node171 rabbitmq]# rabbitmqctl list_queues

      Timeout: 60.0 seconds …

      Listing queues for vhost / …

      queue_test_3    100000

      queue_test_2    200

      queue_test_1    10000

      遷移方案

      遷移步驟

      1. 停止所有生產(chǎn)者和消費(fèi)者的應(yīng)用程序

      2. 將集群B中的機(jī)器依次一臺(tái)一臺(tái)加入集群A中,并確認(rèn)所有隊(duì)列鏡像完成

      3. 剔除集群A中的一臺(tái)一臺(tái)機(jī)器

      4. 將應(yīng)用指向集群B

      方案1【不可行】

      將集群B中的一臺(tái)機(jī)器加入集群A中,然后再集群B中的另一他機(jī)器已加入集群,然后剔除集群A中的一臺(tái)機(jī)器,然后再剔除集群A中的另一臺(tái)機(jī)器

      此方案對(duì)于RabbitMQ的普通集群也即是Cluster模式是無效的

      1. 停止A集群中的所有連接

      2. 將集群B中的一臺(tái)節(jié)點(diǎn)加入到A集群中

      將集群A中的.erlang.cookie的值拷貝到集群B中的node173上

      [root@node171 rabbitmq]# cat .erlang.cookie

      ORMTFBMHOXOGFKRLQSPU[root@node171 rabbitmq]#

      [root@node173 plugins]# cp /var/lib/rabbitmq/.erlang.cookie  /var/lib/rabbitmq/erlang.cookie.bak

      [root@node173 plugins]# chmod 700 /var/lib/rabbitmq/.erlang.cookie

       [root@node173 plugins]# vi /var/lib/rabbitmq/.erlang.cookie

      ORMTFBMHOXOGFKRLQSPU
       

      [root@node173 plugins]# chmod 400 /var/lib/rabbitmq/.erlang.cookie

      [root@node173 plugins]# ls -lrth /var/lib/rabbitmq/.erlang.cookie

      -r——– 1 rabbitmq rabbitmq 21 Oct 24 18:51 /var/lib/rabbitmq/.erlang.cookie

      3.將集群B中的node173加入到集群A中

      [root@node173 rabbitmq]# service rabbitmq-server start

      Redirecting to /bin/systemctl start  rabbitmq-server.service

      [root@node173 rabbitmq]# rabbitmqctl stop_app

      Stopping rabbit application on node mq_173@node173 …

      [root@node173 rabbitmq]# rabbitmqctl reset

      Resetting node mq_173@node173 …

      [root@node173 rabbitmq]# rabbitmqctl join_cluster mq171@node171

      Clustering node mq_173@node173 with mq171@node171

      [root@node173 rabbitmq]# rabbitmqctl start_app

      Starting node mq_173@node173 …

       completed with 3 plugins.

      4. 同樣的方法將集群B中的node174加入到集群A中

      [root@node174 rabbitmq]# rabbitmqctl cluster_status

      Cluster status of node mq_174@node174 …

      [{nodes,[{disc,[mq_174@node174]}]},

       {running_nodes,[mq_174@node174]},

       {cluster_name,<<“mq_174@node174”>>},

       {partitions,[]},

       {alarms,[{mq_174@node174,[]}]}]

       [root@node174 rabbitmq]# rabbitmqctl stop_app

      Stopping rabbit application on node mq_174@node174 …

      [root@node174 rabbitmq]# rabbitmqctl reset

      Resetting node mq_174@node174 …

      [root@node174 rabbitmq]# rabbitmqctl join_cluster mq171@node171

      Clustering node mq_174@node174 with mq171@node171

      [root@node174 rabbitmq]# rabbitmqctl start_app

      Starting node mq_174@node174 …

       completed with 0 plugins.

        5.將集群A中的node171剔除集群

      [root@node171 rabbitmq]# rabbitmqctl stop

      Stopping and halting node mq171@node171 …

      這時(shí)訪問node172 的Web集群管理

      RabbitMQ集群跨網(wǎng)段消息遷移

      同樣在node173上的Web管理界面查看

      RabbitMQ集群跨網(wǎng)段消息遷移

      至此對(duì)于普通的集群模式,這種方案是不行的。

      方案2【可行】

      若RabbitMQ采用鏡像隊(duì)列,將集群A中的消息數(shù)據(jù)遷移到集群B中,

      集群A中的node171、node172采用鏡像隊(duì)列

      構(gòu)建集群A的鏡像隊(duì)列環(huán)境

      1.首先集群A中的node172加入集群中

      【在node172上操作】

      [root@node172 ~]# rabbitmqctl stop_app

      Stopping rabbit application on node mq172@node172 …

      [root@node172 ~]# rabbitmqctl reset

      Resetting node mq172@node172 …

       [root@node172 ~]# rabbitmqctl join_cluster mq171@node171

      Clustering node mq172@node172 with mq171@node171

      ra[root@node172 ~]# rabbitmqctl start_app

      Starting node mq172@node172 …

      2.設(shè)置鏡像策略

      【在node171上操作】

      [root@node171 ~]# rabbitmqctl set_policy ha-all -p kcvhost “^” ‘{“ha-mode”:”all”,”ha-sync-mode”:”automatic”}’

      Setting policy “ha-all” for pattern “^” to “{“ha-mode”:”all”,”ha-sync-mode”:”automatic”}” with priority “0” for vhost “kcvhost” …

       

      [root@node171 ~]# rabbitmqctl set_policy rabbit_mirror “^” ‘{“ha-mode”:”all”}’

      Setting policy “rabbit_mirror” for pattern “^” to “{“ha-mode”:”all”}” with priority “0” for vhost “/” …

      開始集群A中的鏡像隊(duì)列遷移

      1.停止所有消息的生產(chǎn)者和消費(fèi)者相關(guān)應(yīng)用服務(wù)

      2.停止集群A中的所有機(jī)器,并備份原始數(shù)據(jù)

       【node171、node172】都要操作

      Node172執(zhí)行如下:

      [root@node172 ~]# service rabbitmq-server stop

      Redirecting to /bin/systemctl stop  rabbitmq-server.service

      [root@node172 ~]# cd /var/lib/rabbitmq/

      [root@node172 rabbitmq]# ls

      mnesia

      [root@node172 rabbitmq]# cp -rf mnesia mnesia.20181025.bak

      [root@node172 rabbitmq]# service rabbitmq-server start

      Redirecting to /bin/systemctl start  rabbitmq-server.service

      node171執(zhí)行如下:

      [root@node171 ~]# service rabbitmq-server stop

      Redirecting to /bin/systemctl stop  rabbitmq-server.service

      [root@node171 ~]# cd /var/lib/rabbitmq/

      [root@node171 rabbitmq]# cp -rf mnesia mnesia.20181025.bak

      [root@node171 rabbitmq]# service rabbitmq-server start

      Redirecting to /bin/systemctl start  rabbitmq-server.service

      2.首先將集群B的node173機(jī)器加入到集群A中

      [root@node173 network-scripts]# service rabbitmq-server stop

      Redirecting to /bin/systemctl stop rabbitmq-server.service

      [root@mq04 rabbitmq]# cp -rf /var/lib/rabbitmq /var/lib/rabbitmq.bak

      [root@mq04 rabbitmq]# cd /var/lib/rabbitmq

      [root@mq04 rabbitmq]# rm -rf .erlang.cookie  mnesia/

      [root@mq01 rabbitmq]# scp .erlang.cookie  root@mq04:/var/lib/rabbitmq

      The authenticity of host ‘mq04 (192.168.0.232)’ can’t be established.

      ECDSA key fingerprint is SHA256:zgAicKOpvRLLCyhdUbpNvyanKYrPt/Pp9g+Sdq9mAoo.

      ECDSA key fingerprint is MD5:15:7d:1e:c2:86:d5:4a:40:63:df:f5:4e:65:c4:24:62.

      Are you sure you want to continue connecting (yes/no)? yes

      Warning: Permanently added ‘mq04’ (ECDSA) to the list of known hosts.

      root@mq04’s password:

      Permission denied, please try again.

      root@mq04’s password:

      .erlang.cookie                                                                  100%  20    19.6KB/s  00:00

      [root@mq04 rabbitmq]# chmod 400 .erlang.cookie

      [root@mq04 rabbitmq]# chown -R rabbitmq:rabbitmq .erlang.cookie

      [root@mq04 rabbitmq]# service rabbitmq-server start

      Redirecting to /bin/systemctl start rabbitmq-server.service

      [root@mq04 rabbitmq]# rabbitmqctl stop_app

      Stopping rabbit application on node mq04@mq04 …

      [root@mq04 rabbitmq]# rabbitmqctl reset

      Resetting node mq04@mq04 …

      對(duì)于阿里云ECS一定要在安全組先臨時(shí)開啟15672、25672、5672、4369端口

      [root@node173 network-scripts]# rabbitmqctl join_cluster mq171@node171

      Clustering node mq_173@node173 with mq171@node171

      [root@node173 network-scripts]# rabbitmqctl start_app

      Starting node mq_173@node173 …

       completed with 3 plugins.

      3. 然后再將B集群中的node174機(jī)器加入到集群A中

       使用上面同樣的方法,將node174加入到集群中去

      4.剔除集群A中的node171、node172機(jī)器

      Node172上執(zhí)行

      [root@mq02 rabbitmq]# rabbitmqctl stop_app

      Stopping rabbit application on node mq02@mq02 …

      [root@mq02 rabbitmq]# service rabbitmq-server stop

      Redirecting to /bin/systemctl stop rabbitmq-server.service

      [root@mq02 rabbitmq]# cp -rf /var/lib/rabbitmq /var/lib/rabbitmq.bak

      [root@mq02 rabbitmq]# service rabbitmq-server start

      Redirecting to /bin/systemctl start rabbitmq-server.service

      [root@mq02 rabbitmq]# rabbitmqctl stop_app

      Stopping rabbit application on node mq02@mq02 …

      [root@mq02 rabbitmq]# rabbitmqctl reset

      Resetting node mq02@mq02 …

      同樣的node171上執(zhí)行同樣的命令

      對(duì)于采用鏡像隊(duì)列集群,此方案可行

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)