Java(JVM) 版本
Elasticsearch是使用Java构建的,并且至少需要Java 8才能运行。 只支持Oracle的Java和OpenJDK。 在所有Elasticsearch节点和客户端上应使用相同的JVM版本。
我们建议安装Java版本1.8.0_73*或更高版本。 如果使用已知的错误版本的Java,Elasticsearch将拒绝启动。
Elasticsearch使用的Java版本可以通过设置JAVA_HOME
环境变量进行配置。
注意
Elasticsearch自带的JVM默认配置是运行在64位服务器上的, 如果你想以客户端模式运行在32位机器上,你需要在jvm.options配置文件中删除
-server
参数,以及无论是在32位客户机还是服务器上运行Elasticsearch,你都需要重新配置线程堆大小在-Xss1m
与-Xss320k
之间
注意:jvm.option文件最好不要改动,使用官方默认配置,如果要自定义一些配置参数,则在jvm.config.d文件中新建一个配置文件
作为守护进程运行elasticSearch
~elasticSearch目录下
./bin/elasticsearch -d -p pid
在命令行配置Elasticsearch
./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1
提示
通常情况下,任何集群范围的设置(例如cluster.name
)应该被加入到elasticsearch.yml配置文件,而任何特定于节点的设置,例如node.name
可以在命令行上被指定。
配置文件格式:
配置格式为YAML。 下面是更改数据目录和日志目录路径的示例:
path:
data: /var/lib/elasticsearch
logs: /var/log/elasticsearch
设置也可以展平开如下:
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
path.data
path.data
配置可以设置为多个路径,在这种情况下,所有路径将用于存储数据(虽然属于单个分片的文件将全部存储在同一数据路径上):
cluster.name
节点只能在群集与群集中的所有其他节点公共相同的cluster.name
时才能加入群集。 默认名称为elasticsearch
,但您应将其更改为描述集群用途的适当名称。
cluster.name: logging-prod
确保不要在不同的环境中重复使用相同的集群名称,否则可能会导致加入错误集群的节点。
node.name
默认情况下,Elasticsearch将使用随机生成的uuid的前7个字符作为节点id。 请注意,节点ID是持久化的,并且在节点重新启动时不会更改,因此默认节点名称也不会更改。
值得配置一个更有意义的名称,这也将有重新启动节点后仍然存在的优势:
node.name: prod-data-2
node.name也可以设置为服务器的HOSTNAME,如下所示:
node.name: ${HOSTNAME}
bootstrap.memory_lock
禁用JVM的swapped交换到磁盘对节点健康是至关重要的。 实现的一种方法是将bootstrap.memory_lock
设置为true
。
要使此设置生效,需要首先配置其他系统设置。
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
的配置,Elasticsearch将假设你已经从开发模式转到了生产模式,并将升级系统检测的警告信息为异常信息。更多信息请参见:开发模式vs生产模式
在jvm.options中设置JVM堆大小
默认情况下,Elasticsearch告诉JVM使用堆的最小值和最大值的2GB。切换到生产时,保证Elasticsearch有足够的可用堆是非常重要的。
Elasticsearch将通过jvm.options中的Xms(堆的最小值)与Xmx(堆的最大值)设置来分配堆的大小。
这个值依赖于服务器上可用的RAM数量,好的设置规则如下:
堆的最小值(Xms)与堆的最大值(Xmx)设置成相同的。
Elasticsearch的可用堆越大,它能在内存中缓存的数据越多。但是需要注意堆越大在垃圾回收时造成的暂停会越长。
设置Xmx不要大于物理内存的50%。用来确保有足够多的物理内存预留给操作系统缓存。
不要设置Xmx超过JVM用来压缩对象指针的cutoff(compressed oops);精确的cutoff可能不同,但接近于32GB。你可以通过在日志中查找一条类似于下面的这条信息来确定这个cutoff限制。
heap size [1.9gb], compressed ordinary object pointers [true]
最好尽量保持低于zero-based compressed oop的阈值;精确的cutoff可能不同,但大多数系统26GB是安全的,但是在某些系统可能多达30GB。你可以通过JVM的XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode
参数来验证限制,并通过类似如下的行来确定:
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
如果是开启了zero-based compressed oop则
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。
环境变量替换
配置文件中可以使用${...}
符号来引用环境变量的值,例如:
node.name: ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}
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
将非常重要,他规定了必须至少要有多少个master
节点才能形成一个集群。
没有此设置时,一个集群在发生网络问题是可能会分裂成多个集群——脑裂——这将导致数据丢失。更多详细信息请参见:通过minimum_master_nodes避免脑裂
为避免脑裂,你需要根据master
节点数来设置法定人数:
(master_eligible_nodes / 2) + 1
换句话说,如果你有三个master
节点,最小的主节点数因被设置为(3/2)+1
或者是2
discovery.zen.minimum_master_nodes: 2
交互式配置:
对于您不希望保存在配置文件中的设置,您可以使用${prompt.text}
或${prompt.secret}
这样的值并在控制台启动Elasticsearch。${prompt.secret}
禁用了打印,所以输入的值不会在终端显示; ${prompt.text}
将允许您在键入时看到值。例如:
node:
name: ${prompt.text}
当启动Elasticsearch时,将提示您进行输入,如下所示:
Enter value for [node.name]:
注意
如果在配置文件中使用
${prompt.text}
或${prompt.secret}
,Elasticsearch将不能作为服务进程运行或者是在后台运行。
日志配置
Elasticsearch使用Log4j2进行日志记录。 Log4j2可以通过log4j2.properties文件进行配置。Elasticsearch公开了三个属性:${sys:es.logs.base_path}
、${sys:es.logs.cluster_name}
、${sys:es.logs.node_name}
(如果节点名字通过node.name
明确配置过),这三个属性可以在配置文件中引用,以确定日志文件的存放路径; ${sys:es.logs.base_path}
被解析为日志目录,${sys:es.logs.cluster_name}
被解析为集群名称(默认用作日志文件名的前缀),${sys:es.logs.node_name}
被解析为节点名字(如果节点名字明确配置过)。
例如,如果您的日志目录(path.logs
)是/var/log/elasticsearch
,并且您的集群名为production
,那么${sys:es.logs}
将解析为/var/log/elasticsearch/production
,${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log
将被解析为/var/log/elasticsearch/production.log
。
解释
appender.rolling.type = RollingFile #①
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs}.log #②
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %.10000m%n
appender.rolling.filePattern = ${sys:es.logs}-%d{yyyy-MM-dd}.log #③
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy #④
appender.rolling.policies.time.interval = 1 #⑤
appender.rolling.policies.time.modulate = true #⑥
① 配置记录器为RollingFile
② 记录到/var/log/elasticsearch/production.log
③ 滚动记录日志记录到/var/log/elasticsearch/production-yyyy-MM-dd.log
④ 使用基于时间的滚动策略
⑤ 每日滚动日志
⑥ 在日边界对齐卷(而不是每二十四小时滚动一次)
如果将.gz
或.zip
附加到appender.rolling.filePattern
,那么日志将在滚动时压缩。
如果你想保留指定时间段的日志,可以使用一个带有删除动作的滚动策略。
解释
appender.rolling.strategy.type = DefaultRolloverStrategy #①
appender.rolling.strategy.action.type = Delete #②
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path} #③
appender.rolling.strategy.action.condition.type = IfLastModified #④
appender.rolling.strategy.action.condition.age = 7D #⑤
appender.rolling.strategy.action.PathConditions.type = IfFileName #⑥
appender.rolling.strategy.action.PathConditions.glob = ${sys:es.logs.cluster_name}-* #⑦
① 配置滚定处理器DefaultRolloverStrategy
② 为滚动滚定处理器配置删除动作
③ 日志文件目录
④ 指定滚定的条件
⑤ 保留日志的时间
⑥ 根据文件名匹配,仅删除超过7天的文件
⑦ 根据${sys:es.logs.cluster_name}-*
格式去匹配删除文件; 它仅仅只删除Elasticsearch的日志,不会删除deprecation
与slow
的日志。
可以加载多个配置文件(在这种情况下,它们将被合并),只要它们命名为log4j2.properties
并将Elasticsearch config目录作为父目录; 这对于暴露其他日志记录器的插件很有用。 日志部分包含java包及其对应的日志级别。 记录器部分包含日志的目标。 有关如何自定义日志记录和所有支持的追加器的详细信息可以在Log4j文档中找到。
Deprecation(过期)日志
除了常规日志记录之外,Elasticsearch还允许您启用日志来记录一些过期的操作。 例如,这允许您在早期就确定您将需要在未来迁移哪些功能。 默认情况下,过期日志会开启并以WRAN级别记录,此级别会记录所有过期操作的日志。
logger.deprecation.level = warn
它将在日志目录中创建每日滚动的deprecation日志文件。 定期检查此文件,特别是当您打算升级到新的主版本。
默认的日志配置已为弃用日志设置了滚动策略,将在1GB之后滚动和压缩,并且最多保留五个日志文件(四个已滚动的日志和一个正在记录的日志)。
您可以通过在config/log4j2.properties
文件中设置deprecation日志级别设置为error
来禁用它。
安全配置
有一些设置是敏感的,通过文件系统的权限来保护是不足够的。基于这种场景,elasticsearch提供了一个keystore,可以通过密码保护。elasticsearch-keystore
就是用来管理与设置keystore的工具。
注意
所有的指令都必须使用运行elasticsearch的用户来执行。
创建keystore
使用create
指令来创建elasticsearch.keystore
:
bin/elasticsearch-keystore create
elasticsearch.keystore
文件将被创建在elasticsearch.yml
文件的旁边。
列出keystore的配置
使用list
指令来列出elasticsearch.keystore
的设置:
bin/elasticsearch-keystore list
添加一个String设置
一些敏感的字符串,像云平台插件的一个认真参数,可以通过add
指令来添加:
bin/elasticsearch-keystore add the.setting.name.to.set
工具将提示这个值得设置。如果要通过控制台展示,使用--stdin
参数:
cat /file/containing/setting/value | bin/elasticsearch-keystore add --stdin the.setting.name.to.set
删除设置
使用remove
指令来从keystore
中删除配置:
bin/elasticsearch-keystore remove the.setting.name.to.remove