分布式缓存与javaee - oracle cloud … · •纯java 1.4.2+ 的类库 •纯.net 1.1...
TRANSCRIPT
<Insert Picture Here>
分布式缓存与JavaEE---------介绍Oracle Coherence
日程安排
• 什么是缓存
• 为什么要用分布式缓存
• 分布式缓存的特性
• Oracle Coherence的介绍
• 其他的分布式缓存介绍• Terracotta,Memecached,MySQL Cluster,Dynamo
(Cassandra) ,JBoss Cache
什么是缓存
缓存的定义(在BIOS系统工程师眼里)
缓存的定义(文件系统工程师)
缓存的定义(磁盘驱动开发工程师)
缓存的定义(Web工程师)
JavaEE中的缓存
• JSR107 JCACHE-Java Temporary Caching API
• Jakarta 的标准项目: Cache Taglib• 缓存页面
• 缓存对象
• ORM (Hibernate,Toplink) 缓存
• 数据库层的缓存
• 业务对象的缓存
缓存的原则
以提高性能为目的
维护缓存的代价要小于创建原始对象的代价
如何提高系统的性能
如何提高性能--各个层面的应用优化
Java EE 应用编程
Java EE应用服务器
Java 虚拟机
操作系统
硬件(网卡,CPU,内存)
(c) Copyright 2010. Oracle Corporation
如何提高性能
•横向扩展 (Scaling Out)
如何获得可扩展性• 纵向扩展(Scaling Up)
• 增加CPU,内存,升级到更强大昂贵的系统
• 但是受单台服务器的限制
• 横向扩展 (Scaling Out)• 增加节点,使用便宜的服务器
• 应用系统的复杂性 (有状态的应用---无状态的应用)
• 无状态的应用几乎不存在
• 大多数的无状态的应用将状态放在数据库中
• 其实数据库更加难以扩展
• ACID (很多Lock,读写一致性,写的持久性)
• 分布式数据库(集群数据库)机制复杂,价格昂贵
数据库横向扩展方案--复制• Master用于写操作
• Slave用于读操作
• 缓解Master的读操作
• 有不一致的时间窗口
• 不能解决大量写的操作
数据库横向扩展方案--集群
• Oracle RAC
• 共享存储
• 负载均衡读和写
• 数据库写需要同步到所有节点的内存中,大大增加了写的时间延迟
• 增加了资源竞争
• 节点数量有限制
• 读和写都不能理想的扩展
数据库横向扩展方案--Sharding• Share nothing
• 数据垂直分区
• 不同的节点放置不同的数据库
• 单个节点的处理能力有限制
数据库横向扩展方案--Sharding
• Share nothing (Google, FaceBook, Flickr)
• 数据水平分区(MySQL Cluster)
• 分区的逻辑和数据一致性保证放到数据访问层
• 数据迁移代价大
• 查询和统计变得复杂,join操作是噩梦(数据冗余)
• 一个数据库操作可能转化为多个XA操作
NOSQL 方案
• 高并发读写,海量存储的需求增加
• 对数据一致性要求减少(最终一致性)
• GFS,BigTable,MapReduce
• Hadoop开源实现
• Redis,Tokyo, Cassandra(SimpleDB),MongoDB, Hbase,CouchDB,Dynamo
满足企业应用的需求
• 数据的严格一致性和事务性
• 传统的数据库开发模式
• 复杂的关联查询条件
• 高性能和高扩展性
• 大量的读写操作都是基于(Primary Key)的。
• 简单可行的解决方案--缓存
为什么使用分布式缓存?
未使用缓存的应用
使用非分布式缓存
什么是分布式缓存
未使用缓存的数据库开销
使用分布式缓存的数据库开销
Cache
分布式缓存的特性?
分布式系统的特性
• 数据分区技术
• Consistent Hash
• 数据的一致性保证
• 集群的成员维护和失败检测
• 集中式管理还是分布式管理
• 错误恢复技术
• 临时故障和永久故障
什么是 Coherence?
Oracle Coherence
• 在内存中的数据网格(Data Grid)
• 水平扩展(Scale out)的解决方案• 消除数据库的性能瓶颈
• (Key Value对)的存储方案
• 开发工具包• 纯Java 1.4.2+ 的类库
• 纯 .Net 1.1 和 2.0的客户端类库
• 无第三方包的依赖关系
• 不依赖于任何开源产品和项目
• 用于其它用途的库文件…• 数据库和文件系统的集成
• 与Top Link和Hibernate的集成
• 与Http Session管理, Spring之间的集成, …
Coherence是为了解决性能问题• 在一个分布式系统中,性能由很多因素决定:
• CPU的快慢,算法的好坏,IO....• 应用层的Cache
• 网络延迟• Cache,NearCache
• 网络带宽限制• 获取大量数据,经过计算,存储到数据库
• 获取大量数据,经过计算,只显示一小部分
• 可扩展性• 数据库的扩展性
• 并行计算• 海量数据分析
Coherence是为了解决性能问题
• 许多典型应用的数据库查询是基于主键的查询,将这些查询放到Coherence缓存中,会大大降低数据库的负载
• Coherence分布式Cache本身具有扩展性和高可用性,解放数据库,让它做擅长的事情:存储和复杂查询
• 有了Coherence,不需要数据库复制的方案。只读的Slave完全可以被分布式Cache所替代
• 所有的写操作,一致性有Coherence来保证。数据被异步的持久化到数据库,将数据库的负担降到最低
• 分布式的查询和统计函数可以弥补一些Sharding带来的问题
• 特有的功能降低数据的延迟时间和减少带宽(NearCache,EntryProcessors)
Oracle Coherence的典型用途
• 应用层面的状态数据缓存• 减轻底层系统的负载
• 数据库,主机系统,Web服务器, Web Services
• Http Session内存复制
• 横向扩展应用的状态
• 应用集群以及可靠的数据共享
• 弹性计算引擎
• 基于事件的处理引擎
• 并行处理引擎(类相于MapReduce)
• 极限事物处理引擎• 存储临时的系统数据,获得极限事物处理能力
Coherence的基本概念
Cache的拓扑1:Replicated
Cache的拓扑1:Replicated
Replicated 数据管理
• 成员对所有节点都有逻辑的访问• 对读访问非常快,始终在本地
• 对写(更新)操作,性能跟节点数量相关
• 容错性非常好
• 可以确定的访问和不可预测的更新行为
• 不可以预测的扩展性• Cache 的容量跟最小节点相同
• 适用于小数据尺寸
• 适用于大部分只读的数据
(c) Copyright 2010. Oracle Corporation
(c) Copyright 2010. Oracle Corporation
(c) Copyright 2010. Oracle Corporation
Distributed 数据管理
• 成员对所有节点都有逻辑的访问• 对读访问,最多两个网络操作
• 对写(更新)操作,最多4个网络操作
• 与节点多少没有关系
• 可以确定的访问和更新的行为
• 可以预测的扩展性• Cache 的容量随着节点增加变大
• Coherence对自动对数据的分片进行负载均衡
• 点对点的通讯
• 并不要求multicast
对数据变化进行监控
并行查询
(c) Copyright 2010. Oracle Corporation
(c) Copyright 2010. Oracle Corporation
(c) Copyright 2010. Oracle Corporation
(c) Copyright 2010. Oracle Corporation
Coherence 代码示例
Cluster cluster =
CacheFactory.ensureCluster();
加入和离开
CacheFactory.shutdown();
使用缓存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”);
使用缓存keySet, entrySet, containsKey
NamedCache nc = CacheFactory.getCache(“mine”);
Set keys = nc.keySet();
Set entries = nc.entrySet();
boolean exists = nc.containsKey(“key”);
监听缓存事件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) {
}
});
缓存查询QueryMap
NamedCache nc =
CacheFactory.getCache(“people”);
Set keys = nc.keySet(
new LikeFilter(“getLastName”,
“%Stone%”));
Set entries = nc.entrySet(
new EqualsFilter(“getAge”,
35));
统计操作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”));
有条件修改操作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;
}
}
(c) Copyright 2010. Oracle Corporation