分布式缓存与javaee - oracle cloud … · •纯java 1.4.2+ 的类库 •纯.net 1.1...

56
<Insert Picture Here> 分布式缓存与JavaEE ---------介绍Oracle Coherence

Upload: others

Post on 19-Jul-2020

18 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

<Insert Picture Here>

分布式缓存与JavaEE---------介绍Oracle Coherence

Page 2: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

日程安排

• 什么是缓存

• 为什么要用分布式缓存

• 分布式缓存的特性

• Oracle Coherence的介绍

• 其他的分布式缓存介绍• Terracotta,Memecached,MySQL Cluster,Dynamo

(Cassandra) ,JBoss Cache

Page 3: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

什么是缓存

Page 4: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

缓存的定义(在BIOS系统工程师眼里)

Page 5: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

缓存的定义(文件系统工程师)

Page 6: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

缓存的定义(磁盘驱动开发工程师)

Page 7: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

缓存的定义(Web工程师)

Page 8: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

JavaEE中的缓存

• JSR107 JCACHE-Java Temporary Caching API

• Jakarta 的标准项目: Cache Taglib• 缓存页面

• 缓存对象

• ORM (Hibernate,Toplink) 缓存

• 数据库层的缓存

• 业务对象的缓存

Page 9: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

缓存的原则

以提高性能为目的

维护缓存的代价要小于创建原始对象的代价

Page 10: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

如何提高系统的性能

Page 11: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

如何提高性能--各个层面的应用优化

Java EE 应用编程

Java EE应用服务器

Java 虚拟机

操作系统

硬件(网卡,CPU,内存)

Page 12: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

(c) Copyright 2010. Oracle Corporation

Page 13: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

如何提高性能

•横向扩展 (Scaling Out)

Page 14: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

如何获得可扩展性• 纵向扩展(Scaling Up)

• 增加CPU,内存,升级到更强大昂贵的系统

• 但是受单台服务器的限制

• 横向扩展 (Scaling Out)• 增加节点,使用便宜的服务器

• 应用系统的复杂性 (有状态的应用---无状态的应用)

• 无状态的应用几乎不存在

• 大多数的无状态的应用将状态放在数据库中

• 其实数据库更加难以扩展

• ACID (很多Lock,读写一致性,写的持久性)

• 分布式数据库(集群数据库)机制复杂,价格昂贵

Page 15: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

数据库横向扩展方案--复制• Master用于写操作

• Slave用于读操作

• 缓解Master的读操作

• 有不一致的时间窗口

• 不能解决大量写的操作

Page 16: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

数据库横向扩展方案--集群

• Oracle RAC

• 共享存储

• 负载均衡读和写

• 数据库写需要同步到所有节点的内存中,大大增加了写的时间延迟

• 增加了资源竞争

• 节点数量有限制

• 读和写都不能理想的扩展

Page 17: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

数据库横向扩展方案--Sharding• Share nothing

• 数据垂直分区

• 不同的节点放置不同的数据库

• 单个节点的处理能力有限制

Page 18: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

数据库横向扩展方案--Sharding

• Share nothing (Google, FaceBook, Flickr)

• 数据水平分区(MySQL Cluster)

• 分区的逻辑和数据一致性保证放到数据访问层

• 数据迁移代价大

• 查询和统计变得复杂,join操作是噩梦(数据冗余)

• 一个数据库操作可能转化为多个XA操作

Page 19: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

NOSQL 方案

• 高并发读写,海量存储的需求增加

• 对数据一致性要求减少(最终一致性)

• GFS,BigTable,MapReduce

• Hadoop开源实现

• Redis,Tokyo, Cassandra(SimpleDB),MongoDB, Hbase,CouchDB,Dynamo

Page 20: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

满足企业应用的需求

• 数据的严格一致性和事务性

• 传统的数据库开发模式

• 复杂的关联查询条件

• 高性能和高扩展性

• 大量的读写操作都是基于(Primary Key)的。

• 简单可行的解决方案--缓存

Page 21: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

为什么使用分布式缓存?

Page 22: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

未使用缓存的应用

Page 23: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

使用非分布式缓存

Page 24: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

什么是分布式缓存

Page 25: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

未使用缓存的数据库开销

Page 26: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

使用分布式缓存的数据库开销

Cache

Page 27: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

分布式缓存的特性?

Page 28: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

分布式系统的特性

• 数据分区技术

• Consistent Hash

• 数据的一致性保证

• 集群的成员维护和失败检测

• 集中式管理还是分布式管理

• 错误恢复技术

• 临时故障和永久故障

Page 29: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

什么是 Coherence?

Page 30: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Oracle Coherence

• 在内存中的数据网格(Data Grid)

• 水平扩展(Scale out)的解决方案• 消除数据库的性能瓶颈

• (Key Value对)的存储方案

• 开发工具包• 纯Java 1.4.2+ 的类库

• 纯 .Net 1.1 和 2.0的客户端类库

• 无第三方包的依赖关系

• 不依赖于任何开源产品和项目

• 用于其它用途的库文件…• 数据库和文件系统的集成

• 与Top Link和Hibernate的集成

• 与Http Session管理, Spring之间的集成, …

Page 31: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Coherence是为了解决性能问题• 在一个分布式系统中,性能由很多因素决定:

• CPU的快慢,算法的好坏,IO....• 应用层的Cache

