Apache Geode 功能特点之数据分页
数据分页
标准的分页是指” 页数据在计算机主存和辅存之间交换”。 GemFire的数据分页所指的是
• 页数据是区域条目值;每一个区域条目值都是一个页。
• “主存”是Java VM的对象堆。
• “辅存”是带有oplog文件分配的磁盘
当区域中启用数据分页时,当堆内存超过使用量,区域将把LRU数据条目从内存清除到磁盘;当区域再次读取条目,数据条目又会被加载到内存中。
paging, overflow-to-disk, 和 evict-to-disk 机制都是相同的。
overflow-only 是指区域配置了没有持久化的分页。区域同时启用分页和持久化数据条目的详细信息, 请看 Data Persistence。
为什么清除数据到磁盘
如果你的Java VM堆内存需要加载更多的数据,那么清除内存的LRU数据,把数据存储在磁盘上是比较合适的解决方案。对于服务器的缓存来说,替代数据清除和数据溢出的方法是分区数据。然而,即使分区数据你也常常需要把数据存在磁盘上。因此,你能够在分区区域中启用数据分页功能。
另外的替代方案是超时数据或者移除数据。这两个方案只是在数据能从外部数据源重载入内存的时候才有效。当你需要所有的数据全部可用,并且没有足够的内存容纳这些数据的时候,数据分页能够给你提供了保存缓存数据最优的解决方案。
怎么配置一个带有数据分页的区域
配置数据分页需要区域清除的action属性设置为 overflow-to-disk。
接下来的例子也使用了一个简单的 lru-entry-count数据清除算法,最大条目200条;同时任何的数据清除算法都能和数据分页一起使用,详情请见 Data Eviction.
大多数的overflow-only 能配置asynchronous-writes 和设定 roll-oplogs 值为 true. 异步 bytes-threshold 和 time-interval 越大,清除数据到磁盘就越快,消耗内存就越多。bytes-threshold设定值到 10,000 bytes , time-interval 为1 秒。
缺省的max-oplog-size 是1Gb,对于一般的应用这个值有点大。 接下来的例子设定此值为10M。
为了达到最佳性能 performance ,三个磁盘目录配置在两个不同的物理磁盘上。
<?xml version="1.0"?>
<!DOCTYPE cache PUBLIC
"-//GemStone Systems, Inc.//GemFire Declarative Cache 6.0//EN"
"http://www.gemstone.com/dtd/cache6_0.dtd">
<cache>
<region name="exampleRegion">
<region-attributes scope="distributed-ack">
<disk-write-attributes
roll-oplogs="true"
max-oplog-size="10">
<asynchronous-writes bytes-threshold="10000" time-interval="1"/>
</disk-write-attributes>
<disk-dirs>
<disk-dir>/disk1/oplogDir1</disk-dir>
<disk-dir>/disk2/oplogDir2</disk-dir>
<disk-dir>/disk1/unusedDir</disk-dir>
</disk-dirs>
<eviction-attributes>
<lru-entry-count maximum="200" action="overflow-to-disk"/>
</eviction-attributes>
</region-attributes>
</region>
</cache>
你能编译和运行此例子,请看 Overflowing Data to Disk Example.
下面XML上有更多的配置信息,请看:
• cache.xml File
• Cache XML Basics
• GemFire Enterprise Cache XML DTD
数据分页工作原理
溢出数据区域是指从内存清除数据到磁盘上的区域,但是他不能持久化数据。以下是对持久化区域的描述,请看 Data Persistence。
当一个溢出数据区域被创建时(通过cache.xml或者APIs),他能够检测到是否有文件已经存在在配置好的目录中 directories。如果检测到有溢出文件存在并且被另一个溢出进程锁定,那么溢出区域创建就会失败。如果溢出文件没有被锁,那么溢出区域将删掉这些文件,然后创建自己的的溢出文件。
此时区域创建完毕,开始投入使用。区域上的操作会把内存中的数据清除到磁盘上(请看 When is data written to disk)。 这个写操作通过追加一条记录到当前的oplog日志上来完成。如果oplog日志满了(请看 Data Persistence#max-oplog-size),区域会自动创建新的oplog日志 created。 写操作可根据实际情况选择同步(synchronously)或者异步(asynchronously)方式。
如果一个条目被读取,而它已经被清除到了磁盘上,那么它的值将被重载入内存中,同时其他条目的值被清除到磁盘上。
旧的,不使用的oplogs 将会被压入当前olog中或者被移除。
使用什么样的磁盘或者目录
创建什么文件
溢出区域的文件系统由oplog文件和lock文件组成。
如果有多个磁盘目录配置,oplog文件能够在任一目录中创建,除了最后一个目录。隐忍最后目录它是预留给持久化DB文件的。
• 第一个目录通常包含一个单独的锁文件,当溢出区域打开时,上面的文件系统所也打开。
一旦虚机出现冲突,区域关闭了,那么这些文件将被销毁,下一次溢出区域开启时会自动创建这些文件。
分页和分区区域
分区区域能够被配置成具有分页功能。每一个在分区区域中存储数据的数据桶都有自己文件集合和统计实例。文件名和统计实例名有数据桶的编号。
当分区区域确定实际的数据桶max-oplog-size属性值时,max-oplog-size 属性通过最大桶数来划分。
既然所有的数据桶有自己的oplog文件,同时它们存储在相同的目录中,那么在同一个虚机里并发写入到不同的数据桶中将会导致非常频繁的磁头移动消耗。因此在带有数据分页的分区区域中降低total-num-buckets将极大提高你的系统性能。
Oplog 创建
此处 here 描述了怎样创建oplogs文件。
数据何时写到磁盘上?
一个数据条目只是它的值被清除到了磁盘上,并不是键值对一起。键留在内存中。
当溢出区域的清除控制限制超出了清除阈值时,数据将被写到磁盘上。
区域中的写操作和资源管理器检测到虚机处于低内存运行状态时,都会触发清除动作。
如果写操作触发了清除动作,那么区域资源降到限制之下时此操作才会停止。此处 here 是写操作详细的信息。下面的写操作不触发清除动作:
• 当条目更新,新值小于旧值时。
• 条目销毁
• 区域级别操作不会导致数据被清除到磁盘上
读操作也有可能导致数据写到磁盘上。这是因为有的读操作需要从磁盘重载数据到内存中,如果此时一旦清除控限制超出了阈值,那么将会有其他的值被清除到磁盘中来扩大内存容量。
如果区域同时开启分页和持久化的功能,那么所有值将立即写到磁盘中。
这种情况下,如果一个值需要从内存中清除,那么他将在内存中解引用(即使他已经被写到磁盘上)。
域数据怎么存储在磁盘上?
溢出区域能够把任何区域中的数据写到磁盘上。通过序列化数据的方式来做到这一点。请看 this怎样序列化你的数据。
从磁盘加载条目值
如果你读一个条目,他的值已经被清除到了磁盘中,那么需要把这个值从磁盘加载到内存中。从oplog 文件中读出此值。这个可能是一个失活的oplog文件,这种情况下,文件描述符可能需要在文件上打开。缺省情况下,最多有7个失活oplog文件需要打开。你也能改变系统设定来配置这个值gemfire.MAX_OPEN_INACTIVE_OPLOGS 。 num 数值是最大的oplog打开的文件数。 如果你需要在一个关闭的失活oplog文件中做读操作,那么LRU打开的失活文件可能关闭,然后打开一个新的文件。