这是ElasticSearch 2.4 版本系列的第二篇:html
ElasticSearch共有两个配置文件,都位于config目录下,分别是elasticsearch.yml和logging.yml,其中,elasticsearch.yml 是全局配置文件,用于在服务器级别对ElasticSearch进行配置。ElasticSearch的配置选项分为静态设置和动态设置两种,静态设置必须在结点级别(node-level)设置,或配置在elasticsearch.yml配置文件中,或配置在环境变量中,或配置在命令行中,在结点启动以后,静态设置不能修改。集群的名字和结点的名称:cluster.name 和 node.name,这两个配置项是静态配置项,不能在集群运行时修改,而动态配置项能够在集群运行时经过RESTful API进行修改。java
一,配置集群的标识(cluster.name)node
经过 cluster.name 属性配置集群的名字,用于惟一标识一个集群,不一样的集群,其 cluster.name 不一样,集群名字相同的全部节点自动组成一个集群。若是不配置改属性,默认值是:elasticsearch。当启动一个结点时,该结点会自动寻找相同集群名字的主结点;若是找到主结点,该结点加入集群中;若是未找到主结点,该结点成为主结点。正则表达式
注意:在yml中对Elasticsearch进行全局配置,要注意配置选项的格式:option: value,在“:”以后保留一个空格,以后是选项值;配置选项不要有前置空格。bootstrap
配置集群的名字为myesclusterwindows
cluster.name: myescluster
二,结点的配置数组
ElasticSearch集群中,共有五种结点类型:主结点(Master),候选主结点(Master-eligible),数据结点(Data),吸取结点(Ingest)和部落结点(Tribe)。在一个集群中,主结点只有一个,负责管理集群,执行集群级别的操做,好比建立或删除索引,跟踪集群的组成结点的状态,决定将分片分配的目标结点,对集群来讲,一个稳定的主结点十分重要。集群会自动进行健康检测,当主结点出现故障时,集群中的候选主结点进行选举,在选举结束以后,一个候选主结点被选举成为新的主结点,实现集群故障的自动转移。候选主结点具备投票权,其余结点没有投票权。缓存
1,配置候选主结点和数据结点安全
默认状况下,ElasticSearch将当前节点配置为同时做为候选主结点和数据结点:服务器
配置当前结点只保存数据:
node.master: false node.data: true
配置当前结点不保存数据,只作候选主结点:
node.master: false node.data: true
2,主结点选取的配置
discovery.zen.minimum_master_nodes 属性:默认值是1,该属性定义的是为了组成一个集群,相互链接的候选主结点的最小数目,强烈推荐该属性的设置使用多数原则:(master_eligible_nodes / 2) + 1,既能避免出现脑裂(split-brain),又能在故障发生后,快速选举出新的主结点,例如,有5个候选主结点,推荐把该属性设置为3。
3,结点的路径(Path)
默认状况下,ElasticSearch使用基于安装目录的相对路径来配置结点的路径,安装目录由属性path.home显示,在home path下,ElasticSearch自动建立config,data,logs和plugins目录,通常状况下不须要对结点路径单独配置。结点的文件路径配置项:
4,单个ElasticSearch实例的Java虚拟机(JVM)的堆内存限制
ElasticSearch实例必须运行在安装JDK的机器上,在安装完Java Runtime组件以后,必须建立系统变量JAVA_HOME,指定JDK安装的位置,好比:
JAVA_HOME: C:\Program Files\Java\jre1.8.0_121\bin
默认的JVM内存限制是 1GB,对小项目而言,1GB内存足够使用,不会出现问题,可是,对大项目而言,这个默认限制过小了,若是日志文件中常常出现OutOfMemoryError异常消息,就考虑从新设置 ES_HEAP_SIZE 环境变量,为JVM分配足够的内存,同时,必须为OS分配足够的内存,建议JVM使用的物理内存最大不该超过32GB,推荐分配机器物理内存的50%,在Windows中建立新的系统环境变量 ES_HEAP_SIZE,设置堆内存大小为5G:
环境变量
ElasticSearch 首先读取通用的JAVA_OPTS环境变量来获取JVM参数, 除了能够用JAVA_OPTS配置JVM参数外, 还能够经过ElasticSearch提供的ES_JAVA_OPTS环境变量配置JVM参数, ES_JAVA_OPTS会覆盖JAVA_OPTS中配置的相同参数, 官方建议是在JAVA_OPTS中配置通用的参数, 在ES_JAVA_OPTS中配置针对Elasticsearch须要调整的参数。环境变量最主要的做用是指定 -Xmx 最大堆大小和 -Xms 最小堆大小。
JAVA_OPTS ,是用来设置JVM相关运行参数的环境变量,例如:JAVA_OPTS="-server -Xms2048m -Xmx2048m"
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
三,索引配置
1,配置索引的分片(shard)和副本(replica)数量
默认的配置是把索引分为5个分片,每一个分片1个副本,共10个结点:
index.number_of_shards: 5 index.number_of_replicas: 1
禁用索引的分布式特性,使索引只建立在本地主机上:
index.number_of_shards: 1 index.number_of_replicas: 0
2,当前节点锁住内存
当JVM作分页切换(swapping)时,ElasticSearch执行的效率会下降,推荐把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,而且保证机器有足够的物理内存分配给ES,同时容许ElasticSearch进程锁住内存:
bootstrap.mlockall: true
3,断路器(Circuit Breaker)控制内存的使用量
断路器用于阻止产生OutOfMemoryError的操做,每个断路器设置一个内存使用的上限,一旦操做达到该上限,ElasticSearch将阻止该操做继续使用内存。设置较多,通常不须要修改,保持默认值:
4,字段数据缓存
在对一个字段执行排序或聚合操做时,使用字段数据缓存(field data cache)将该字段的值加载到内存,以加快查询的速度。加载字段数据还原是IO密集的操做,推荐分配足够的内存,而且不分配过时时间:
5,结点查询缓存:
查询缓存用于缓存查询的结果,每个节点都有一个查询缓存,缓存过时使用LRU淘汰策略(Least Recently Used eviction):当缓存满时,最近最少使用的数据被淘汰,从缓存中清除,以存储新的数据。
6,索引缓存
索引缓存用于存储最新的索引文档(newly indexed documents),当该缓存填充满时,缓存的文件将被写入到磁盘中的段(segment)中。
7,分片请求缓存:
当对一个索引执行查找请求(Search Request)时,每个相关的分片(involved shard)都在本地执行查询,返回查询结果(local result)给协调结点(coordinating node)进行组合(combine),将各个分片的结果合并为最终的结果集返回。分片请求缓存对每一个分片的查询结果进行缓存。
8,索引的刷新频率
索引对象刷新的频率,刷新频率越低,文档对搜索操做可视的时间越长:
9,段(Segment)合并
每一个索引分为多个段(Segment),一个段写入硬盘后,就不能再被更新,所以,被删除文档的信息存储在一个单独的文件中。ElasticSearch支持文档的更新,在底层,其实是删除旧文档,再把更新内存的文档编入索引。在查找时,须要从返回结果中过滤掉已删除的文档。
若是数据更新或删除的数据比较多,那么每一个段中的有效数据密度会变低,下降了查询的性能,经过段合并,将已删除的数据从段(Segment)中物理删除,可以提升搜索性能,合并的过程是:底层的Lucene库获取若干段,从段中过滤已删除的数据,保存到一个新的段上;段合并完成以后,将源段从硬盘上物理删除;段合并操做的CPU和IO的消耗是很是高的,必须控制段合并执行的频率和时机。
段合并的策略控制段合并的时机,在适当的条件下进行段合并:
段合并的线程控制,以串行或并发方式执行段合并:
合并因子控制段合并的频率,合并因子越小,合并的频率越高:
段合并调节器,限制合并的速度:
四,集群的网络配置
1,结点的IP地址配置
配置当前结点绑定的IP地址,默认为0.0.0.0
network.bind_host: 192.168.0.1
设置其它结点和该结点交互的ip地址,若是不设置它会自动判断,值必须是个真实的ip地址
network.publish_host: 192.168.0.1
同时设置bind_host和publish_host两个参数
network.host: 192.168.0.1
2,设置结点间交互的TCP端口,默认是9300
transport.tcp.port: 9300
3,设置对外服务的HTTP端口,默认为9200
http.port: 9200
4,设置是否压缩TCP传输时的数据,默认为false,不压缩
transport.tcp.compress: true
5,设置HTTP包内容的最大容量,默认100mb
http.max_content_length: 100mb
6,是否启用HTTP协议对外提供服务,默认为true,开启
http.enabled: true
五,集群的发现机制(Discovery)
ElasticSearch使用zen发现来寻找结点和选举主结点,组建集群;zen发现默认使用多播,可是,单播发现比较安全,推荐使用单播发现。
1,配置多播(multicast)
多播(multicast)是zen发现的默认方法,主要有如下配置选项:
2,配置单播(unicast)
使用单播时,老是禁用多播,单播的配置选项:
discovery.zen.ping.unicast. hosts:指定接收单播请求的主机IP地址,推荐包含组成集群的全部主机,主机之间用逗号隔开;
discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
3,结点之间的状态检测
ping是结点之间发送的心跳信号,用于检测其余结点是否健康运行,若是其余结点没法响应该信号,那么集群认为该结点发生故障,配置ping信号的属性:
六,本地网关(Gateway)和还原(Recovery)
网关用于持久化存储集群的数据,包括集群的状态,索引和索引里面的数据,索引的类型映射和索引级别的配置信息等元数据,网关至关于关系型DB的事务日志。每一次集群数据的改变,ElasticSearch都将集群的数据存储到网关中。当集群从新启动时,它将会从网关中读取集群的数据,还原到上一次停机时的状态。
1,网关的类型
目前只支持local类型(本地网关),在本地文件系统中存储索引及其元数据;
gateway.type: local
2,还原控制
还原控制的选项有:
3,保护动做
默认状况下,ElasticSearch自动建立索引,推荐关闭该选项
action.disable_close_all_indices: true action.disable_delete_all_indices: true action.disable_shutdown: true action.auto_create_index: false
4,还原限制(Recovery Throttling)
七,线程池配置
Elasticsearch公开两种类型的线程池:
对于固定大小的线程池类型,必须为ElasticSearch指定一个请求队列(queue)用来保存请求,请求被存储到队列中,直到有一个空闲的线程来执行请求;若是队列满了,ElasticSearch没法把请求存放到队列中,该请求将被拒绝;
附言:
ElasticSearch引擎的配置选项很是多,而且要真正理解这些配置选项对引擎的影响,也不是一件容易的事,不过,不用担忧,在使用ElasticSearch时,真正须要修改配置选项的状况少之又少,因此,一般使用默认的配置就能知足生产环境的要求,ElasticSearch重要配置示例:
## cluster cluster.name: "my-es-cluster" ## node node.name: "node-1" node.master: true node.data: true ## index index.number_of_shards: 1 index.number_of_replicas: 0 ## memory bootstrap.mlockall: true ## network network.host: 192.168.0.1 transport.tcp.port: 9300 http.port: 9200 ## discovery discovery.zen.minimum_master_nodes: 1 discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["host1", "host2:port"] ## protection action.auto_create_index: false
## scripting script.inline: true script.indexed: true
参考文档:
Elasticsearch Reference [2.4] » Setup » Configuration
Elasticsearch Reference [2.4] » Modules
Elasticsearch Reference [2.4] » Modules » Node
Install and configure Elasticsearch in Windows