概述


基于ZooKeeper + ActiveMQ + replicatedLevelDB,在Windows平台的主从部署方案。
主从部署可以提供数据备份、容错[1]的功能,但是不能提供负载均衡的功能。
 
注:
  1. 容错:主服务器宕掉,再选出一台作为作为主服务器,来提供服务。

部署图


 

简单说明

ActiveMQ提供了队列、本地持久化的功能,ZooKeeper提供了主从选举的功能。Producers将消息发送给主从队列体系[1],Consumers从主从队列体系中获取消息。
注:
[1] 主从队列体系 - 除Producers、Consumers之外的,由ZooKeeper + ActiveMQ + replicatedLevelDB组成的体系。

模拟环境


1.软件环境

  1. 操作系统 -  Windows7
  2. JDK - 1.7
  3. activemq - 5.13.2
    下载包:apache-activemq-5.13.2-bin.zip
  4. zookeeper - 3.4.8
    下载包:zookeeper-3.4.8.tar.gz

2.网络环境

  1. 机器1
    ip:192.168.74.55
    zookeeper port:2181
    activemq port:61616
  2. 机器2
    ip:192.168.74.26
    zookeeper port:2181
    activemq port:61616
  3. 机器3
    ip:192.168.74.25
    zookeeper port:2181
    activemq port:61616

实施


1.安装、配置、启动ZooKeeper

  1. 将zookeeper-3.4.8.tar.gz解压缩到合适的路径。
  2. 复制conf/zoo_sample.cfg为conf/zoo.cfg
  3. 在conf/zoo.cfg中指定dataDir、dataLogDir、各服务器及端口信息
     # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just
    # example sakes.
    # dataDir=/tmp/zookeeper
    dataDir=F:/temp/zookeeper-3.4.8/data
    dataLogDir=F:/temp/zookeeper-3.4.8/log
    server.1=192.168.74.55:2888:3888
    server.2=192.168.74.26:2888:3888
    server.3=192.168.74.25:2888:3888
    # the port at which the clients will connect
    clientPort=2181
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    #
    # Be sure to read the maintenance section of the
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    #autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    #autopurge.purgeInterval=1
    修改内容:
    1) 注释掉第12行
    2) 第13行,添加dataDir
    3) 第14行,添加dataLogDir
    4) 第15-17行,以server.A=B:C:D的形式指定三台服务器
       A - 数字,表示服务器的编号
       B - 服务器的ip
       C - 服务器与集群中的Leader服务器交换信息的端口
       D - 用来执行选举时服务器相互通信的端口(万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader)
  4. 新建myid文件
    在dataDir指定的路径下,新建myid文件,文件内容是当前服务器的编号(和conf/zoo.cfg中的server编号对应)。
    e.g. 192.168.74.55机器的内容为:1
  5. 启动
    先切换到zookeeper目录,再启动(可以尝试设置PATH)
     D:\tools\PowerCmd>E:
    E:\>cd E:\418备份区\工作任务\20160318_消息队列\zookeeper-3.4.8
    E:\418备份区\工作任务\20160318_消息队列\zookeeper-3.4.8>bin\zkServer.cmd

2.安装、配置、启动ActiveMQ

  1. 将apache-activemq-5.13.2-bin.zip加压缩到合适的目录。
  2. 修改conf/activemq.xml文件内容
    将默认的<persistenceAdapter>配置的内容注释掉,添加基于replicatedLevelDB的持久化配置:
     <!--
    <persistenceAdapter>
    <kahaDB directory="${activemq.data}/kahadb"/>
    </persistenceAdapter>
    -->
    <persistenceAdapter>
    <replicatedLevelDB
    directory="${activemq.data}/leveldb"
    replicas="3"
    bind="tcp://0.0.0.0:0"
    zkAddress="192.168.74.55:2181,192.168.74.26:2181,192.168.74.25:2181"
    hostname="192.168.74.55"
    sync="local_disk"
    zkPath="/activemq/leveldb-stores"
    />
    </persistenceAdapter>
    注意:
    1) zkAddress依次指定三台服务器的ip和ZooKeeper的监听端口
    2) hostname为每一台服务器的ip地址,三台服务器根据实际情况修改
  3. 启动ActiveMQ
    先切换到安装目录,再启动(可以尝试设置PATH)
     cd E:\418备份区\工作任务\20160318_消息队列\apache-activemq-5.13.2
    bin\activemq start

3.在客户端程序中指定brokerURL

 # use the following property to configure the default connector
