ElasticSearch的Gateway及存储原理
ES里有一个叫做gateway的东西,今天抽空理一下,前面翻译ES的一篇博文叫做“搜索引擎与时间机器”,既然里面谈到了时间机器,就免不了需要穿越时空的的门咯,I guess,也许gateway这名字就是这么来的,其实在ES里面,gateway的主要职责是用来对数据进行长持久化(持久化了之后加上版本信息,不就可以自由的往还于过去未来之间了吗?),另外,整个集群重启之后可以通过gateway重新恢复数据。
由于ElasticSearch是专为分布式环境而设计的,所以怎么去对所有节点的索引信息进行持久化是个问题,除了索引信息之外,还有ClusterState(集群信息),mapping,索引碎片信息,以及transaction log等信息也是需要进行持久化的,0.11之后的版本新加了LocalGateway(并且是默认配置),加上之前的fs(使用共享文件系统)、hdfs(hadoop 分布式文件系统)、cloud(ec2之类的云存储),0.11之前默认的是None,也就是不进行持久化,这样的话如果服务器都挂了,就会造成数据丢失,local gateway这种模式顾名思义就是节点各自保存其状态,节点直接从本地存储来恢复节点状态和索引信息,localgateway有如下几个选项:
gateway.recover_after_nodes: 1 (or gateway.recovery_after_master_nodes)
gateway.recover_after_time: 5m (m分钟、s秒)
gateway.expected_nodes: 2
当你的节点出现故障或者集群重启的时候,这些配置很重要,你应该尽量保证有了足够多的节点来执行故障恢复,确保得到最终的集群状态,可能存放最新版本的状态信息的节点还未起来,否则可能会丢失数据。
至于索引碎片的恢复则只需用达到足够恢复的数目即可,如果你没有设置备份,或者刚好某个碎片偏偏都丢了,那估计只能是没戏咯,
另外,在我的测试中,2台机器,其中一台网络不稳定,经常断开,(ip冲突造成),造成集群中的节点各种为战,这里有一些参数可配:
discovery.zen.fd.connect_on_network_disconnect : true
discovery.zen.initial_ping_timeout : 10s
discovery.zen.fd.ping_interval : 2s
discovery.zen.fd.ping_retries : 10
如果使用是共享文件系统的gateway,默认是每隔10s将数据异步的复制到共享的文件系统中(这是ES里一个叫gateway snapshot的概念),想想如果集群很大,共享文件系统就需要保存很大的数据量,并且维护以及设备本身成本都很高,而使用local方式则可以做到各个节点自治,确实很方便啊。
有关存储
说了这么半天,还有一个问题就是es工作的存储目录,具体来说就是es服务的索引工作目录,gateway只是做持久化和恢复,不会直接使用,所以还有一个工作目录是用来查询操作的,具体来说就是通过Store模块来完成的(es的每个功能都是一个模块,结构非常好),es的存储设置是per index级别的,所以你可以为每个index指定它存储的位置,既然持久化的工作已经完毕了,本地操作的索引一般只放在两个地方:内存和本地文件系统,主要是性能上考虑的,如果内存很大,那就全部放内存咯,值得一提的是,在ES里,所有存放work目录下(或内存)的东西假定能被丢失的和临时性的,另外你有多个副本存放在不同的节点上,每个索引又拆成了多个碎片位于不同的节点上,假设一台节点上的数据丢了,那也只是整个索引少了其中的一个碎片的一个副本而已,并且es会马上进行碎片的重新分配(allocate),确保数据的完整。
还有一个重要特点就是es可以直接使用jvmheap之外的内存。
下面是一个配置inex使用内存来进行存储的例子(更多配置细节):
index :
store:
fs:
memory:
enabled: true
还有一个就是关于索引碎片数和副本数的配置问题,你不能够对已经存在的索引修改碎片数,也就是有了数据之后就不能修改了,因为目前es只是简单的哈希取模[hash(_id) MOD number_of_shards],如果以后支持一致性哈希,那就很好了,不过副本数目是可以随时动态更改的,如果你要对全局进行设置,参照如下:
gateway:
type: local
index:
gateawy:
snapshot_interval: 30s
number_of_shards: 3
number_of_replicas: 2
path:
logs: /path/to/logs
新创建一个索引并设置:
PUT http://localhost:9200/myindex/
{
"index" : {
"number_of_replicas" :3,
"number_of_shards" :7
}
}
动态设置索引副本数量:
PUT: http://localhost:9200/myindex/_settings
{
"index" : {
"numberOfReplicas" :2
}
}
ElasticSearch的Gateway及存储原理的更多相关文章
- ElasticSearch第三弹之存储原理
我们上文中介绍的ES内部索引的写处理流程是在ES的内存中执行的,而数据被分配到特定的主.副分片上之后,最终是存储到磁盘上的,这样在断电的时候就不会丢失数据.具体的存储路径可在配置文件 ../confi ...
- HashMap的存储原理
HashMap是java中相当重要的数据结构,使用HashMap的场景非常之多,因此,了解HashMap实现的过程和原理,是非常有必要的,在一些面试中也会经常被问到.好了,我们赶紧来研究java内部是 ...
- Hadoop(六)之HDFS的存储原理(运行原理)
前言 其实说到HDFS的存储原理,无非就是读操作和写操作,那接下来我们详细的看一下HDFS是怎么实现读写操作的! 一.HDFS读取过程 1)客户端通过调用FileSystem对象的open()来读取希 ...
- HBase底层存储原理
HBase底层存储原理——我靠,和cassandra本质上没有区别啊!都是kv 列存储,只是一个是p2p另一个是集中式而已! 首先HBase不同于一般的关系数据库, 它是一个适合于非结构化数据存储的数 ...
- flash存储原理
norflash 带有 SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内容每一字节:nandflash器件使用复杂的IO口串行的存取数据,读写操作采用512字节的块(也就是读/写某个字节,必 ...
- 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理
重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...
- 整型变量修饰符,char类型数据存储原理,字节数,
//------------------整型变量修饰符 修饰符(int short long longlong signed unsigned)所有修饰符都是用来修整形 int 4short %hd ...
- Memcache启动&存储原理&集群
一. windows下安装启动 首先将memcache的bin文件夹增加到Path环境变量中.方便后面使用命令: 然后运行 memcached –dinstall 命令安装memcache的服务: 然 ...
- ValueStack和OGNL达到Struts2形式的数据存储原理
(1)最近学习struts相框,我们在快乐struts强大.为了便于使用转发,但不了解详细的内部数据存储: (2)网上找了很多关于struts数据存储的原理,但我还没有找到一个具体的解释,本书上找到了 ...
随机推荐
- js中的forEach和map的区别
我们先来看两者之间的相同之处 var arr = ['a','b','c','d']; arr.forEach(function(item,index,arr){ //item表示数组中的每一项,in ...
- 使用VisualGDB和OpenOCD调试STM32L0开发板
本教程主要介绍如何配置VisualGDB和OpenOCD来调试STM32L0开发板的固件,使微控制器进入睡眠模式. 我们将创建一个NUCLEO-L031K6开发板的基本工程,并介绍当CPU进入休眠模式 ...
- Luogu P2330 繁忙的都市
Luogu P2330 繁忙的都市 裸的最小生成树. 当然,一定要注意它让你输出什么. #include<bits/stdc++.h> #define N 100010 using nam ...
- P2458 [SDOI2006]保安站岗[树形dp]
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- Hibernate初探之单表映射——jar包的导入
编写第一个Hibernate例子需要的基本步骤 创建Hibernate的配置文件 创建持久化类 创建对象-关系映射文件 通过Hibernate API编写访问数据库的代码 使用版本:Hibernate ...
- Ubuntu增加swap交换空间的步骤
1.首先用命令free查看系统内 Swap 分区大小. free -m total used free shared buffers cached Mem: 2012 1960 51 0 748 95 ...
- 多任务5-协程(IO密集型适用)--gevent完成多任务及monkey补丁
代码: import gevent def f1(n): for i in range(n): print(gevent.getcurrent(),i) gevent.sleep(1) def f2( ...
- Windows 创建Raid
Windows 常见raid有0.1和5,以下操作在虚拟机下模拟,学会这招在自己电脑做个raid也未尝不可啊~ 一.RAID 0 创建: 添加两块硬盘,联机并初始化(2T以下选MBR,以上选GPT) ...
- Mina学习+手写服务端+通过telnet连接服务端
1. 2. 3. 4.MinaServer.java package com.mina; import java.io.IOException;import java.net.InetSocketAd ...
- Elasticsearch-head使用及ES相关概念
elasticsearch-head安装和介绍已在上一篇讲了. 在浏览器访问http://localhost:9100,可看到如下界面,表示启动成功: 仔细观察,我们会发现客户端默认连接的是我们ela ...