重要的Elasticsearch配置
虽然Elasticsearch只需要很少的配置,但是在投入生产之前需要考虑许多设置。
path.data和path.logs
如果你使用.zip
或.tar.gz
归档,数据和日志目录都是$ES_HOME
的子文件夹,如果这些重要的文件夹被保留在它们的默认位置,那么在升级到新版本时,它们很有可能被删除。
在生产使用中,你几乎肯定希望更改数据和日志文件夹的位置:
path:
logs: /var/log/elasticsearch
data: /var/data/elasticsearch
RPM和Debian发行版已经为数据和日志使用了自定义路径。
path.data
设置可以设置为多个路径,在这种情况下,所有路径都将用于存储数据(尽管属于单个碎片的文件都将存储在相同的数据路径上):
path:
data:
- /mnt/elasticsearch_1
- /mnt/elasticsearch_2
- /mnt/elasticsearch_3
cluster.name
节点只有在与集群中的所有其他节点共享其cluster.name
时才能加入集群,默认的名称是elasticsearch
,但是应该将其更改为描述集群用途的适当名称。
cluster.name: logging-prod
确保不要在不同的环境中重用相同的集群名称,否则可能会导致节点加入错误的集群。
node.name
默认情况下,Elasticsearch将使用随机生成的UUID的前7个字符作为节点id。注意,节点id是持久的并且在节点重新启动时不会更改,因此默认节点名也不会更改。
值得配置一个更有意义的名称,这个名称在重新启动节点之后也具有持久化的优势:
node.name: prod-data-2
节点名也可以设置为服务器的主机名如下:
node.name: ${HOSTNAME}
network.host
在默认情况下,Elasticsearch只绑定回环地址 — 例如,127.0.0.1
和[::1]
,这足以在服务器上运行单个开发节点。
实际上,可以从单个节点上相同的$ES_HOME
位置启动多个节点,这对于测试Elasticsearch形成集群的能力是很有用的,但是这并不是推荐用于生产的配置。
为了与其他服务器上的节点进行通信并形成集群,你的节点将需要绑定到非回环地址,虽然有许多网络设置,但通常你需要配置的只是network.host:
network.host: 192.168.1.10
network.host
设置还可以理解一些特殊值,如_local_
、_site_
、_global_
和像:ip4
和:ip6
的修饰符,详细信息可以在network.host的特殊值中找到。
很快你就可以为network.host
提供一个自定义设置,Elasticsearch假定你正在从开发模式转换到生产模式,并将许多系统启动检查从警告升级到异常,有关更多信息,请参见开发模式与生产模式。
发现设置
Elasticsearch使用一种名为“Zen discovery”的自定义发现实现,用于节点到节点的集群和主选择,在开始生产之前应该配置两个重要的发现设置。
discovery.zen.ping.unicast.hosts
在没有任何网络配置的情况下,Elasticsearch将绑定到可用的回环地址,并扫描端口9300到9305,以尝试连接到同一服务器上运行的其他节点,这提供了自动集群体验,而无需进行任何配置。
当节点在其他服务器上形成集群时,你必须提供集群中可能存在的其他节点的种子列表,可以指定如下:
discovery.zen.ping.unicast.hosts:
- 192.168.1.10:9300
- 192.168.1.11
- seeds.mydomain.com
- 如果没有指定端口号,端口将默认为
transport.profiles.default.port
,并且回退到transport.tcp.port
- 解析到多个IP地址的主机名将尝试所有已解析的地址
discovery.zen.minimum_master_nodes
为了防止数据丢失,配置discovery.zen.minimum_master_nodes
非常重要,使每个适合的主节点都知道要形成集群必须可见的适合的主节点的最小数目。
如果没有这种设置,遭受网络故障的集群有可能被分割成两个独立的集群 - 脑分裂 - 这将导致数据丢失,使用minimum_master_nodes
避免脑分裂提供了一个更详细的解释。
为了避免脑分裂,这个设置应该设置为适合的主节点的法定数量:
(master_eligible_nodes / 2) + 1
换句话说,如果有三个适合的主节点,那么最小主节点应该设置为(3 / 2) + 1
或2
:
discovery.zen.minimum_master_nodes: 2
堆大小设置
在默认情况下,Elasticsearch告诉JVM使用最小和最大大小为1GB的堆,在迁移到生产时,重要的是配置堆大小以确保Elasticsearch有足够的可用堆。
Elasticsearch将在jvm.options中通过Xms
(最小堆大小)和Xmx
(最大堆大小)的设置分配指定的整个堆。
这些设置的值取决于服务器上可用RAM的总数,好的经验法则是:
- 设置最小堆大小(
Xms
)和最大堆大小(Xmx
)彼此相等。 - 对Elasticsearch可用的堆越多,它用于缓存的内存就越多。但是请注意,过多的堆可能会使你陷入长时间的垃圾收集停顿。
- 将
Xmx
设置为不超过物理RAM的50%,以确保有足够的物理RAM留给内核文件系统缓存。 -
不要将
Xmx
设置在JVM用于压缩对象指针的截点之上(被压缩的oops)。确切的截点不同,但接近32GB,你可以通过在日志中查找如下所示的行来验证你是否处于限制之下:heap size [1.9gb], compressed ordinary object pointers [true]
-
更好的方法是,尽量低于零基础被压缩的oops阈值。确切的截点不同,但在大多数系统中26GB是安全的,但在某些系统中可能高达30GB。你可以通过使用JVM选项
-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode
启动Elasticsearch,并查找如下所示的行来验证你是否处于限制之下:heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
显示零基础被压缩的oops被启用,而不是:
heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
下面是如何通过jvm.options
设置堆大小的示例:
-Xms2g
-Xmx2g
- 设置最小堆大小为2g
- 设置最大堆大小为2g
还可以通过环境变量设置堆大小,这可以通过注释jvm.options
文件中的Xms
和Xmx
设置来实现,并通过ES_JAVA_OPTS
设置这些值:
ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch
- 设置最小和最大堆大小为2GB
- 设置最小和最大堆大小为4000MB
为Windows服务配置堆与上面的不同,最初为Windows服务填充的值可以如上所述进行配置,但在被安装为服务之后会有所不同,有关更多细节,请参阅Windows服务文档。
JVM堆转储文件路径
默认情况,Elasticsearch配置JVM将内存溢出异常堆转储到默认数据目录(RPM和Debian包发行版的/var/lib/elasticsearch
目录,和Elasticsearch的tar和zip存档发行版的安装根目录下的的data
目录)。如果此路径不适合接收堆转储,你应该在jvm.options
中修改条目-XX:HeapDumpPath=...
。如果你指定了一个目录,JVM将根据运行实例的PID为堆转储生成一个文件名。如果你指定了一个固定的文件名而不是目录,那么当JVM需要在内存溢出的异常上执行堆转储时,该文件必须不存在,否则堆转储将失败。
GC日志记录
默认情况下,Elasticsearch支持GC日志,它们在jvm.options
中配置,并默认为与Elasticsearch日志相同的默认位置。默认配置每64MB滚动日志一次,最多可以占用2g的磁盘空间。
临时目录
默认情况下,Elasticsearch使用一个私有的临时目录,启动脚本直接在系统临时目录下创建它。
在一些Linux发行版中,如果文件和目录最近没有被访问过,系统实用程序将从/tmp
中清除它们。如果需要临时目录的特性长时间没有使用,这可能导致在Elasticsearch运行时删除私有临时目录,如果随后使用了需要临时目录的特性,则会导致问题。
如果你使用.deb
或.rpm
包安装Elasticsearch,并在systemd
下运行,那么Elasticsearch使用的私有临时目录将被排除在定期清理之外。
但是,如果你打算在Linux上运行.tar.gz
发行版一段较长的时间,那么你应该考虑为Elasticsearch创建一个专用的临时目录,它不在清除旧文件和目录的路径下。这个目录应该有权限设置,以便只有Elasticsearch运行的用户才能访问它,然后在启动Elasticsearch之前设置$ES_TMPDIR
环境变量指向它。
JVM致命错误日志
默认情况下,Elasticsearch配置JVM将致命错误日志写入默认日志目录(这里是RPM和Debian软件包发行版的/var/log/elasticsearch
,以及tar和zip归档发行版的Elasticsearch安装根目录下的logs
目录)。这些是JVM在遇到致命错误(例如,分段故障)时生成的日志。如果此路径不适合接收日志,你应该修改在jvm.options
中-XX:ErrorFile=…
条目到另一个路径。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。