本篇文章主要讲解Apache Geode/GemFire 是如何进行数据分区的。

GemFire和大多数分布式系统一样都采用 Hash 的方式对数据进行分区,将 Entry 数据分布到 PartitionedRegion 当中,大家都知道 Entry 数据主要保存在 ConcurrentHashMap 中,ConcurrentHashMap存放在 Bucket 中,在 PR 服务器启动后会为 PartitionedRegion创建相应的Bucket 来保存这个ConcurrentHashMap。因此它们三者的映射关系如下所示:

Entry—> ConcurrentHashMap—> Bucket—> Region

如何进行数据分区?

当前端应用对Entry 进行操作后,Entry 会按照如下的步骤分区到PR 服务器上。

1.Entry 在插入到分布式集群的某台节点服务器过程中,会放到 PR 创建的 Bucket 中。

2.在进行 Put 操作时, 会产生一个EntryOperation 事件,在这个 Event 事件中可以找到PartionedRegion,和要进行 Put 操作的 Key。这个路由的对象就是一般的 POJO 操作类。

3.在获得路由对象上,从条目操作中获得 Key 键,在通过 Key 键来得到相关的对象Object。

4.接下来再通过 Key来获得bucketId, 再通过bucketId获得 PR,给定一个key/routing对象, 运行hashCode()生成一个 long 值, 然后用这个值与 bucket size 取模得到bucketId值。

* 为了更好地进行哈希key分布, 使用MD5、SHA或其他的 ID 生成方法.

详见PartionedRegionHelper 的getHashKey方法.

private static int getHashKey(EntryOperation event, PartitionedRegion pr,

Operation operation, Object key, Object value, Object callbackArgument) {

// avoid creating EntryOperation if there is no resolver

if (event != null) {

pr = (PartitionedRegion)event.getRegion();

key = event.getKey();

callbackArgument = event.getCallbackArgument();

}

PartitionResolver resolver = getResolver(pr, key, callbackArgument);

Object resolveKey = null;

if (pr.isFixedPartitionedRegion()) {

String partition = null ;

if (resolver instanceof FixedPartitionResolver) {

Map<String, Integer[]> partitionMap = pr.getPartitionsMap();

if (event == null) {

event = new EntryOperationImpl(pr, operation, key, value,

callbackArgument);

}

partition = ((FixedPartitionResolver)resolver).getPartitionName(

event, partitionMap.keySet());

if (partition == null) {

Object[] prms = new Object[] { pr.getName(), resolver };

throw new IllegalStateException(

LocalizedStrings.PartitionedRegionHelper_FOR_REGION_0_PARTITIONRESOLVER_1_RETURNED_PARTITION_NAME_NULL.toLocalizedString(prms));

}

Integer[] bucketArray = partitionMap.get(partition);

if (bucketArray == null) {

Object[] prms = new Object[] { pr.getName(), partition };

throw new PartitionNotAvailableException(

LocalizedStrings.PartitionedRegionHelper_FOR_FIXED_PARTITIONED_REGION_0_FIXED_PARTITION_1_IS_NOT_AVAILABLE_ON_ANY_DATASTORE.toLocalizedString(prms));

}

int numBukets = bucketArray[1];

resolveKey = (numBukets == 1) ? partition : resolver.getRoutingObject(event);

}

else if (resolver == null) {

throw new IllegalStateException(

LocalizedStrings.PartitionedRegionHelper_FOR_FIXED_PARTITIONED_REGION_0_FIXED_PARTITION_RESOLVER_IS_NOT_AVAILABLE.toString(pr.getName()));

}

else if (!(resolver instanceof FixedPartitionResolver)) {

Object[] prms = new Object[] { pr.getName(), resolver };

throw new IllegalStateException(

LocalizedStrings.PartitionedRegionHelper_FOR_FIXED_PARTITIONED_REGION_0_RESOLVER_DEFINED_1_IS_NOT_AN_INSTANCE_OF_FIXEDPARTITIONRESOLVER.toLocalizedString(prms));

}

return assignFixedBucketId(pr, partition, resolveKey);

}

else {

// Calculate resolveKey.

if (resolver == null) {

// no custom partitioning at all

resolveKey = key;

if (resolveKey == null) {

throw new IllegalStateException("attempting to hash null");

}

}

else {

if (event == null) {

event = new EntryOperationImpl(pr, operation, key, value,

callbackArgument);

}

// 通过 Entry 操作, 获得一个路由对象, 得到resolveKey, 在通过 resolveKey进行Hash计算

resolveKey = resolver.getRoutingObject(event);

if (resolveKey == null) {

throw new IllegalStateException(

LocalizedStrings.PartitionedRegionHelper_THE_ROUTINGOBJECT_RETURNED_BY_PARTITIONRESOLVER_IS_NULL.toLocalizedString());

}

}

// Finally, calculate the hash.

return getHashKey(pr, resolveKey);

}

}

如何进行数据感知路由?

GemFire 开发了一个Function Service 模块能够让客户端和服务器节点一起来处理提交的任务。如果数据跨多个节点分区,GemFire能够透明地路由数据执行行为到待处理数据的节点,这样避免了数据跨网络移动,这被称为“数据感知功能路由”。带有数据感知路由功能的应用根本不需要管理数据。

