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及存储原理的更多相关文章

  1. ElasticSearch第三弹之存储原理

    我们上文中介绍的ES内部索引的写处理流程是在ES的内存中执行的,而数据被分配到特定的主.副分片上之后,最终是存储到磁盘上的,这样在断电的时候就不会丢失数据.具体的存储路径可在配置文件 ../confi ...

  2. HashMap的存储原理

    HashMap是java中相当重要的数据结构,使用HashMap的场景非常之多,因此,了解HashMap实现的过程和原理,是非常有必要的,在一些面试中也会经常被问到.好了,我们赶紧来研究java内部是 ...

  3. Hadoop(六)之HDFS的存储原理(运行原理)

    前言 其实说到HDFS的存储原理,无非就是读操作和写操作,那接下来我们详细的看一下HDFS是怎么实现读写操作的! 一.HDFS读取过程 1)客户端通过调用FileSystem对象的open()来读取希 ...

  4. HBase底层存储原理

    HBase底层存储原理——我靠,和cassandra本质上没有区别啊!都是kv 列存储,只是一个是p2p另一个是集中式而已! 首先HBase不同于一般的关系数据库, 它是一个适合于非结构化数据存储的数 ...

  5. flash存储原理

    norflash 带有 SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内容每一字节:nandflash器件使用复杂的IO口串行的存取数据,读写操作采用512字节的块(也就是读/写某个字节,必 ...

  6. 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

    重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...

  7. 整型变量修饰符,char类型数据存储原理,字节数,

    //------------------整型变量修饰符 修饰符(int short long longlong signed unsigned)所有修饰符都是用来修整形 int 4short %hd ...

  8. Memcache启动&存储原理&集群

    一. windows下安装启动 首先将memcache的bin文件夹增加到Path环境变量中.方便后面使用命令: 然后运行 memcached –dinstall 命令安装memcache的服务: 然 ...

  9. ValueStack和OGNL达到Struts2形式的数据存储原理

    (1)最近学习struts相框,我们在快乐struts强大.为了便于使用转发,但不了解详细的内部数据存储: (2)网上找了很多关于struts数据存储的原理,但我还没有找到一个具体的解释,本书上找到了 ...

随机推荐

  1. 基于Java+Selenium的WebUI自动化测试框架(八)-----读取元素(XML文件)

    我们继续回到自动化测试框架的主线上来,在前面的文章中,我们定义一个页面元素的主要参数有:路径,找寻方式,等待时间,名称,这个四个参数.另外,我们还需要考虑一个问题,就是网站的页面. 举个例子来说,如果 ...

  2. SignalR 初体验

    目录 一.前言 二.服务端 2.1.站点服务端 2.2.宿主服务或客户端 2.3.持久连接和集线器 三.客户端 3.1.使用代理客户端 3.2.不使用代理客户端 一.前言 微软官方给的说明:ASP.N ...

  3. Linux环境下安装mysql5.6(二进制包不是rpm格式)

    一.准备: 1.CentOS release 6.8 2.mysql-5.6.31-linux-glibc2.5-x86_64.tar.gz 3.Linux下MySQL5.6与MySQL5.7安装方法 ...

  4. 多线程下,使用new实现单例

    import threading class Test(object): from threading import Lock lock = Lock() flag = None def __new_ ...

  5. 2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望

    题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...

  6. jquery点击显示或隐藏

    点击第一个dd,给第一li添加class,点击第二个dd,给第二个li添加class,以此类推 $(function(){     $("dd > a").click(fun ...

  7. HttpServletRequest获取浏览器、服务端和客户端信息

    如何通过HttpServletRequest来获取到上面的属性呢? 1.引入开源工具 <!-- https://mvnrepository.com/artifact/eu.bitwalker/U ...

  8. P4062 [Code+#1]Yazid 的新生舞会

    思路:分治 提交:2次 错因:数组开小 题解: 我们枚举一下众数\(x\). 设\(s[n]=\sum_{i=1}^n [a[i]==x]\) 那么对于区间\((l,r]\),有\(s[r]-s[l] ...

  9. MySQL 事务 MVCC 版本链

      版本链   对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们创建的表中有主键或者非NULL唯一键时都不会包含row_id列):  1) ...

  10. 十.iSCSI网络磁盘

    默认端口:3260 • Internet SCSI,网际SCSI接口 – 一种基于C/S架构的虚拟磁盘技术 – 服务器提供磁盘空间,客户机连接并当成本地磁盘使用   • backstore,后端存储 ...