elasticsearch. 向导

索引存储

存储模块允许你控制你的索引存储的位置,值得特别注意的是,当使用共享存储(shared gateway)方式时,我们是假设本地存储都是临时可丢弃的时候(注:默认是使用的本地存储模式 ( local ),推荐的方式)。

索引既可以保存到内存中(非持久化的方式),也可以保存到磁盘里(持久化,默认的方式),保存到内存中可以提供更好的性能,不过前提是索引的大小不超过内存的物理大小.

当使用本地存储 (local gateway) 时(系统默认), 文件系统不需要内存的存储来维护索引的一致性,而是需要通过每一个节点各自存储其索引状态来维护整个集群的索引状态,而如果使用共享存储(如NFS或者亚马逊S3)则索引可以很安全的放在内存中,不需要任何副本.

另外一个重要基于内存的索引存储的特性,是ElasticSearch支持将索引存放在JVM之外的内存空间,这就是说,不需要使用额外的巨大的JVM堆来存放索引了(参考hazelcast,这样的好处很多(尤其是内存很大的时候),比如避免由GC引起的停顿)。

下面是ES支持的各种存储类型以及比较.

文件系统(File System)

基于文件系统的存储方式是ES的默认方式,并且也有许多各种各样的lucene存储类型的实现,根据操作系统会自动进行选择,如 mmapfs on Solaris/Windows 64bit, simplefs on Windows 32bit, and niofs for the rest.

下面是各种基于文件系统的索引存储类型的比较:

Simple FS

simplefs 类型是文件系统存储的最直接的实现, (对应于 Lucene的 SimpleFsDirectory) ,随机读写文件. 不过该实现并发性能不高,多线程下将会成为瓶颈,一般使用 niofs 来做索引持久化比较好.

NIO FS

niofs 类型使用非阻塞的方式(NIO :nonblocking i/o)存储索引碎片到文件系统中(对应于 Lucene NIOFSDirectory) . NIO FS 支持多线程同时读同一个文件,但是在windows下不推荐使用该类型,因为SUN Java的实现有一个bug,汗!.

MMap FS

mmapfs 类型通过将文件与内存进行映射(mmap)来存储索引碎片到文件系统 (对应 Lucene MMapDirectory) . 内存映射分配一部分进程的虚拟内存地址,该大小与需要映射的文件数一致. 不过使用之前,要保证拥有足够的虚拟地址空间.

Memory

memory 类型即存储索引到主内存中,有下面相关的配置选项:

另外在节点( node )级别的设置可以控制缓存或者缓冲(当使用direct buffer的时候,这些都是很重要的配置):

配置 说明
cache.memory.direct 是否允许内存在JVM 堆外面进行分配,默认 true.
cache.memory.small_buffer_size buffer size的最小值,默认 1kb.
cache.memory.large_buffer_size buffer size的最大值,默认 1mb.
cache.memory.small_cache_size buffer cache 最小值,默认 10mb.
cache.memory.large_cache_size buffer cache最大值,默认 500mb.
 
Fork me on GitHub