java.naming.provider.url=failover:(tcp://192.168.74.55:61616,tcp://192.168.74.26:61616,tcp://192.168.74.25:61616)?initialReconnectDelay=1000
说明:
brokerURL以"failover:(tcp://ip-1:amq-port-1,tcp://ip-2:amq-port-2,tcp://ip-3:amq-port-3)"的形式配置,则客户端会尝试依次进行连接;失败则继续尝试连接下一个。引入ZooKeeper之后,只有被选定为主服务器那一台可以被连接。

相关补充


1.已知情况

  1. 超过一半的故障,则体系失效
    如果有2台ActiveMQ故障,则体系不再工作,且会阻塞客户端(同步的客户端会被阻塞)

2.未确定内容

  1. 对上文的部署方案是否有改进建议。
  2. 将Producers、Consumers直接集成到应用系统,还是再抽出一层?
  3. 对于一半以上的故障,如何预防?
    -- 如何获得宕机提醒?如何实现自动重启?
  4. 面向日志的采集,应该选择哪种消息传送模式(队列、发布/订阅)?
  5. 计划对上述的体系进行压力测试,以获取吞吐量的上限值;对测试的方案有何建议?

3.新问题

  1. Consumer异常阻塞是否会导致其他Consumer阻塞?

参考文章


  1. 基于zookeeper+leveldb搭建activemq集群
    主从部署的实施方案。
  2. 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
    简单了解ZooKeeper
  3. ActiveMQ实现负载均衡+高可用部署方案
    主从部署和集群部署的区别、实现
  4. Replicated LevelDB Store
    官网有对配置的参数进行详细的解说

AMQ学习笔记 - 14. 实践方案:基于ZooKeeper + ActiveMQ + replicatedLevelDB的主从部署的更多相关文章

  1. AMQ学习笔记 - 15. 实践方案:基于ActiveMQ的统一日志服务

    概述 以ActiveMQ + Log4j + Spring的技术组合,实现基于消息队列的统一日志服务. 参考:Spring+Log4j+ActiveMQ实现远程记录日志——实战+分析 与参考文章的比较 ...

  2. AMQ学习笔记 - 20. 使用Apache ActiveMQBrowser监控ActiveMQ

    概述 Apache ActiveMQBrowser可以用于查看AMQ中的消息.这里对其使用方法进行简单介绍. 使用介绍 1.下载并解压缩 下载地址:Apache ActiveMQBrowser,当前最 ...

  3. 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理

    1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...

  4. Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法

    Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法 Ext.Net GridPanel可以进行Group操作,例如: 如何启用Grouping功能呢?只需要在Grid ...

  5. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  6. VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

    原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...

  7. SQL反模式学习笔记14 关于Null值的使用

    目标:辨别并使用Null值 反模式:将Null值作为普通的值,反之亦然 1.在表达式中使用Null: Null值与空字符串是不一样的,Null值参与任何的加.减.乘.除等其他运算,结果都是Null: ...

  8. golang学习笔记14 golang substring 截取字符串

    golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...

  9. .NET MVC 学习笔记(四)— 基于Bootstarp自定义弹出框

    .NET MVC 学习笔记(四)—— 基于Bootstarp自定义弹出框 转载自:https://www.cnblogs.com/nele/p/5327380.html (function ($) { ...

随机推荐

  1. Foundation框架之NSString及其Mutable类型

    Foundation框架之NSString及其Mutable类型 目录 概述 对字符串的实用操作 拼接 拆分 字符串比较 是否包含某字符串 字数统计 大小写转换 具体的方法参见API 待研究 概述 对 ...

  2. 0c-38-ARC快速入门

    2.ARC快速使用 int main(){ Student *s = [[Student alloc] init]; return 0; } 只需要写一行代码,编译器会在合适的位置释放学生对象,程序员 ...

  3. 用systemtap对sysbench IO测试结果的分析1

    http://www.actionsky.com/docs/archives/171  2016年5月6日  黄炎 近期在一些简单的sysbench IO测试中, 遇到了一些不合常识的测试结果. 从结 ...

  4. OS X 10.9 Mavericks 安装 thrift 0.9.1

    通过Homebrew安装的时候,编译会报错.查了一下资料,原来是10.9系统默认使用的libc++的库,而且移除了C++ 11标准前tr库,所以编译存在问题.且笔者使用的时候,brew安装只支持到0. ...

  5. 过滤文本文档中的数据并插入Cassandra数据库

    代码如下: package com.locationdataprocess; import java.io.BufferedReader; import java.io.File; import ja ...

  6. python脚本初探---新手如何直接编写一个hello world模块即可执行的.py文件

    废话不多说,就讲一下这个背景吧: 事情是这个样子的~ 本着好学的精神,咱就买了本书,学习python结果呢,发现python的教程都是一个样子滴,上来的第一个hello world 都是通过IDLE来 ...

  7. ClamAV

    ClamAV 简介以及适用范围 ClamAV是一个在命令行下查毒软件,因为它不将杀毒作为主要功能,默认只能查出您计算机内的病毒,但是无法清除,至多删除文件.ClamAV可以工作很多的平台上,但是有少数 ...

  8. 浅析SQL Server 2005中的主动式通知机制

    一.引言 在开发多人同时访问的Web应用程序(其实不只这类程序)时,开发人员往往会在缓存策略的设计上狠下功夫.这是因为,如果将这种环境下不常变更的数据临时存放在应用程序服务器或是用户机器上的话,可以避 ...

  9. 如何利用log4Net自定义属性配置功能记录完整的日志信息

    log4Net作为专业的log记录控件,对于它的强大功能大家一定不陌生.下面我将详细介绍如何利用其自定义属性,让日志信息更完整. 一,创建测试工程,log4Net组件可以自己从网上下载,也可通过Nug ...

  10. 关于Google Chorme中字体小于12px的问题

    问题:当字体大小设置成小于12px时,Google chrome中字体的大小始终显示为12px. 而其他浏览器则没有这个问题. 这时只需要在要改变字体大小的元素中添加 -webkit-transfor ...