一文读懂Apache Geode缓存中间件( 四 )


  • 对于复制区域的写操作,Geode会保证所有的副本都成功执行写入后,才返回成功 。Geode并发地执行对多个server的数据分发,但仍会降低写入的效率 。对于复制区域的并发更新可能击中任何一个副本,这样就出现了并发问题 。Geode在更新前提供了一致性检查,检测并一致地解决并发和无序更新 。这个一致性检查实际上是使用版本号和时间戳来保证,多个更新到来时,只保留最高版本的更新请求 。如果有多个相同版本的更新请求,每个成员都有一个资格ID,最高资格ID的成员的更新生效 。
  • 可用性
    • 对于复制区域,每个server上都保存着相同的数据,因此一个server宕机完全不影响数据的正常读写 。
    • 对于分区区域,为了保证高可用性,可以对分区设置冗余副本,在某个server宕机后,Geode会自动地将副本标记为master,当可用的副本数量到达一个阈值后,Geode会启动一个线程,启用一个新的server作为新的副本的据点,将所有数据复制到这个新的server上并标记为可用副本 。这个过程是否立即执行是可配置的,也可以等一会看宕机的server是否能恢复 。
    上面提到的持久化能力也提高了区域的灾备能力,Geode允许以分区为维度进行落盘持久化,并在一个新的server启动后,将磁盘中的内容恢复到内存中 。
    分区容错性Apache Geode作为分布式内存数据库,天然地满足了分区容错性 。
    3.3 复杂业务场景的需要 3.2.1 事务支持Geode提供了ACID事务的能力,但基于乐观锁,重新定义了ACID 。
    • 原子性乐观事务通过使用预约系统提供原子性并实现速度,而不是使用传统的两阶段锁行关系数据库技术 。这种保留阻止了其他交叉事务的完成,允许提交检查冲突,并在对数据进行更改之前以全有或全无的方式保留资源 。在本地和远程完成所有更改之后,将释放预订 。在预订系统中,交叉事务将被简单地丢弃 。避免了获取锁的序列化 。
    • 一致性一致性要求在事务中编写的数据必须遵守为受影响区域建立的键和值约束 。请注意,事务的有效性是应用程序的责任 。
    • 隔离隔离是事务状态对系统组件可见的级别 。Geode事务具有可重复的读隔离 。一旦为给定的键读取提交的值,它总是返回相同的值 。如果事务中的写操作删除了已读取的键的值,则后续的读操作将返回事务引用 。默认配置在流程线程级别隔离事务 。当一个事务正在进行时,它的更改只在运行该事务的线程中可见 。同一进程中的其他线程和其他进程中的线程在提交操作开始之前不能看到更改 。在开始提交之后,更改在缓存中是可见的,但是访问更改数据的其他线程可能会看到事务的部分结果,从而导致脏读 。但可以通过修改配置避免脏读 。
    • 持久性关系数据库通过使用磁盘存储进行恢复和事务日志记录来提供持久性 。Geode针对性能进行了优化,不支持事务的磁盘持久性 。
    3.2.2 Functions可以在Geode服务中注册一些函数,应用程序只需要发送函数的名称就可以执行函数内容 。
    3.2.3 连续查询这是一个类似于消息队列的机制,Client向Server发布一个OQL查询,当Server执行了会导致这个OQL的查询结果发生变更的事件后,会将这个事件和新的结果通知给Client,Client可以基于此做一些特殊的操作 。比如我们在缓存中管理库存量,发布一个连续查询 "SELECT * FROM /stock s WHERE s.stock_num + +s.purchase_num < 100",当这个查询收到值时,就向采购领域发布采购预警事件 。
    3.2.4 异构Geode提供了多种序列化方式,当想要在异构的系统中使用Geode时,可以不使用Java的序列化,而是其它更通用的序列化方式,如PDX或DataSerializer,PDX可以不用反序列化整个数据对象,就读到其中的字段的值,还能兼容多版本的对象;DataSerializable则提供了更快速的序列化 。

    经验总结扩展阅读