发现,故障修复以及恢复
在发现节点,主要是使用ES的zen模块来进行发现,发现的目的就是加入集群,zen的发现有两种模式分别是单播和组播,单播是指配置好了要发现的节点IP,组播则是指不配置具体IP,向局域网广撒网,寻找同名节点,并组成集群。
为了避免在组成集群的时候导致"脑裂"情况,即因为网络通信原因,集群通信被分成了几部分,因为ES集群具有选主的功能,每个部分有组成小集群;通过配置集群的最小组织成员数,比如半数+1,保证了当前集群机器,最多只能组成一个集群,如果有因为某个原因,某台机器离开,也无法再组织处一个新的集群。
集群选举出来的master和data/client节点将会当时互相ping;如果master无法和data/client节点ping通,那么将会标记该节点下线;data/client节点无法和master通信,那么将会触发选主。
关于故障修复,在ES里面故障修复就是发生在本地,ES里面的名词叫"本地网关",他是一个组件,用于恢复ES在本地里面的数据,这里包括元数据以及文档数据。恢复API是_recovery?pretty;但是恢复我理解应该是在集群重启之后自动进行的这个过程其实并不需要太多的人为干预。但是修复并不是像我们想象的那么简单,里面有很多配置,比如可以指定节点数达到多大才开始进行恢复,如果后来进入的节点可能因为错过了而无法恢复,因为恢复过程是由ES内容通过UDP指令方式(Java API)下发下去的,比如8台机器,配置满足了5台机器恢复,那么剩下的三台可能会因为加入完了而被推迟恢复,或者不背恢复。除非重启。
部落(tribe)
接着说一下ES里面的部落:tribe,可以在查询过程中链接两个集群的数据,查询的数据将会汇总到tribe节点,有tribe节点对数据进行整合再发送给client;tribe还可以写数据,但是这里有一个限制就是写的索引只能是一个集群所有;如果写入两个集群同名索引,那么只能成功写入一个,至于写入哪一个可以通过配置偏好实现。可以通过配置指明tribe只能读,不能写。
提高性能
如果数据频繁的更新,查询性不可重复(比如日志量更新量很大,不断查询最近15分钟日志),其实缓存的价值并不是很大;
对于内存压力很大的排序,汇总等处理,使用docValues来进行数据的字段级别的缓存,他占用极少的内存;
建议关闭Unix的内存关闭,bootstrap.mlockall=true;
热点线程:_nodes/hot_threads;可以获取那些占用了大量内存和cpu的线程,可以指定返回的条数,另外返回的内容不是json,而是一段组织好的文本;
扩展ES:有水平和垂直两种,重点说一下垂直。两种方式:多分片和多副本;如果瓶颈在于硬盘不够了,那么增加分片,做存储的负载均衡;如果瓶颈在于查询的压力,那么增加副本做请求的负载均衡;
关于副本,ES提供了一种自动创建副本的机制,就是实现某些索引的数据自动在所有的节点进行部署副本,这类数据首先是别频发使用的,比如基础数据,另外就是占用空间不能太大,否则每个节点都部署,存储压力会很大。
提高新能之对于高负载的场景:
存储使用default,
考虑延长刷新时间,默认是1s,设置为10s~30s,减少I/O压力;
优化线程池,注意大多数情况下默认配置是OK的,当且仅当主机计算能力有富余,同时操作有队列(有积压)的情况下,需要考虑调整线程池;
控制合并过程,主要控制段(segment)的大小,段是Lucene里面的物理存储单元,段越小,导致段很多,会导致查询变慢,内存使用量增加,但是索引会变得很快;如果你希望加快查询那么控制段的大小在一个相对较大的程度,这样会减少段的数量;
限流,可以控制I/O流量;
分布式,通过分布式,比如分片来减轻存储的压力;
提高性能之对于高频查询的场景:
尽量多利用缓存,比如过滤器缓存(倒排索引),分片缓存(非倒排索引);
使用路由;减少因为合并各方数据浪费的时间;
提高性能之对于高索引场景:
批量索引,注意控制段的大小,不要过大。