• 网络延迟• Cache,NearCache

• 网络带宽限制• 获取大量数据,经过计算,存储到数据库

• 获取大量数据,经过计算,只显示一小部分

• 可扩展性• 数据库的扩展性

• 并行计算• 海量数据分析

Page 32: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Coherence是为了解决性能问题

• 许多典型应用的数据库查询是基于主键的查询,将这些查询放到Coherence缓存中,会大大降低数据库的负载

• Coherence分布式Cache本身具有扩展性和高可用性,解放数据库,让它做擅长的事情:存储和复杂查询

• 有了Coherence,不需要数据库复制的方案。只读的Slave完全可以被分布式Cache所替代

• 所有的写操作,一致性有Coherence来保证。数据被异步的持久化到数据库,将数据库的负担降到最低

• 分布式的查询和统计函数可以弥补一些Sharding带来的问题

• 特有的功能降低数据的延迟时间和减少带宽(NearCache,EntryProcessors)

Page 33: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Oracle Coherence的典型用途

• 应用层面的状态数据缓存• 减轻底层系统的负载

• 数据库,主机系统,Web服务器, Web Services

• Http Session内存复制

• 横向扩展应用的状态

• 应用集群以及可靠的数据共享

• 弹性计算引擎

• 基于事件的处理引擎

• 并行处理引擎(类相于MapReduce)

• 极限事物处理引擎• 存储临时的系统数据,获得极限事物处理能力

Page 34: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Coherence的基本概念

Page 35: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Cache的拓扑1:Replicated

Page 36: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Cache的拓扑1:Replicated

Page 37: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Replicated 数据管理

• 成员对所有节点都有逻辑的访问• 对读访问非常快,始终在本地

• 对写(更新)操作,性能跟节点数量相关

• 容错性非常好

• 可以确定的访问和不可预测的更新行为

• 不可以预测的扩展性• Cache 的容量跟最小节点相同

• 适用于小数据尺寸

• 适用于大部分只读的数据

Page 38: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

(c) Copyright 2010. Oracle Corporation

Page 39: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

(c) Copyright 2010. Oracle Corporation

Page 40: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

(c) Copyright 2010. Oracle Corporation

Page 41: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Distributed 数据管理

• 成员对所有节点都有逻辑的访问• 对读访问,最多两个网络操作

• 对写(更新)操作,最多4个网络操作

• 与节点多少没有关系

• 可以确定的访问和更新的行为

• 可以预测的扩展性• Cache 的容量随着节点增加变大

• Coherence对自动对数据的分片进行负载均衡

• 点对点的通讯

• 并不要求multicast

Page 42: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

对数据变化进行监控

Page 43: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

并行查询

Page 44: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

(c) Copyright 2010. Oracle Corporation

Page 45: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

(c) Copyright 2010. Oracle Corporation

Page 46: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

(c) Copyright 2010. Oracle Corporation

Page 47: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

(c) Copyright 2010. Oracle Corporation

Page 48: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Coherence 代码示例

Page 49: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

Cluster cluster =

CacheFactory.ensureCluster();

加入和离开

CacheFactory.shutdown();

Page 50: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

使用缓存get, put, size & remove

NamedCache nc = CacheFactory.getCache(“mine”);

Object previous = nc.put(“key”, “hello world”);

Object current = nc.get(“key”);

int size = nc.size();

Object value = nc.remove(“key”);

Page 51: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

使用缓存keySet, entrySet, containsKey

NamedCache nc = CacheFactory.getCache(“mine”);

Set keys = nc.keySet();

Set entries = nc.entrySet();

boolean exists = nc.containsKey(“key”);

Page 52: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

监听缓存事件ObservableMap

NamedCache nc =

CacheFactory.getCache(“stocks”);

nc.addMapListener(new MapListener() {

public void onInsert(MapEvent mapEvent) {

}

public void onUpdate(MapEvent mapEvent) {

}

public void onDelete(MapEvent mapEvent) {

}

});

Page 53: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

缓存查询QueryMap

NamedCache nc =

CacheFactory.getCache(“people”);

Set keys = nc.keySet(

new LikeFilter(“getLastName”,

“%Stone%”));

Set entries = nc.entrySet(

new EqualsFilter(“getAge”,

35));

Page 54: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

统计操作InvocableMap

NamedCache nc =

CacheFactory.getCache(“stocks”);

Double total = (Double)nc.aggregate(

AlwaysFilter.INSTANCE,

new DoubleSum(“getQuantity”));

Set symbols = (Set)nc.aggregate(

new EqualsFilter(“getOwner”, “Larry”),

new DistinctValue(“getSymbol”));

Page 55: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

有条件修改操作NamedCache nc = CacheFactory.getCache(“stocks”);

nc.invokeAll(

new EqualsFilter(“getSymbol”, “ORCL”),

new StockSplitProcessor());

...

class StockSplitProcessor extends

AbstractProcessor {

Object process(Entry entry) {

Stock stock = (Stock)entry.getValue();

stock.quantity *= 2;

entry.setValue(stock);

return null;

}

}

Page 56: 分布式缓存与JavaEE - Oracle Cloud … · •纯Java 1.4.2+ 的类库 •纯.Net 1.1 和2.0的客户端类库 •无第三方包的依赖关系 •不依赖于任何开源产品和项目

(c) Copyright 2010. Oracle Corporation