搜索引擎ElasticSearch之(3)、配置详解

1、elasticsearch服务配置

1.1、Cluster集群配置

参数名称 默认值 说明
cluster.name elasticsearch 集群名称,只有具有相同集群名的节点才能组成一个逻辑集群

1.2、Node节点配置

参数名称 默认值 说明
node.name 系统生成 节点名称,同一集群的各节点名称必须不同,不配置则系统默认生成
node.attr.rack 节点部落属性

1.3、Paths路径配置

参数名称 默认值 说明
path.conf 配置文件路径
path.data 数据存储位置,可以以逗号分隔配置多个存储位置,有利于提升安全性
path.work 临时文件存储路径
path.logs 日志文件存储路径

1.4、Memory内存配置

参数名称 默认值 说明
bootstrap.mlockall true 当JVM开始写入交换空间时(swapping)ElasticSearch性能会低下,应该保证它不会写入交换空间,设置这个属性为true来锁定内存,同时也要允许elasticsearch的进程可以锁住内存

1.5、网络及http配置

参数名称 默认值 说明
network.bind_host 0.0.0.0 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0
network.publish_host 设置其它节点和该节点交互的ip地址,如果不设置它会自动设置,值必须是个真实的ip地址
network.host 同时设置bind_host和publish_host上面两个参数
transport.tcp.port 9300 设置节点间交互的tcp端口,默认是9300
transport.tcp.compress false 设置是否压缩tcp传输时的数据,默认为false,不压缩
http.port 9200 设置对外服务的http端口,默认为9200
http.max_content_length 100Mb 设置请求内容的最大容量,默认100mb
http.enabled false 使用http协议对外提供服务,默认为true,开启
http.cors.enabled true 使用head等插件监控集群信息,需要打开
http.cors.allow-origin “*” 使用head等插件监控集群信息,需要打开
http.cors.allow-credentials true 使用head等插件监控集群信息,需要打开

1.6、Geteway网关

参数名称 默认值 说明
gateway.type local gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统
gateway.recover_after_nodes 1 一个集群中的N个节点启动后,才允许进行恢复处理
gateway.recover_after_time 5m 设置初始化恢复过程的超时时间,超时时间从上一个配置中配置的N个节点启动后算起
gateway.expected_nodes 2 设置这个集群中期望有多少个节点.本地节点恢复会在这N个节点启动(并且recover_after_nodes也符合)加入集群之后开始执行。

1.7、Recovery集群恢复

参数名称 默认值 说明
cluster.routing.allocation.node_initial_primaries_recoveries 4 初始化数据恢复时,并发恢复线程的个数,默认为4
cluster.routing.allocation.node_concurrent_recoveries 2 添加删除节点或负载均衡时并发恢复线程的个数,默认为2
indices.recovery.max_bytes_per_sec 0 设置恢复时的吞吐量(例如:100mb,默认为0无限制.如果机器还有其他业务在跑的话还是限制一下的好)
indices.recovery.concurrent_streams 5 设置来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5

1.8、Discovery集群发现

参数名称 默认值 说明
discovery.zen.minimum_master_nodes 1 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点.默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.ping.timeout 3 探查的超时时间,默认3秒,提高一点以应对网络不好的时候,防止脑裂
discovery.zen.ping.multicast.enabled true 设置是否打开多播发现节点.默认是true, 当多播不可用或者集群跨网段的时候集群通信还是用单播吧
discovery.zen.ping.unicast.hosts 这是一个集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测

1.9、Cache缓存

参数名称 默认值 说明
indices.cache.filter.size 10% filter cache缓存的临界值,如1gb或20%等
index.cache.field.expire 缓存过去时间
index.cache.field.max_size 缓存的最大条数
index.cache.field.type 缓存类型

1.10、Translog配置

参数名称 默认值 说明
index.translog.flush_threshold_ops unlimited 当发生多少次操作时进行一次flush
index.translog.flush_threshold_size 512mb 当translog的大小达到此值时会进行一次flush操作
index.translog.flush_threshold_period 30m 在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作
index.translog.interval 5s 多少时间间隔内会检查一次translog,来进行一次flush操作.es会随机的在这个值到这个值的2倍大小之间进行一次操作
index.gateway.local.sync 5s 多少时间进行一次的写磁盘操作

1.11、线程池配置

搜索引擎ElasticSearch之(3)、配置详解
线程池配置.png

2、重要配置

2.1、内存配置

确保将对内存最大值和最小值设置为相同大小,防止出现在运行时改变堆内存大小而消耗系统资源;

lucene会消耗大量的非堆内存,其被设计可以很好利用操作系统的底层缓存机制,从而提升检索性能。标准建议将50%可用内存作为es的堆内存,剩下50%交给操作系统及lucene,如不考虑对分词字符串的聚合操作(不使用fielddata),可以降低对内存,这样对es及lucene的性能都会提升;

同时对内存最大不要超过32GB,Java 使用一个叫作 内存指针压缩(compressed oops)的技术来解决这个问题。 它的指针不再表示对象在内存中的精确位置,而是表示 偏移量 。这意味着 32 位的指针可以引用 40 亿个 对象 , 而不是 40 亿个字节。最终, 也就是说堆内存增长到 32 GB 的物理内存,也可以用 32 位的指针表示。

一旦你越过那个神奇的 ~32 GB 的边界,指针就会切回普通对象的指针。 每个对象的指针都变长了,就会使用更多的 CPU 内存带宽,也就是说你实际上失去了更多的内存。事实上,当内存到达 40–50 GB 的时候,有效内存才相当于使用内存对象指针压缩技术时候的 32 GB 内存。

2.2、swapping对性能的影响

内存交换到磁盘对服务器性能来说是致命的,最好的办法就是在你的操作系统中完全禁用 swap。可以设置配置文件中的 mlockall 开关, 它的作用就是允许 JVM 锁住内存,禁止操作系统交换出去。