作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
Elasticsearch配置
1、配置文件的位置
Elasticsearch 有三个配置文件:
elasticsearch.ym
l: Elasticsearch 配置文件jvm.options
: Elasticsearch JVM 配置文件log4j2.properties
: Elasticsearch 日志配置文件
这些配置文件位于配置目录,这个目录的默认位置取决于安装来源是 归档的发行版(tar.gz 或 zip) 还是 安装包的发行版(Debian or RPM packages)。
对于 归档的发行版,配置目录默认位于 $ES_HOME/config
。 配置目录可以通过环境变量 ES_PATH_CONF 来修改,比如:
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch
对于 安装包的发行版,配置目录默认位于 /etc/elasticsearch
。
2、JVM配置
可以使用 jvm.options 文件 或 环境变量 ES_JAVA_OPTS 来设置选项。自定义的 JVM 选项文件可以添加到 config/jvm.options.d/
。
应该永远也不需要修改 jvm.options 根文件,而应该使用自定义的 JVM 选项文件。 自定义 JVM 选项的处理顺序是按字母顺序排列。
JVM 选项文件必须有后缀.options,并包含一个按特殊语法以行分隔的 JVM 参数列表:
- 仅包含空白的行会被忽略
- 以#开头的行被视为注释并被忽略
# JVM heap size
-Xms4g
-Xmx4g
# GC configuration
# jdk8-13采用cms
8-13:-XX:+UseConcMarkSweepGC
8-13:-XX:CMSInitiatingOccupancyFraction=75
8-13:-XX:+UseCMSInitiatingOccupancyOnly
# jdk14以上使用 G1
14-:-XX:+UseG1GC
# JVM temporary directory
-Djava.io.tmpdir=${ES_TMPDIR}
# heap dumps
-XX:+HeapDumpOnOutOfMemoryError
9-:-XX:+ExitOnOutOfMemoryError
-XX:HeapDumpPath=data
-XX:ErrorFile=logs/hs_err_pid%p.log
# JDK 8 GC logging
8:-XX:+PrintGCDetails
8:-XX:+PrintGCDateStamps
8:-XX:+PrintTenuringDistribution
8:-XX:+PrintGCApplicationStoppedTime
8:-Xloggc:logs/gc.log
8:-XX:+UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m
# JDK 9+ GC logging
9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
3、日志配置
Elasticsearch 使用 Log4j 2 进行日志记录。 Log4j 2 可以使用 log4j2.properties 文件进行配置。 Elasticsearch公开了三个属性,${sys:es.logs.base_path}
、${sys:es.logs.cluster_name}
以及 ${sys:es.logs.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
4、服务配置
4.1、重要配置
path:
data: /var/data/elasticsearch #数据路径
logs: /var/log/elasticsearch #日志路径
cluster.name: logging-prod #集群名称
node.name: prod-data-2 #节点名称
network.host: 192.168.1.10 #环回地址,单节点配置为本机地址,集群环境配置成0.0.0.0
discovery.seed_hosts: #集群中其他节点
- 192.168.1.10:9300 #可配置ip:prot
- 192.168.1.11 #端口是可选的,默认为9300
- seeds.mydomain.com #可配置域名,如果主机名解析为多个IP地址,则节点将尝试在所有解析地址上发现其他节点
- [0:0:0:0:0:ffff:c0a8:10c]:9301 #IPv6地址必须用方括号括起来
cluster.initial_master_nodes: #参与选举为主节点的节点列表
- master-node-a
- master-node-b
- master-node-c
4.2、审计安全配置
您可以使用审核日志记录来记录与安全相关的事件,例如身份验证失败、拒绝连接和数据访问事件。此外,还记录通过API对安全配置的更改,例如创建、更新和删除本机和内置用户、角色、角色映射和API密钥
#(静态)是否启用审计,默认为false。
xpack.security.audit.enabled
#(动态)指定要在审核输出中打印的事件的类型。_all可用于彻底审核所有事件,但通常不鼓励这样做,因为它会变得非常冗长。默认列表值包含:access_denied, access_granted, anonymous_access_denied, authentication_failed,connection_denied, tampered_request, run_as_denied, run_as_granted,security_config_change。
xpack.security.audit.logfile.events.include
#(动态)从包含列表中排除指定类型的事件。
xpack.security.audit.logfile.events.exclude
#(动态)是否将来自REST请求的完整请求正文作为某种审核事件的属性包含在内,此设置可用于审核搜索查询,默认为false。
xpack.security.audit.logfile.events.emit_request_body
#(动态)指定是否将节点名称作为字段包含在每个审核事件中。默认值为false。
xpack.security.audit.logfile.emit_node_name
#(动态)指定是否将节点的IP地址作为字段包含在每个审核事件中。默认值为false。
xpack.security.audit.logfile.emit_node_host_address
#(动态)指定是否将节点的主机名作为字段包含在每个审核事件中。默认值为false。
xpack.security.audit.logfile.emit_node_host_name
#(动态)指定是否将节点id作为字段包含在每个审核事件中。与节点名不同,如果管理员更改配置文件中的设置,节点名的值可能会更改,节点id将在群集重新启动期间保持不变,管理员无法更改它。默认值为true。
xpack.security.audit.logfile.emit_node_id
#(动态)用户名或通配符的列表。指定的策略不会为匹配这些值的用户打印审核事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.users
#(动态)身份验证领域名称或通配符的列表。指定的策略不会为这些域中的用户打印审核事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.realms
#(动态)操作名称或通配符的列表。可以在审核事件的操作字段中找到操作名称。指定的策略不会打印与这些值匹配的操作的审核事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.actions
#(动态)角色名称或通配符的列表。指定的策略不会为具有这些角色的用户打印审核事件。如果用户有多个角色,其中一些角色未包含在策略中,则策略将不包含此事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.roles
#(动态)索引名称或通配符的列表。当事件中的所有索引都与这些值匹配时,指定的策略将不会打印审核事件。如果该事件涉及多个指数,其中一些指数不在保单范围内,保单将不涵盖该事件。
xpack.security.audit.logfile.events.ignore_filters.<policy_name>.indices
4.3、断路器设置
Elasticsearch包含多个断路器,用于防止操作导致OutOfMemoryError。每个断路器都指定了它可以使用多少内存的限制。此外,还有一个父级断路器,它指定可以跨所有断路器使用的内存总量。
#(静态)确定父断路器是应考虑实际内存使用情况(true)还是仅考虑子断路器保留的内存量(false)。默认为true。
indices.breaker.total.use_real_memory
#(动态)父断路器启动限制。如果indices.breaker.total.use_real_memory设置为false,则默认值为JVM堆内存的70%,如果indices.breaker.total.use_real_memory设置为true,则默认值为JVM堆内存的95%。
indices.breaker.total.limit
#(动态)fielddata断路器的限制。默认为JVM堆内存的40%。
indices.breaker.fielddata.limit
#(动态)与所有字段数据估计值相乘以确定最终估计值的常数。默认为1.03。
indices.breaker.fielddata.overhead
#(动态)请求断路器的限制,默认为JVM堆内存的60%。
indices.breaker.request.limit
#(动态)所有请求估计值都将与该常数相乘以确定最终估计值。默认为1。
indices.breaker.request.overhead
#(动态)运行中请求断路器的限制,默认为JVM堆的100%。这意味着它受到为主断路器配置的限制的约束。
network.breaker.inflight_requests.limit
#(动态)一个常数,所有进行中请求估计值都将与该常数相乘以确定最终估计值。默认为2。
network.breaker.inflight_requests.overhead
#(动态)记帐断路器的限制,默认为JVM堆的100%。这意味着它受到为主断路器配置的限制的约束。
indices.breaker.accounting.limit
#(动态)与所有计费估计值相乘以确定最终估计值的常数。默认为1。
indices.breaker.accounting.overhead
#(动态)限制在特定间隔内允许编译的唯一动态脚本的数量。默认为150/5m,即每5分钟150次。
script.max_compilations_rate
#(静态)在脚本中启用regex,默认值为limited。编写不好的正则表达式会降低集群的稳定性和性能。
script.painless.regex.enabled
#(静态)限制脚本中正则表达式可以考虑的字符数。Elasticsearch通过将设置值乘以脚本输入的字符长度来计算此限制。
script.painless.regex.limit-factor
4.4、分片分配和路由配置
碎片分配是将碎片分配给节点的过程。这可能发生在初始恢复、副本分配、重新平衡期间,或者在添加或删除节点时。主服务器的主要角色之一是决定将哪些碎片分配给哪些节点,以及何时在节点之间移动碎片以重新平衡集群。
#(动态)设置来控制碎片分配和恢复。重新启动节点时,此设置不会影响本地主碎片的恢复。具有未分配主碎片副本的重新启动节点将立即恢复该主碎片,前提是其分配id与集群状态中的活动分配id之一匹配。
#all-(默认)允许为所有类型的碎片分配碎片。
#primaries-仅允许为主碎片分配碎片。
#new_primaries-仅允许为新索引的主碎片分配碎片。
#none-任何索引都不允许任何类型的碎片分配。
cluster.routing.allocation.enable
#(动态)一个节点上允许进行多少并发传入碎片恢复。传入恢复是在节点上分配目标碎片(很可能是副本,除非碎片正在重新定位)的恢复。默认为2。
cluster.routing.allocation.node_concurrent_incoming_recoveries
#(动态)一个节点上允许进行多少并发传出碎片恢复。传出恢复是在节点上分配源碎片(除非碎片正在重新定位