Elasticsearch GatewayModule 底层原理及参数优化深入剖析-搜索系统线上实战

696 阅读5分钟

本套技术专栏作者(秦凯新)专注于大数据及容器云核心技术解密,具备5年工业级IOT大数据云平台建设经验,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。

1 GatewayModule 底层原理

  • gateway module,是负责用来存储每个es节点的cluster state的,node重启的时候,gateway也会负责将本地磁盘上的cluster state给它读取出来,放入内存中

  • local gateway module,用来存储cluster state,并且在集群重启的时候共享数据

  • gateway.expected_nodes:要求必须有多少个节点在集群中,当加入集群中的节点数量达到这个期望数值之后,每个node的local shard的恢复就会理解开始,默认的值是0,也就是不会做任何的等待

  • gateway.expected_master_nodes:要求必须有多少个master node在集群中,只要有这个数量的master node加入了集群,每个node的local shard recovery就会立即开始,默认的值是0

  • gateway.expected_data_nodes:要求必须有多少个data node在集群中,只要有这个数量的master node加入了集群,每个node的local shard recovery就会立即开始,默认的值是0

  • gateway.recover_after_time:如果期望的节点数量没有达标,那么会等待一定的时间,然后就开始进行shard recovery,默认是等待5m

  • 如果gateway.recover_after_time时间范围内,指定数量的节点还没有加入集群,但是只要满足下面的条件之一就会立即开始恢复

      gateway.recover_after_nodes:只要指定数量的节点加入集群,就开始进行恢复
      
      gateway.recover_after_master_nodes:只要指定数量的master节点加入集群,就开始进行恢复
      
      gateway.recover_after_data_nodes:只要指定数量的data node加入集群,就开始恢复
    

2 GatewayModule 参数优化

  • 比如说,集群中一共有10个node

      gateway.recover_after_nodes: 8
      gateway.expected_nodess: 10
      gateway.recover_after_time: 10m
    
  • 要求集群中达到8个节点,接下来,如果等待超过10分钟了,就会开始shard recovery,或者是到了8个节点之后,在10分钟之内,立即到了10个节点,那么也会立即开始shard recovery。

3 其他module底层原理

  • HTTP module

  • HTTP module就是es的http api模块,http机制是完全异步的,也就是说线程不会因为等待响应而陷入阻塞,http异步通信机制的优点就是解决了C10k问题,如果可能的话,尽量使用http keep alive,可以提升性能,而且可以避免客户端发生http chunking现象

  • http module,主要是用来对外提供请求接口服务的,我们不是会向es发送一个rest请求,其实就是走es的http module的,其实就是用来处理外部的请求的

  • http.port,es对外暴露的http api接口的端口号,默认在9200~9300之间选择一个,优先选择9200,如果被绑定,则选择9201,以此类推

  • 我们之前用curl工具,发送http请求,那么其实就是走es的http module,还是http.port设置的http module监听的端口号,默认的话,http.port就是9200,如果9200被占用,那么就会用9201,以此类推,一直到9300

  • network module

  • es默认是绑定到localhost的,这只能让es运行在开发模式下,如果要运行在生产模式下,下面的一些network设置是必须设置的

  • network.host:节点绑定的hostname或者ip地址,设置之后,才能进入生产模式下,主要是对一些网络上的基础性的东西进行一个配置,network.host,绑定的是本地的回环地址,127.0.0.1,进入的是development mode,开发模式,如果将network.host,设置为比如192.168.31.187之类的这种hostname或者ip地址之后,进入production mode,生产模式。

  • transport module

  • transport是用来进行节点间的互相通信的模块,transport.tcp.port:用于配置节点间互相通信的端口号,默认是9300,范围在9300~9400之间,优先绑定9300,如果被占用,则用9301,以此类推,

  • transport module,es各个node之间,其实也会进行频繁的通信,比如交换cluster state,reqeust transfer,比如插入一条document,路由之后,应该是到node3的shard2上去处理,但是请求可能发送到的是node1的shard0上,node1就要将这个document index的请求转发给node3,让node3上的shard2去处理这个请求

  • 默认transport.tcp.port端口号是9300,如果被占用,那么就会用9301,一直到9400,以此类推

3 总结

生产部署还有很多工作要做,本文从初级思路切入,进行了问题的整合。

本套技术专栏作者(秦凯新)专注于大数据及容器云核心技术解密,具备5年工业级IOT大数据云平台建设经验,可提供全栈的大数据+云原生平台咨询方案,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系

秦凯新

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。