GemFire路由数据的执行行为而不是数据本身,GemFire直接路由数据执行行为到需要做并行处理,或汇聚结果的节点。这个特性使得GemFire从根本上降低了执行复杂任务的时间。分布式并行处理活动被抽象出来,与应用调用端无关。

应用即能够在单点执行,也能在一个小集群并行执行,甚至能够跨整个分布式集群并行执行。

GemFire的并行模型非常类似于Google的Map-Reduce模型。数据感知路由最适合于执行迭代查询或汇聚数据条目的操作。通过数据并处和并行计算,系统的吞吐量显著提升。最重要的是,计算的延迟与并行计算的节点数成反比。

单节点的Function执行类似于关系型数据库的Stored Procedure执行。

并行计算之后,结果通过Function中的结果收集器,把处理完的结果会调用ResultCollector统一收集回来。相当于Map-Reduce模型中的输出收集器。

Apache Geode/GemFire 数据分区和路由机制浅析相关推荐

  1. Apache Geode/GemFire功能特性简介(1)

      区域   复制区域 在区域中所有的数据被复制到每一个缓存服务器节点.复制区域使用了'multiple masters'复制组织结构.当数据区域被复制(没有分区),对于每一个数据条目没有指定的管理者 ...

  2. Apache Geode 1.4 快速搭建示例

    第1步:安装Apache Geode 有关说明,请参见如何安装. 第2步:使用gfsh启动定位器 在终端窗口中,使用gfsh命令行界面启动定位器.Apache Geode gfsh(发音为" ...

  3. Java中高级核心知识全面解析——Redis(集群【概述{主从复制、哨兵、集群化}、数据分区方案、节点通信机制、数据结构简析】)5

    目录 一.[集群]入门实践教程 1.Redis 集群概述 1)Redis 主从复制 2)Redis 哨兵 3)Redis 集群化 2.主从复制 1)主从复制主要的作用 2)快速体验 ①.第一步:本地启 ...

  4. Spring系列学习之Spring Data Apache Geode数据访问

    英文原文:https://spring.io/projects/spring-data-geode 目录 概述 特性 快速开始 学习 文档 概述 Spring Geode项目Spring Data的主 ...

  5. 大中型企业的天网:Apache Geode

    2016年11月21日,Apache软件基金会(the Apache Software Foundation,ASF)宣布 Apache Geode已从Apache孵化器毕业成为顶级项目(Top-Le ...

  6. Apache Geode配置和运行集群

    简要说明 使用gfsh命令行实用工具配置Apache Geode集群(也称为"分布式系统").集群配置服务持久化集群配置,并将配置分发给集群成员.还有其他几种配置集群的方法. 使用 ...

  7. SpringBoot 2 访问 Pivotal GemFire 数据

    开篇词 该指南将引导你使用 Pivotal GemFire 的数据服务集来构建应用. 你将创建的应用 我们将使用功能强大的 Spring Data for Pivotal GemFire 库来存储和检 ...

  8. Apache Geode 2.11 运行Geode服务器进程

    运行Geode服务器进程 Geode服务器是一个作为客户端/服务器系统的长期可配置成员运行的进程. Geode服务器主要用于托管长期数据区域以及运行标准Geode进程,例如客户端/服务器配置中的服务器 ...

  9. Apache Geode介绍(译)

    简介 Performance is key. Consistency is a must. 性能是关键.一致性是必须的. Providing low latency, high concurrency ...

最新文章

  1. 【MATLAB】符号数学计算(一):符号对象的创建
  2. LeetCode OJ - Copy List with Random Pointer
  3. android php mysql json 查询_使用json从PHP-MySql服务器到Android获取图像
  4. linux 部署项目
  5. [转载]VC++程序员应当如何阅读ADO文档
  6. 物联网技术周报第 143 期: Unity 3D 和 Arduino 打造虚拟现实飞行器
  7. cstring判断包含字符串_Python字符串方法之-解决判断问题
  8. OpenCV vs Dlib 人脸检测比较分析
  9. 纯英文换行的css,利用CSS实现纯英文数字自动换行
  10. python pillow库下载_054-python库Pillow
  11. 【电脑百科】BT种子
  12. opencv php,OpenCV应用实例
  13. spring源码:实例化bean的准备工作
  14. 微型计算机就是完全采用大规模集成电路,湖南工大计算机在线作业
  15. SpatialTE:从空间转录组数据集分析转座因子表达的工具
  16. PyScripter的下载
  17. 根据.mdf、.ndf和.ldf文件恢复数据库数据
  18. android开发系列之性格测试,性格色彩测试android程序开发之十--输出结果
  19. c语言别踩白块小游戏代码,自学easeljs 根据别踩白块游戏规则自己写的代码
  20. 计算机系应届生求职指北

热门文章

  1. 关于gradle的无法连接问题
  2. 用友NCC2105/2111账号密码批量重置工具
  3. Android studio 线性布局
  4. 非线性控制5——扰动观测器
  5. php图书馆管理系统的设计与实现毕业设计-附源码
  6. 书法 | 从零学硬笔,我的三天成长路 2
  7. sheet.js插件解析excel数据
  8. java获取Win系统日志最后(最新)开关机时间记录等
  9. 计算机考试要手速,【新生入学秘籍NO.1】亲亲,这里建议您赶紧查收学习秘籍哦!...
  10. 深圳办理港澳通行证及续签