Elasticsearch学习笔记(5)
目录
配置Elasticsearch
Elasticsearch具有良好的默认设置,并且只需要很少的配置。一个运行中的集群的大部分配置可以使用cluster update settingAPI改变。
配置文件应该包含特定于节点的设置(例如node.name和paths),或者节点为了能够加入集群而需要的设置,例如cluster.name和network.host。
配置文件位置
Elasticsearch有三个配置文件:
- elasticsearch.yml - 配置elasticsearch
- jvm.options - elasticsearch jvm 设置
- log4j2.properties - 配置Elasticsearch日志
这些文件位于config目录中,其默认位置取决于安装是否来自归档发行版(tar.gz或zip)或包发行版(Debian或RPM包)。
对于归档发行版,配置目录的位置默认为$ES_HOME/config。配置目录的位置可以通过ES_PATH_CONF环境变量更改,如下所示:
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch
或者,您可以通过命令行export ES_PATH_CONF环境变量或编辑您的shell profile。
对于包发行版,配置目录的位置默认为/etc/elasticsearch。还可以通过ES_PATH_CONF环境变量来更改配置目录的位置,但是请注意,在shell中设置这个变量是不够的。相反,这个变量来自/etc/default/elasticsearch(用于Debian包)和/etc/sysconfig/elasticsearch(用于RPM包)。您需要在其中一个文件中编辑ES_PATH_CONF=/etc/elasticsearch条目,从而更改配置目录的位置。
配置文件格式
配置格式是YAML。下面是一个改变数据和日志目录路径的例子:
path:
data: /var/lib/elasticsearch
logs: /var/log/elasticsearch
设置也可以平展如下:
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
环境变量替换:
用${...}引用环境变量,配置文件中的符号将被替换为环境变量的值,例如:
node.name: ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}
提示设置
注意:不建议提示设置。请对敏感的属性值使用安全设置。并非所有设置都可以转换为使用安全设置。
对于不希望存储在配置文件中的设置,可以使用值${prompt.text}
和${prompt.secret}
,并且在前台开启Elasticsearch。${prompt.secret}
已禁用回显,因此输入的值不会显示在终端中;${prompt.text}
将允许您在输入值时查看该值。例如:
node:
name: ${prompt.text}
启动Elasticsearch时,系统会提示您输入实际值,如下所示:
Enter value for [node.name]:
注意:如果在设置中使用
${prompt.text}
或者${prompt.secret}
,进程作为服务或在后台运行,ELasticsearch将不会启动。
配置JVM选项
您应该很少需要更改Java虚拟机(JVM)选项。如果需要这样做,最可能的更改是设置堆大小。本文的其余部分将详细解释如何设置JVM选项。
设置JVM选项(包括系统属性和JVM标志)的首选方法是通过编辑jvm.options配置文件。这个文件的默认位置是config/jvm.options(从tar或zip发行版安装时)和/etc/elasticsearch/jvm.options(从Debian或RPM包安装时)。
这个文件包含一个行分隔的JVM参数列表,它遵循一种特殊的语法:
- 只包含空白的行被忽略
- 以#开头的行被视为注释并被忽略
- 以-开头的行被视为独立于JVM版本应用的JVM选项:
-Xmx2g
- 以数字开头、后跟一个
:
和一个-
的行被视为JVM选项,只有在JVM版本与数字匹配时才适用:
8:-Xmx2g
- 以数字开头、后跟一个
-
和一个:
的行被视为JVM选项,仅当JVM版本大于或等于该数字时才适用:
8-:-Xmx2g
- 以数字开头、后跟一个
-
,后跟一个数字,后跟一个:
的行被视为JVM选项,仅当JVM版本位于这两个数字的范围内时才适用:
8-9:-Xmx2g
- 所有其他行都被拒绝
您可以向该文件添加自定义JVM标志,并将此配置签入版本控制系统。
设置Java虚拟机选项的另一种机制是通过编辑ES_JAVA_OPTS环境变量。例如:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch
在使用RPM或Debian包时,可以在系统配置文件中指定ES_JAVA_OPTS。
JVM有一个用于观察JAVA_TOOL_OPTIONS环境变量的内置机制。我们在打包脚本中故意忽略了这个环境变量。这样做的主要原因是,在一些操作系统(例如Ubuntu)上,通过这个环境变量默认安装了一些代理,我们不希望它们干扰Elasticsearch。
另外,一些其他Java程序支持JAVA_OPTS环境变量。这不是JVM中内置的机制,而是生态系统中的约定。但是,我们不支持这个环境变量,而是支持JVM设置通过编辑jvm.options文件或环境变量ES_JAVA_OPTS如上所述。
安全配置
有些设置是敏感的,依赖文件系统权限来保护它们的值是不够的。对于这个用例,Elasticsearch提供了一个密钥存储库和一个Elasticsearch -keystore工具来管理密钥存储库中的设置。
注意:这里的所有命令都应该使用运行Elasticsearch的用户来执行。
注意:只有一些设置被设计为从密钥库读取。请参阅每个设置的文档,查看是否支持将其作为密钥存储库的一部分。
注意:所有对密钥库的修改只有在重新启动Elasticsearch之后才生效。
注意:elasticsearch密钥库目前只提供混淆。未来将增加密码保护。
这些设置,就像在elasticsearch.yml配置文件件的常规设置一样,需要在集群中的每个节点上指定。目前,所有安全设置都是特定于节点的设置,必须在每个节点上具有相同的值。
创建密钥存储库
使用create命令来创建elasticsearch.keystore:
bin/elasticsearch-keystore create
文件elasticsearch.keystore将创建于elasticsearch.yml的目录位置。
列出密钥存储库中的设置
可以通过list命令获得密钥存储库中的设置列表:
bin/elasticsearch-keystore list
添加字符串设置
可以使用add命令添加敏感的字符串设置,比如云插件的身份验证凭据:
bin/elasticsearch-keystore add the.setting.name.to.set
该工具将提示设置的值。要通过stdin传递该值,请使用--stdin标志:
cat /file/containing/setting/value | bin/elasticsearch-keystore add --stdin the.setting.name.to.set
删除设置
要从密钥库中删除设置,请使用remove命令:
bin/elasticsearch-keystore remove the.setting.name.to.remove
可重载安全配置
就像elasticsearch.yml中的设置值一样。对keystore内容的更改不会自动应用到正在运行的elasticsearch节点。重新读取设置需要重新启动节点。但是,某些安全设置被标记为可重载。这些设置可以重新读取并应用于运行中的节点。
所有安全设置的值,无论是否可重载,在所有集群节点上必须是相同的。在进行所需的安全设置更改后,使用bin/elasticsearch-keystore add命令,调用:
curl -X POST "localhost:9200/_nodes/reload_secure_settings"
这个API将在每个集群节点上解密和重新读取整个密钥库,但是只应用可重新加载的安全设置。对其他设置的更改要到下一次重新启动时才生效。一旦调用返回,重载就完成了,这意味着依赖于这些设置的所有内部数据结构都已更改。所有设置看起来都应该从一开始就具有新值。
在更改多个可重新加载的安全设置时,在每个集群节点上修改所有设置,然后发出reload_secure_settings调用,而不是在每次修改之后重新加载。
日志配置
Elasticsearch使用Log4j 2进行日志记录。可以使用log4j2配置Log4j2.properties文件。elasticsearch公开了三个特性,${sys:es.logs.base_path}
,${sys:es.logs.cluster_name}
,and ${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.base_path}
将解析到/var/log/elasticsearch,而${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log
将解析为 /var/log/elasticsearch/production.log。
appender.rolling.type = RollingFile #1
appender.rolling.type = RollingFile
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log #2
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %.-10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz #3
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy #4
appender.rolling.policies.time.interval = 1 #5
appender.rolling.policies.time.modulate = true #6
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy #7
appender.rolling.policies.size.size = 256MB #8
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.fileIndex = nomax
appender.rolling.strategy.action.type = Delete #9
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName #10
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* #11
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize #12
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB #13
#1
配置输出源RollingFile
#2
输出日志到/var/log/elasticsearch/production.log
#3
滚动日志到 /var/log/elasticsearch/production-yyyy-MM-dd-i.log,日志将被压缩到每一卷且i将自增。
#4
使用基于时间的滚动策略
#5
每天滚动日志
#6
对齐滚动在白天边界(而不是每24小时滚动一次)
#7
使用基于大小的滚动策略
#8
在256mb之后滚动日志
#9
滚动日志时使用delete操作
#10
只删除与文件模式匹配的日志
#11
模式是只删除主日志
#12
只有当我们积累了太多压缩日志时才删除
#13
压缩日志的大小条件是2gb
Log4j的配置解析被任何无关的空格弄糊涂了;如果您复制并粘贴此页上的任何Log4j设置,或者输入任何Log4j配置,请确保修剪任何开头和结尾的空格。
注意,在appender.rolling中,您可以将.gz替换为.zip,使用zip格式压缩卷过的日志。如果删除.gz扩展名,则在滚动日志时不会压缩它们。
如果希望在指定的一段时间内保留日志文件,可以使用带有删除操作的滚动策略。
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 = IfFileName
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-*
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
appender.rolling.strategy.action.condition.nested_condition.age = 7D
配置DefaultRolloverStrategy;
配置用于处理滚动的Delete操作;
Elasticsearch日志的基本路径;
处理滚动时应用的条件;
从与${sys: .log .cluster_name}-*匹配的基本路径中删除文件;这是滚动日志文件的glob;这只需要删除滚动的Elasticsearch日志,而不需要删除弃用和慢速日志;
用于匹配glob的文件的嵌套条件;
保留日志7天。
只要命名为log4j2.properties,就可以加载多个配置文件(在这种情况下它们将被合并),并将Elasticsearch配置目录作为祖先目录。这对于暴露其他日志记录器的插件非常有用。logger部分包含java包及其对应的日志级别。appender部分包含日志的目的地。有关如何自定义日志记录和所有受支持的附加程序的详细信息可以在Log4j文档中找到。
配置日志等级
有四种配置日志级别的方法,每种方法都有适合使用它们的情况。
1.通过命令行:-E <name of logging hierarchy>=<level>(例如, -E logger.org.elasticsearch.transport=trace)。当您在单个节点上临时调试问题(例如,启动问题或开发过程中的问题)时,这是最合适的。
2.通过elasticsearch.yml:<name of logging hierarchy>: <level>(例如,logger.org.elasticsearch.transport: trace). 当您暂时调试一个问题,但没有通过命令行(例如,通过服务)启动Elasticsearch,或者您希望在更持久的基础上调整日志级别时,这是最合适的。
3.通过cluster settings:
PUT /_cluster/settings
{
"transient": {
"<name of logging hierarchy>": "<level>"
}
}
例如:
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"transient": {
"logger.org.elasticsearch.transport": "trace"
}
}
'
当您需要动态地调整活动运行的集群上的日志记录级别时,这是最合适的。
4.通过log4j2.properties:
logger.<unique_identifier>.name = <name of logging hierarchy>
logger.<unique_identifier>.level = <level>
例如:
logger.transport.name = org.elasticsearch.transport
logger.transport.level = trace
当您需要对日志记录器进行细粒度控制时(例如,您希望将日志记录器发送到另一个文件,或者以不同的方式管理日志记录器;这是一个罕见的用例)。
弃用日志记录
除了常规的日志记录,Elasticsearch还允许您启用已弃用操作的日志记录。例如,如果将来需要迁移某些功能,这允许您尽早确定。默认情况下,弃用日志记录在WARN级别启用,在该级别将发出所有弃用日志消息。
logger.deprecation.level = warn
这将在日志目录中创建一个每日滚动弃用日志文件。经常检查这个文件,特别是当你打算升级到一个新的主版本时。
默认的日志配置将弃用日志的滚策略设置为在1 GB之后滚和压缩,并保留最多5个日志文件(4个滚日志和活动日志)。
您可以在config/log4j2.properties文件中禁用它,方法是将弃用日志级别设置为error。
重要的ELasticsearch配置
虽然Elasticsearch只需要很少的配置,但是在投入生产之前需要考虑很多设置。
在投入生产之前,必须考虑以下设置:
- 路径设置
- 集群名称
- 节点名称
- 网络主机
- 自我发现设置
- 堆栈大小
- 堆转储路径
- GC日志记录
- 临时目录
path.data 和 path.logs
如果你使用的是.zip或者.tar.gz归档发行版,那么data 和 logs目录就是$ES_HOME的子目录文件夹。如果这些重要的文件夹被保留在它们的默认位置,在将Elasticsearch升级到新版本时,它们被删除的风险很高。
在生产环境使用,您几乎肯定希望更改data和log文件夹的位置:
path:
logs: /var/log/elasticsearch
data: /var/data/elasticsearch
RPM和Debian发行版已经为data和logs使用了自定义路径。
path.data可以被设置为多个路径,在这种情况下,所有路径都将用于存储数据(尽管属于单个碎片的文件都将存储在相同的数据路径上):
path:
data:
- /mnt/elasticsearch_1
- /mnt/elasticsearch_2
- /mnt/elasticsearch_3
集群名称
节点只有在与集群中的所有其他节点共享cluster.name时才能加入集群。默认名称是elasticsearch,但是您应该将其更改为描述集群用途的适当名称。
cluster.name: logging-prod
请确保不要在不同的环境中重用相同的集群名称,否则可能会导致节点加入错误的集群。
节点名称
默认情况下,Elasticsearch将使用随机生成的UUID的前7个字符作为节点id。请注意,节点id是持久化的,在节点重新启动时不会更改,因此默认节点名也不会更改。
配置一个更有意义的名称是值得的,它还具有在重新启动节点后持久化的优点:
node.name: prod-data-2
还可以将node.name设置为服务器的主机名,如下所示:
node.name: ${HOSTNAME}
网络主机
默认情况下,Elasticsearch只绑定到环回地址——例如127.0.0.1和[::1]。这足以在服务器上运行单个开发节点。
事实上,在一个单节点上从相同$ES_HOME位置可以启动多个节点。这个对于测试Elasticsearch的集群能力很有效,但是对于生产环境来讲这不是一个推荐的配置。
为了和其他服务器上的多个节点组成一个集群,你的节点需要绑定到一个不回环的地址上。尽管这里有很多network settings,通常你只需要配置network.host:
network.host: 192.168.1.10
network.host设置还可以理解一些特殊的值,例如local,site, global以及修饰符像:ip4和:ip6,详情请参阅Special values for network.host。
重要:一旦你提供了一个自定义的network.host设置, Elasticsearch假设你正从开发模式迁移到生产模式,并将许多系统启动检查从警告升级到异常。更多信息查看Development mode vs production mode。
探索设置
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
1.如果不指定端口,将默认为transport.profiles.default.port和回退到transport.tcp.port
2.一个解析到多个IP地址的主机名,将尝试所有解析的地址
discovery.zen.minimum_master_nodes
为了防止数据丢失,配置discovery.zen.minimum_master_nodes至关重要,以便每个符合主机资格的节点都知道为了形成集群,符合主机资格的节点的最小数量必须可见的。
如果没有这个设置,遭受网络故障的集群就有可能被分成两个独立的集群——分裂的大脑——这将导致数据丢失。在使用minimum_master_nodesedit避免大脑分裂方面提供了更详细的解释。
为了避免大脑分裂,应该将此设置设置为符合主控条件的节点的仲裁:
(master_eligible_nodes / 2) + 1
也就是说,如果有3个符合主机资格的节点,那么最小master节点应该设置为(3 / 2)+ 1或2:
discovery.zen.minimum_master_nodes: 2
设置堆大小
默认情况下,Elasticsearch告诉JVM使用最小和最大大小为1 GB的堆。在转移到生产环境时,重要的是配置堆大小,以确保Elasticsearch有足够的可用堆。
Elasticsearch将通过Xms(最小堆大小)和Xmx(最大堆大小)设置分配在jvm.options文件中指定的整个堆。
这些设置的值取决于服务器上可用RAM的数量。好的经验法则是:
- 设置最小堆大小(Xms)和最大堆大小(Xmx)彼此相等。
- 用于Elasticsearch的堆越多,用于缓存的内存就越多。但是请注意,过多的堆会导致长时间的垃圾收集暂停。
- 将Xmx设置为不超过物理RAM的50%,以确保为内核文件系统缓存留有足够的物理RAM。
- 不要将Xmx设置在JVM用于压缩对象指针的截止值之上(压缩的oops);具体的截止值各不相同,但接近32GB。您可以通过在日志中查找如下所示的行来验证是否超出了限制:
heap size [1.9gb], compressed ordinary object pointers [true]
- 更好的是,尽量保持在基于零压缩的阈值以下;具体的截止值各不相同,但是在大多数系统上26GB是安全的,但在某些系统上可能高达30GB。您可以通过使用JVM选项启动Elasticsearch来验证您是否受到了限制 -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode,寻找这样的一行:
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
显示启用了从零开始的压缩oops而不是:
eap 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
- 设置最小和最大堆大小为4000 MB
注意:为Windows服务配置堆与上述配置不同。Windows服务最初填充的值可以如上配置,但在安装服务之后会有所不同。有关更多细节,请参阅Windows服务文档。
JVM堆转储路径
默认情况下,Elasticsearch配置JVM将堆从内存溢出异常转储到默认数据目录(/var/lib/elasticsearch是针对RPM和Debian包发行版的,Elasticsearch安装根目录下的data目录是针对tar和zip存档发行版的)如果此路径不适合接收堆转储,则应修改条目-XX:HeapDumpPath=…在jvm.options文件中。如果指定目录,JVM将根据运行实例的PID为堆转储生成一个文件名。如果指定的是固定文件名而不是目录,那么当JVM需要对内存溢出异常执行堆转储时,文件必须不存在,否则堆转储将失败。
GC日志记录
默认情况下,Elasticsearch启用GC日志。这些都是在jvm.options中配置的和默认设置到与Elasticsearch日志相同的默认位置。默认配置每64 MB旋转日志一次,最多可以消耗2 GB的磁盘空间。
临时目录
默认情况下,Elasticsearch使用启动脚本立即在系统临时目录下创建的私有临时目录。
在一些Linux发行版上,如果最近没有访问/tmp文件和目录,系统实用程序将从它们中清除这些文件和目录。如果长时间不使用需要临时目录的特性,这可能导致在运行Elasticsearch时删除私有临时目录。如果随后使用了需要临时目录的特性,则会导致问题。
如果使用.deb或.rpm包安装Elasticsearch并在systemd下运行它,那么Elasticsearch使用的私有临时目录将被排除在定期清理之外。
但是,如果您打算在Linux上运行.tar.gz发行版一段时间,您应该考虑为Elasticsearch创建一个专用的临时目录,该目录不在将旧文件和目录从其中清除的路径下。这个目录应该设置权限,这样只有运行Elasticsearch的用户才能访问它。然后在开始Elasticsearch之前设置$ES_TMPDIR环境变量指向它。
JVM致命错误日志
默认情况下,Elasticsearch配置JVM将致命错误日志写入默认日志目录(/var/log/elasticsearch是RPM和Debian包发行版的,Elasticsearch安装根目录下的logs目录是针对tar和zip存档发行版的)。这些日志是JVM遇到致命错误(例如,分割错误)时生成的。如果这个路径不适合接收日志,您应该在jvm.options文件中修改条目-XX:ErrorFile=…为一个替代路径。