分布式缓存与JavaEE


分布式缓存与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
还剩55页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 8 人已下载

下载pdf