Elasticsearch 部署笔记


# 实时分布式搜索、分析引擎,用于全文搜索、结构化搜索、分析,建立在全文搜索引擎 Apache Lucene 之上
# 使用名为倒排索引的数据结构,支持极快的全文搜索。其包含出现在所有文档中的每个唯一词并标识每个词所在的相关文档及其元数据
# 注: 文本字段存在倒排索引中,数值和地理字段存在 BKD 树中 ...

# Elasticsearch 其他基础依赖、插件
    Jdk1.8   # 自 7.0+ 版自带jdk,无需安装
    Nodejs   # 作为head插件的依赖(Chrome应用商店有head插件可直接在浏览器运行)
    Head     # 节点、索引管理及可视化 Restful 接口的 WEB UI
    Kibana   # 搜索、数据可视化、SIEM、APM、ML、开发者工具、集群监控等若干功能...
    x-pack   # 自 7.0+ 版本开始X-pack安全功能部分免费(自 5.X 开始已集成到了Elasticsearch,不再是独立软件)
    ik       # 中文分词插件,该插件需使用maven进行编译打包
    ...

# ----------------------------------------------------------------------------

# Change Log
# https://www.elastic.co/guide/en/elasticsearch/reference/current/es-release-notes.html

# Elasticsearch v7.x 于2019年4月发布,底层基于 Lucene 8.0
# 自该版本开始还需了解的新特性如下
#   废除索引内多Type的支持,目前为了向后兼容,默认类型名为 //_doc (type将在8.X版彻底移除)
#   X-pack 的 Security 免费 
#   ECK - ES Operator on K8s
#   新功能:New Cluster coordination
#   新功能:完整的 High Level REST Client
#   新功能:Script Score Query
#   默认的主分片数从5到1,避免 Over Sharding
#   更快的Top K

Deploy

# When installing the Elastic Stack, must use the same version across the entire stack !
# 其自身带有分布式协调功能,集群节点类型大致可分为:Master、Data、Clien(coord)、Ingest、ML ...
# Elasticsearch 不能使用 root 用户运行,并且在部署前需使用 root 权限修改若干内核参数,如: ulimit
# Elasticsearch 7.2.1 内置了 OpenJDK 12 (位于jdk目录)

# ----------------------------------------------------------------------------

# Elasticsearch 是基于对等的系统,节点间直接互通,高吞吐量 API(索引、搜索、删除)通常不会与 Master 进行交互
# 主节点职责是维护全局群集状态,并在节点加入/离开群集时重分配分片,每次更改集群状态时都会将新状态发布到所有的节点

# 当选主节点会定期检查群集中每个节点以确保它们仍处于连接状态并且运行状态良好
# 同时在群集内的每个节点也会定期检查当选主节点的运行状态,这些检查分别称为: 领导者检查、跟随者检查
# 若 Master 检测到节点断开连接,则将此情况视为立即失败。Master 绕过超时并重试设置值,并尝试从群集中删除该节点
# 同样,若节点检测到主节点断开连接,也将其视为立即失败。该节点将绕过超时和重试设置,并重启其发现阶段以尝试发现或选择新的 Master

Download: www.elastic.co/cn/downloads/

# ---------------------------------------------------------------------------- Deploy

# 投入生产前必须考虑以下设置
#   1.禁用交换
#   2.增加文件描述符
#   3.确保足够的虚拟内存
#   4.确保足够的线程
#   5.JVM DNS cache settings
#   6.挂载的临时目录未设置 noexec 属性
#   7.TCP重传超时

[root@elasticsearch ~]# ulimit -SHn 655350

# 大多数 OS 尝试使用文件系统缓存尽可能多的内存,并频繁换出未使用的应用内存
# 这可能导致JVM堆的一部分甚至其可执行页面换出到磁盘,在Elasticsearch的场景中这种交换对性能、节点稳定性非常不利
# 它可能导致垃圾收集持续数分钟而不是毫秒,并可能导致节点响应缓慢甚至断开群集连接
[root@elasticsearch ~]# swapoff -a
[root@elasticsearch ~]# vim /etc/fstab    # 进行注释
# /dev/mapper/centos-swap swap    swap    defaults     0 0

# 特定用户设置永久的进程资源限制
[root@elasticsearch ~]# cat > /etc/security/limits.conf <<'EOF'
* soft nofile 655350        # 最大打开文件数
* hard nofile 655350        # 左侧星号特指针对某些用户,此处对所有用户生效
* soft nproc 8192           # 用户可开启进程/线程的最大数目
* hard nproc 8192           # 确保Elasticsearch用户可创建的线程数至少为8192
* soft memlock unlimited    # 设置最大的锁定内存地址空间,防止内存锁定失败
* hard memlock unlimited    # memory locking requested for elasticsearch process but memory is not locked
EOF

# 内核参数调整
[root@elasticsearch ~]# cat >> /etc/sysctl.conf <<'EOF'
net.ipv4.tcp_retries2 = 5   # 减少TCP重传的最大次数,五次重传对应于大约6s超时 (官网建议值,Linux默认超时为900s)
fs.file-max = 1024000       # 系统最大打开文件描述符数 (所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max)
vm.max_map_count = 262144   # 进程能拥有的最多的mmap内存区域,操作系统对 mmap 计数的默认限制可能太低,这可能会导致内存不足异常
vm.swappiness = 1           # 为1时可减小内核交换频率且通常不会导致交换,同时仍允许整个系统在紧急情况下执行交换
EOF

[root@elasticsearch ~]# sysctl -w net.ipv4.tcp_retries2=5
[root@elasticsearch ~]# sysctl -w vm.max_map_count=262144
[root@elasticsearch ~]# sysctl -p

[root@elasticsearch ~]# curl -sL https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.xx.x-linux-x86_64.tar.gz | tar -zxf -
# Elasticsearch 7.xx.x 目录结构如下 (主目录的环境变量 $ES_HOME)
    bin :      # 脚本文件,包括启动、认证、SQL、插件等...
    config :   # 主配置文件: elasticsearch.yml、JVM配置: jvm.options、日志配置: log4j2.properties
    JDK :      # 内置的JDK 12.0
    lib :      # 类库,相关jar包
    logs :     # 日志目录
    modules :  # 功能模块,如 X-pack
    plugins :  # 已安装插件,每个插件都将包含在一个子目录中
    repo :     # 共享文件系统存储库位置,可容纳多个位置 (默认未配置)
    data :     # 启动时创建该目录,存储数据(默认)

# Elasticsearch 通过环境变量 ${ES_PATH_CONF} 设置其配置目录所在路径,其默认值为: ${ES_HOME}/config
# export ES_PATH_CONF=${HOME}/elasticsearch-x.x.x/config

# ---------------------------------------------------------------------------------- log4j2.properties
# https://www.elastic.co/guide/en/elasticsearch/reference/current/logging.html

# 使用Log4j2处理日志,配置文件为: log4j2.properties
[root@elasticsearch ~]# vim ~/elasticsearch-x.x.x/config/log4j2.properties
appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.json 
appender.rolling.layout.type = ESJsonLayout                                 # 使用Json布局 
appender.rolling.layout.type_name = server
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.json.gz 
# 默认将日志滚动到 ${ES_HOME}/logs/-yyyy-MM-dd-i.json,日志会压缩并使用i变量进行递增
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy             # 使用基于时间的滚动策略
appender.rolling.policies.time.interval = 1                                 # 每天滚动一次日志
appender.rolling.policies.time.modulate = true                              # 在一天的边界上对齐滚动(而不是每24h滚动一次)
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy             # 使用基于大小的滚动策略
appender.rolling.policies.size.size = 256MB                                 # 256MB 后滚动日志
appender.rolling.strategy.type = DefaultRolloverStrategy                    # 
appender.rolling.strategy.fileIndex = nomax                                 #
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 = IfAccumulatedFileSize    # 仅当累积了太多压缩日志时才删除
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB   # 压缩日志的大小条件为2GB
appender.rolling.strategy.action.condition.nested_condition.age = 7D        # 保留日志七天   

# ---------------------------------------------------------------------------------- jvm.options

[root@elasticsearch ~]# vim ~/elasticsearch-x.x.x/config/jvm.options
# 遇到性能问题时最佳方法是规划更好的数据布局并增加节点
# 可通过环境变量 ES_JAVA_OPTS 修改JVM,从而在某些场景中跳过基于配置文件的设置: export ES_JAVA_OPTS="-Xms30g"
# 官方不建议修改主 jvm.options,改用在 jvm.options.d 中创建以 .options 结尾的文件进行设置
-Xms30g                             # Xmx、Xms 的值不应超过物理内存50% (官方不建议超过30G,建议26G,更大的堆也会导致更长的垃圾收集暂停)
-Xmx30g                             # Elasticsearch 在JVM堆以外的其他非堆空间使用更多内存,因此需留出非堆空间
# ES_HEAP_SIZE=30g                  # 建议物理内存50%且不超过32G,剩余内存由Lucene以非堆内存使用(设置ES_HEAP_SIZE比设置-Xmx、-Xms更好)
-Djava.io.tmpdir=${ES_TMPDIR}       # 建议不要存放在 /tmp 下(默认),因为某些Linux发行版会定时清理此路径,官方建议创建仅ES有权使用的路径
-XX:HeapDumpPath=/elasticsearch-x.x.x/jvm_dumps     # 用于将内存不足相关的堆异常信息转储到特定目录 (默认是数据目录)
-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
# 设置GC信息的存放路径,这里是: $ES_HOME/logs/gc.log

# ---------------------------------------------------------------------------------- elasticsearch.yml

# Tips: 格式为 YAML,可按展平或层级的组织方式进行配置
# https://www.elastic.co/guide/en/elasticsearch/reference/7.13/settings.html#dynamic-cluster-setting
# 配置文件内可调用系统环境变量,变量值必须是简单字符串,若使用逗号分隔的字符串则将解析为列表格式的若干元素,这适用容器场景
[root@elasticsearch ~]# vim ~/elasticsearch-x.x.x/config/elasticsearch.yml
cluster.name: elasticsearch                         # 集群名
node.name: ${HOSTNAME}                              # 节点名 (调用环境变量)

node.roles: [ data, master ]           
# 若未设置 node.roles 则节点将被分配以下角色: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
# master、data、data_content、data_hot、data_warm、data_cold、data_frozen、ingest、ml、remote_cluster_client、transform
# 若设置 node.roles: [] 则将仅充当协调节点,这样的节点需要有足够的内存和 CPU (即:不设置角色即为协调节点)
# 此外还有需明确定义的角色,如: voting_only、...

# Tips
# 定义具有不同性能特征的多层数据节点是有必要的,后期可通过 ILM 根据节点的性能、弹性和数据保存需求,在热、温、冷层自动转换时序数据 ...
#   data_content    处理产品目录等内容的索引和查询负载,数据的价值随着时间的推移保持恒定,因此随时间将其移到具有不同性能特征的层是没意义的
#   data_hot        处理时序数据(日志、指标)的索引负载,并保存最近、最常访问的数据,建议用SSD,作为数据流的新索引会自动分给 data_hot 层
#   data_warm       保存访问频率较低且很少更新的时序数据
#   data_cold       保存不常访问且通常不更新的时序数据,它可以被压缩和缩小
#   data_frozen     保存很少访问且从不更新的时序数据,保存在可搜索的快照中
# ILM 通过可用数据层自动迁移托管的索引,默认此操作会在每个阶段自动注入,可明确指定迁移操作来覆盖此行为,或使用分配操作手动指定
# https://www.elastic.co/guide/en/elasticsearch/reference/current/data-tiers.html
# https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-allocate.html

node.processors: 2                                  # 默认自动检测处理器数量并根据它自动设置线程池相关的设置
# 在某些情况下显式指定处理器数量会很有用,例如同一主机运行多个 Elasticsearch 实例时

node.attr.<key>: n2                                 # Tips: ILM场景、索引分片分配时均会使用 ...
node.attr.size: medium                              # 
# 为节点自定义属性,用于后期筛选,前缀为 node.attr.* (*即自定义键) 。查看各节点的自定义属性: GET _cat/nodeattrs?v
# 例如使用自定义节点属性来指示节点的性能特征,并使用分片分配过滤将特定索引的分片路由到最合适的硬件类型                     
# www.elastic.co/guide/en/elasticsearch/reference/current/shard-allocation-filtering.html

node.tag: elastic                                   # 为节点设置标签信息

network.host: _ens33:ipv4_                          # 与其他节点交互使用的IP,其用于同时设置 network.bind_host、network.publish_host 参数
#                                                   # 以下特殊值可以传递给 network.host :
#                                                       _[networkInterface]_   网络接口,如:_en0_
#                                                       _local_                系统上的任何回送地址,如:127.0.0.1
#                                                       _site_                 系统上的任何本地地址,如:192.168.0.1
#                                                       _global_               系统上的任何全局作用域地址,如:8.8.8.8

network.publish_host: 0.0.0.0                       # 与集群内其他节点交互使用,若不设置会自动判断,值必须是真实IP
# 如果希望将 Elasticsearch 绑定到多个地址,或发布与绑定的地址不同的地址时:
# 设置 network.bind_host 为绑定地址,是节点应绑定到的网络地址,以便侦听传入连接,默认是由 network.host 给出的地址
# 设置 network.publish_host 为暴露此节点的地址,是客户端和其他节点可以用来联系该节点的网络地址 ...

http.port: 9200                                     # 提供 Restful 的端口
# http.cors.allow-methods: ....                     # 允许哪些方法,默认 OPTIONS、HEAD、GET、POST、PUT、DELETE
http.cors.enabled: true                             # 支持跨域访问,如: 从9300端口跳到9200端口的请求
http.cors.allow-origin: "*"                         # 开启跨域访问后的地址限制,*表示无限制,如: /https?:\/\/localhost(:[0-9]+)?/

transport.host: _site_                              # 用于同时设置 transport.bind_host、transport.publish_host 参数
transport.tcp.port: 9300                            # 参与集群事物的端口
transport.tcp.compress: true                        # 是否开启TCP传输压缩,默认关闭
# transport.publish_host                            # 同 HTTP 逻辑
# transport.bind_host                               # 同 HTTP 逻辑

path:
    logs: /data/logs                                # 日志存放路径
    data:                                           # 数据存放路径,建议挂载多个磁盘来充分利用多个磁盘的IO
      - /data/data1                                 # -> disk1 (Tips: Elasticsearch 不会为节点内的多个数据路径平衡分片,建议添加新节点而不是数据路径)
      - /data/data2                                 # -> disk2
    repo:                                           # 快照使用的共享文件系统挂载点路径
      - /mount/nfs1_backups                         #
      - /mount/nfs2_backups                         #

bootstrap.memory_lock: true                         # 锁死物理内存地址,JVM会在开启时锁住堆 (Xms==Xmx) 且防止内存被系统执行swap

# discovery.type: single-node                       # 单节点模式,测试使用,此模式将选举自己成为主节点
# discovery.zen.ping.timeout: 4s                    # 设置Ping其他节点时的超时,网络较慢时调大些
# discovery.zen.minimum_master_nodes: 2             # Master 最小存活数, 值应是有资格成为Master的节点数/2+1,防脑裂(7.X移除)
                                                    # discovery.zen.* 集合构成zen发现协议。单/多播均是发现协议的组成部分(7.X移除)
cluster.fault_detection.leader_check.interval: 4s   # 7.X新增,设置每个节点在选中的主节点的检查之间等待的时间。默认1s
discovery.cluster_formation_warning_timeout: 15s    # 7.X新增,启动后N秒若集群未形成将会记录警告信息: Master not found,默认10s

# Tips:
# Elasticsearch 是种基于点对点的系统,其中节点之间直接通信。高吞吐量 API(索引、删除、搜索)通常不与主节点交互
# 主节点职责是维护全局集群状态,并在节点加入或离开时重分配分片,每次更改集群状态后都会广播到集群中的所有节点
# 选定的主节点定期检查集群中的每个节点,以确保它们仍然连接良好,集群中的每个节点也会定期检查主节点的健康状况
# 这些检查分别称为: 跟随者检查、领导者检查

# https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-settings.html
# https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-bootstrap-cluster.html
# 仅在初始化新集群时需此配置,用于第一次选举 Master,设置若干符合主节点资格的主机名/IP来负责引导集群
# 第一次成功形成集群后可从每个节点的配置中删除该配置,重启集群或向现有集群添加新节点时请勿使用此设置 ...
# Tips: 也可以在启动时指定: ./bin/elasticsearch -Ecluster.initial_master_nodes=master-a,master-b,master-c
cluster.initial_master_nodes:                       # 
    - "master_node1:9300"                           # 候选主节点,开启服务时可被选为主节点
    - "master_node2:9300"                           # 仅首次形成集群时需要
    - "master_node3:9300"                           # 若不使用IP则这里输入的名称字符必须与Master节点的 node.name 相匹配!

# 提供符合主节点资格的列表,以便启动时执行发现(相当于旧版本的 discovery.zen.ping.unicast.hosts )
# 为了加入一个已存在的集群,节点需知道集群中至少其他一些节点的主机名或IP,它们需处于活动状态以便为发现过程提供种子 ...
# 此设置提供了该节点将尝试联系的地址的初始列表。接受IP/主机名。若主机名解析为多个IP则使用每个IP进行发现
discovery.seed_hosts:
    - "master_node1:9300"
    - "master_node2:9300"
    - "master_node3:9300"

xpack.license.self_generated.type: basic
# 许可授权类型,basic 是免费且默认的 (启用基本功能),还有其他收费版本,如: trial
# 若设为 trial 则自行生成的许可证仅允许在 30 天内访问 x-pack 的所有功能

xpack.monitoring.enabled: true                      # 启用 X-Pack 监视 (自 7.8 已弃用!)
xpack.monitoring.collection.enabled: true           # 启用监视数据收集 (默认不收集且忽略 Elasticsearch、Kibana、Beats、Logstash 的所有监控数据)
xpack.monitoring.min_interval_seconds: 5s           # 收集数据样本的频率。默认10s,注意需设置 kibana.yml 中此参数的值相同从而与其同步
xpack.monitoring.history.duration: 90d              # 保留持续时间,超限后将自动删除监视导出器创建的索引。默认7d

# https://www.elastic.co/guide/en/elasticsearch/reference/current/monitoring-settings.html#local-exporter-settings
xpack.monitoring.exporters.my_local:                # 将监控数据导出到本地群集( 其中 my_local 是自定义的导出器名称)
    type: local                                     # 值为 local 时该导出器将数据路由到自身所处群集
    use_ingest: true                                # 官方建议用 Metricbeat 将监视数据收集并发到监视群集,而不是 exporters ...
    index.name.time_format: yyyy.MM.dd              # 每天创建索引

# https://www.elastic.co/guide/en/elasticsearch/reference/current/monitoring-settings.html#http-exporter-settings
# xpack.monitoring.exporters.example:
#   type: http
#   host: ["http://10.1.2.3:9200","10.1.2.6"]
#   auth.username: xxxxxxxx
#   auth.password: xxxxxxxx
#   headers:
#     X-My-Array: [abc, def, xyz]
#     X-My-Header: abc123

# https://www.elastic.co/guide/en/elasticsearch/reference/7.13/notification-settings.html
# xpack.watcher.enabled: false                      # 节点的 Watcher 告警功能
# xpack.sql.enabled: false                          # 禁用节点的 SQL Access

# 启用 X-pack 的安全功能
xpack.security.enabled: true                                            # 7.x 版后 X-pack 的安全功能免费
xpack.security.http.ssl.enabled: false                                  # 启用或禁用 Restful 的 TLS/SSL
# xpack.security.http.ssl.client_authentication: none                   # S端从C端处理连接请求时对证书的行为: required(强制C端出示证书)、optional、none(默认)
# xpack.security.http.ssl.key                                           # 包含私钥的 PEM 编码文件的路径
# xpack.security.http.ssl.certificate                                   # 指定与密钥关联的 PEM 编码证书(或证书链)的路径
# xpack.security.http.ssl.certificate_authorities                       # 应信任的 PEM 编码证书文件的路径列表
# xpack.security.http.ssl.key_passphrase                                # 用于解密私钥的密码。由于密钥可能未加密,因此该值是可选的
# xpack.security.http.ssl.secure_key_passphrase                         # 用于解密私钥的密码。由于密钥可能未加密,因此该值是可选的

xpack.security.transport.ssl.enabled: true                              # 启用传输层安全通信功能
xpack.security.transport.ssl.verification_mode: certificate             #
# 证书的认证模式,建议 certificate(验证是否权威CA签名但不验主机名)、若用 full 模式则还验证对端IP、主机名、CA签名等 ...
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12    # 含私钥和证书的 Java Keystore 路径
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12  # 含信任的证书的 Java Keystore 路径
xpack.security.transport.ssl.client_authentication: none                # 类似于 xpack.security.http.ssl.client_authentication

# xpack.security.transport.filter.enabled: true                 # 开启 IP Filtering
# xpack.security.transport.filter.allow: "192.168.0.0/24"       # 允许或拒绝的 transport 地址列表
# xpack.security.transport.filter.deny: _all                    # 
# xpack.security.http.filter.allow: ......                      # 允许或拒绝的HTTP接口的地址列表
# xpack.security.http.filter.deny: ......                       # 

# 审计相关 (若启用,需所有节点配置一致)
xpack.security.audit.enabled: false                             # 是否启用审计日志,默认:$ES_HOME/logs/_audit.json
xpack.security.audit.logfile.emit_node_name: true               # 是否将节点名称作为字段包含在每个审计事件中
xpack.security.audit.logfile.emit_node_host_address: true       # 是否在每个审核事件中将节点IP作为字段包括在内
xpack.security.audit.logfile.events.emit_request_body: true     # 是否包含来自 REST 请求的完整请求正文作为某些类型审计事件的属性
xpack.security.audit.logfile.events.include: ["_all"]           #
# 审计日志记录如身份验证失败、拒绝连接、数据访问等事件,此外还会记录通过 API 对安全配置进行的更改,如创建、更新、删除本机和内置用户、角色、角色映射和 API 密钥 ...
# 默认记录的事件如下:
#   access_denied
#   access_granted
#   anonymous_access_denied
#   authentication_failed
#   connection_denied
#   tampered_request
#   run_as_denied
#   run_as_granted
#   security_config_change

action.destructive_requires_name: true                                  # 限制须指定索引名才能删除,无法用 _all 通配删除
action.auto_create_index: .monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*   # 
cluster.routing.allocation.cluster_concurrent_rebalance: 8              # 最多允许多少分片同时迁移,默认 2
cluster.routing.allocation.node_initial_primaries_recoveries: 8         # 初始化主分片数据恢复时并发恢复线程数,默认 4 
cluster.routing.allocation.node_concurrent_recoveries: 8                # 增删节点或负载均衡时并发恢复线程数,默认 2

reindex.remote.whitelist: "127.0.20.1:9200,127.0.10.*:9200"             # 指定可以从远程重新索引的主机
# 使用 _reindex 跨集群复制索引功能时,需在执行该操作的新集群中设置该选项以允许访问的拥有源索引的节点白名单 ...

# 索引生命周期管理
xpack.ilm.enabled: true                             # 设为 false 可禁用任何 ILM REST API 及相应功能,默认true (将在 8.0 删除)
# indices.lifecycle.poll_interval: 10m              # 索引生命周期管理检查符合策略标准的索引的频率。默认 10m
# indices.lifecycle.history_index_enabled: true     # 启用ILM的历史记录索引后 ILM 将作为ILM策略的一部分将操作历史记录到 ilm-history-* 索引,默认 true

# 关于机器学习相关的参数设置:www.elastic.co/guide/en/elasticsearch/reference/current/ml-settings.html
# xpack.ml.enabled: true                            # 为 true(默认)则在该节点启用机器学习 API

# ---------------------------------------------------------------------------------- Security

# 启动前需在某节点配置 TLS,而后其他所有节点使用该节点生成的 elastic-certificates.p12 文件 (内含公/私钥)
# Use the elasticsearch-certutil tool to generate a CA for cluster.
# For client applications, may only need to copy the CA certificate and configure the client to trust this certificate.
# 出现提示时接受默认文件名: elastic-stack-ca.p12. 此文件含 CA 的公共证书和用于为每个节点签署证书的私钥
# 参数 -pass 是 CA 的密码,若不是生产环境可选择将密码留空 ...
./bin/elasticsearch-certutil ca -out config/elastic-stack-ca.p12 [ -pass "" ]

# 使用 CA 的证书 (内含私钥) 生成节点使用的证书和私钥,期间会提示输入已存在的 CA 证书密码及设置节点证书的密码
# 默认生成的是没有主机名信息的证书,可将其用于所有节点 ( 将生成的文件拷到所有节点 config 下并设 640 权限 )
./bin/elasticsearch-certutil cert --ca config/elastic-stack-ca.p12 -out config/elastic-certificates.p12 [ -pass "" ]

# 编辑集群中每个节点的 elasticsearch.yml 如下
# Because using the same elastic-certificates.p12 file on every node in cluster, set the verification mode to certificate:
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

# 若在创建节点证书时输入了密码,需执行以下命令将密码存到 Elasticsearch 密钥库
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

# --------------------------------------------- HTTP TLS (可选)

# https://www.elastic.co/guide/en/elasticsearch/reference/current/security-basic-setup-https.html

# 在保存有CA证书的节点执行如下步骤,生成专门用于加密 HTTP 通信的证书
# 执行后将会指导用户生成适当的证书,若为群集创建了CA,则可在出现 CA 证书路径的提示时提供其路径来使用
# 该命令将生成zip文件,包含要在Elasticsearch和Kibana中使用的证书和密钥,每个文件夹都包含自述文件来说明应如何使用
./bin/elasticsearch-certutil http
#   当询问是否要生成CSR时,输入n
#   当询问是否使用现有CA时,输入y
#   输入CA的路径,这是 elastic-stack-ca.p12 的绝对路径
#   输入CA的密码
#   输入证书有效期。单位可以是年、月、日,例如: 10y
#   当系统询问是否要为每个节点生成一个证书时,输入y
#   每个证书都有自己的私钥,并针对特定主机名或IP颁发
#   出现提示时输入集群中第一个节点的名称,使用在生成节点证书时使用的相同节点名称
#   输入用于连接到第一个节点的所有主机名,这些主机名将作为 DNS 名称添加到证书的备用名称 (SAN) 字段中
#   列出用于通过 HTTPS 连接到集群的每个主机名和别名
#   输入客户端可用于连接到集群节点的IP地址
#   对集群中的每个其他节点重复这些步骤

# Unzip the generated elasticsearch-ssl-http.zip file.
# 该压缩文件包含用于 Elasticsearch 和 Kibana 的目录:
./elasticsearch
    |_ README.txt                   # 使用说明
    |_ http.p12                     # 将该证书复制到每个节点上的 $ES_PATH_CONF/config 目录中
    |_ sample-elasticsearch.yml     # 样例配置
./kibana
    |_ README.txt                   # 使用说明
    |_ elasticsearch-ca.pem         # CA证书
    |_ sample-kibana.yml            # 样例配置: https://www.elastic.co/guide/en/kibana/7.6/configuring-tls.html

# 将节点证书复制到适当位置 ...
# 对于其他的Elastic产品,将证书复制到相关的配置目录 ...
# 将适用的文件复制到每个节点上的Elasticsearch配置目录中 ...

# 启用TLS并指定访问节点证书所需的信息
# 编辑集群中每个节点的 elasticsearch.yml 如下
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: "config/http.p12"
xpack.security.http.ssl.truststore.path: "config/http.p12"     # ? This line Maybe not Need to set... :-)

# 若使用了密码保护密钥库或私钥,需将该密码添加到Elasticsearch中的安全设置
bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password

# Tips:
# 若在 HTTP 层启用TLS,则需对 Elastic Stack 的其他组件做适当更改

# --------------------------------------------- Tips

# 加密浏览器与Kibana之间的流量
# https://www.elastic.co/guide/en/elasticsearch/reference/current/security-basic-setup-https.html#encrypt-kibana-browser

# 设置beats使用TLS与集群通信
# https://www.elastic.co/guide/en/elasticsearch/reference/current/security-basic-setup-https.html#configure-metricbeat-tls

# 关于各类beats与Elasticsearch的安全通信参考
# https://www.elastic.co/guide/en/elasticsearch/reference/current/ccs-clients-integrations.html

# Tips: 这里设置完成后还有若干内置用户的权限问题需设置

# --------------------------------------------- RBAC

# 方式一
# 在集群启动后设置内置的若干缺省用户的密码:(下例若使用 auto 参数则自动生成密码,否则采用交互式设置)
./bin/elasticsearch-setup-passwords [interactive|auto]
# 若用上述方式创建用户则不需再使用 elasticsearch-users 工具进行创建,除非需创建的用户不是内置用户
# 该命令使用瞬态引导方式运行,因此其成功执行后将不能再次执行。后期可从Kibana的 "管理 -> 用户" 界面更新密码或用API修改
# 内置用户存储在特殊的名为 .security 的索引中

# 方式二
# 若禁用内置用户或更改其密码,将自动反映到集群每个节点,但从快照中删除或恢复索引则已应用的任何更改都将丢失
./elasticsearch-users useradd <NAME> -p <PASS> -r superuser        # 新增用户(该命令基于file的用户体系,通过其创建的用户不可通过API更改)
./elasticsearch-users list                                         # 查看用户列表(仅针对基于file的用户体系)
# Tips,基于文件的用户身份验证: 
# https://www.elastic.co/guide/en/elasticsearch/reference/current/file-realm.html

# ---------------------------------------------------------------------------------- Tips

# 生产环境除非在HTTP层启用TLS,否则某些功能(令牌、API密钥)将被禁用,这一额外的安全层确保所有进出集群的通信都是安全的

[root@localhost bin]# ./elasticsearch-users --help
# .........
# Commands
# --------
# useradd - Adds a file user
# userdel - Deletes a file based user
# passwd - Changes the password of an existing file based user
# roles - Edit roles of an existing user
# list - List existing file based users and their corresponding roles
# .........

# --------------------------------------------------------------------------------- IK Plugin

# 安装与 Elasticsearch 版本对应的 IK 分词插件
# Download:https://github.com/medcl/elasticsearch-analysis-ik/releases
unzip elasticsearch-analysis-ik-x.x.x.zip -d ~
cd ~/elasticsearch-analysis-ik-x.x.x
# 对源码编译打包
mvn package
mkdir -p ~/elasticsearch-x.x.x/plugins/ik
unzip -d ~/elasticsearch-x.x.x/plugins/ik ./target/releases/elasticsearch-analysis-ik-x.x.x.zip

# 为 IK 插件新增自定义的词
# 编辑分词器的配置文件,指定自定义分词字典文件的名称 ...
vim ~/elasticsearch-x.x.x/plugins/ik/config/IKAnalyzer.cfg.xml
<properties>
    # ......
    # 
    <entry key="ext_dict">custom.dic</entry>
    # 
    <entry key="ext_stopwords"></entry>
    # ......
</<properties>

# 创建自定义单词文件,使其中的内容作为完整的词
cat > ~/elasticsearch-x.x.x/plugins/ik/config/custom.dic <<'EOF'
隔壁老铁
隔壁老王
隔壁老张
EOF

# ---------------------------------------------------------------------------------- Run

# 启动 Elasticsearch
# 选项 -p 用于将进程PID写入文件,因此在关闭进程时可执行: pkill - F $ES_HOME/logs/pid ( .tar.gz 包不含 systemd 的服务模块 )
# 启动后状态查看: curl -sL -X GET 'localhost:9200/_cat/health?v&pretty' ( 或 _cluster/stats )
cd ~/elasticsearch-x.x.x/bin
./elasticsearch -d -p pid \
    -E node.name=${node_name} \
    -E node.attr.${custom_key}="${custom_value}" \
    -E cluster.name=elasticsearch \
    -E logger.org.elasticsearch.transport=trace \
    &> /dev/null &

# 查看已载入的插件
./elasticsearch-plugin list

# --------------------------------------------------------------------------------- Monitor

# Tips:
# 官方开始转由 Metricbeat/Filebeat 收集 Elasticsearch、Logstash、Kibana、Beats 的运行指标及监控、日志数据
Metricbeat: # https://www.elastic.co/guide/en/elasticsearch/reference/current/configuring-metricbeat.html
Filebeat:   # https://www.elastic.co/guide/en/elasticsearch/reference/current/configuring-filebeat.html

# 建议部署集群后使用 Metricbeat 对集群状态指标进行监控
# curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-x.xx.x-linux-x86_64.tar.gz
# tar xzvf metricbeat-x.xx.x-linux-x86_64.tar.gz && cd .....
# ./metricbeat modules enable [system|......]

# --------------------------------------------------------------------------------- Restful API

# 关于 Elasticsearch 的 Restful API 文档
# www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html

测试 IK 分词插件的功能

# IK分词器支持中英文单词的切分,目前自带的主词典拥有27W左右汉语词量
# 此外对于分词组件应用场景所涉及的领域不同,需要各类专业词库的支持,为此IK提供了对扩展词典的支持 ...
# IK还提供了对用户自定义的停止词(过滤词)的扩展支持

# ----------------------------------------------------

# IK提供两种分词模式:
#   智能模式:     对应es的IK插件的 ik_smart
#   细粒度模式:   对应es的IK插件的 ik_max_word (穷尽词库中所有可能的排列组合)

curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_max_word' -d '这是一个测试'
# ...

curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_smart' -d '这是一个测试'
# 输出:
# {
#   "tokens" : [
#     {
#       "token" : "这是",
#       "start_offset" : 0,
#       "end_offset" : 2,
#       "type" : "CN_WORD",
#       "position" : 0
#     },
#     {
#       "token" : "一个",
#       "start_offset" : 2,
#       "end_offset" : 4,
#       "type" : "CN_WORD",
#       "position" : 1
#     },
#     {
#       "token" : "测试",
#       "start_offset" : 4,
#       "end_offset" : 6,
#       "type" : "CN_WORD",
#       "position" : 2
#     }
#   ]
# }

Index、Shard、Lucene、Segment

# www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-merge.html

# Elasticsearch 索引的本质是若干物理分片的逻辑分组,每个分片又是一个独立的 Lucene 实例...
# Tips: index( *Shard( *segment[Lucene] <=> 倒排索引 ) )
#
#    索引可以只有1个shard,但使用多个分片可拆分索引到若干节点来分担索引压力
#    一个 shard 就是 Lucene 实例,而一个 Lucene 实例就是个完整的搜索引擎 (lucene再分割为若干小单元: segment..)
#    一个 shard 包含若干 segment,而一个 segment 就是倒排索引,索引新的文档会创建新的 segment
#    segment 会持续的被合并 (就像是小水滴汇聚成的大水滴)

Tips
# 官方建议 Jvm heap 每1G不超过20个分片,每个分片控制在 20 ~ 40G
# X-Pack 是 Elastic Stack 的扩展,提供安全、警报、监控、报告、机器学习和许多其他功能
# 插件是以自定义的方式增强 Elasticsearch 的方法,如添加自定义的映射类型、分析器、脚本引擎、发现等 ...
# 选举主节点和更改集群状态是符合主节点条件的节点必须协同执行的两项基本任务,主节点是集群中唯一可以更改集群状态的节点
# 可将本地集群连接到其他 Elasticsearch 集群,称为远程集群。连接后,可使用跨集群搜索来搜索远程集群
# 还可以使用跨集群复制在集群之间同步数据 ...

# -----------------------------------

# 查询时会把分片内所有 segment 的查询结果汇总合并后做为最终的分片查询结果返回
# 进行索引时 Elasticsearch 将文档数据写到内存中的 Index buffer 中(出于安全目的也同时写到 translog)
# Elasticsearch定时(可配置)把数据写到 segment 缓存小文件中,然后刷新 refresh_interval 使刚写入的 segment 可供查询
# 不过此时还没持久化到磁盘。因此还存在丢失可能
# 所以还会执行 flush 操作把 segment 持久化到磁盘并清除 translog(因此时数据已到磁盘,不在需要了) 

# 当索引数据不断增长时对应的 segment 也不断增多,查询性能可能会下降,因此会触发 segment 合并的线程
# 合并线程负责把若干小segment合并成更大的segment,然后删除小的segment ... 
# 由于segment是不可变的,当更新文档时只会把旧数据打上已删除标记,然后写一条新的文档,在执行flush操作时才会把标记的记录物理删除
# 即: 删除发生在分段合并的阶段 ...
 
# ----------------------------------- segment & translog

# Lucene里面的segments文件是数据存储最重要的文件 ( 一个Shard(分片)就是一个Lucene实例 )
# 数据是由一个个segment组成的,数据先写入内存,经过设置的时间间隔将该时间段写入内存的数据全部刷到一个segment中
# 由于一段时间生成一个segment,避免了短时间内写入一个较大的磁盘文件,segment多了之后会merge成更大的segment
# 因此最初的数据写入是在内存中完成,所以写入效率极高,但在写入过程中若掉电导致内存里的数据没及时落盘就会出现丢失数据
# 所以Elasticsearch基于此现象使用了translog,只有在segment数据落盘后,才会删除对应的translog ...

# -----------------------------------

# 段合并 segments merge
# 要定时对索引分片中的段进行合并优化,不然segment越多则占用的segment memory越多,查询性能越差
POST /<Index_name>/_forcemerge?max_num_segments=1

# 查看索引的数据在ES节点内执行段合并的信息(将小数据文件合成大文件,提高查询效率)
GET _cat/segments/<Index_name>?v&h=index,ip,segment,size
GET <Index_name>/_segments

kibana

# Download:https://artifacts.elastic.co/downloads/kibana/kibana-7.3.0-x86_64.rpm

yum install -y kibana-x.x.x-x86_64.rpm 

cat /etc/kibana/kibana.yml 
server.port: 5601
server.host: "xx.xx.xx.xx"
elasticsearch.url: "http://xx.xx.xx.xx:9200"
elasticsearch.username: "user"
elasticsearch.password: "pass"

systemctl enable kibana --now

# 监听端口
ss -tnl src :5601

倒排索引

segment
# lucene 内部的数据由若干segment组成,写入lucene的数据并不直接落盘,而是先写在内存
# 经过了 refresh 间隔才将该时间段写入的全部数据refresh成一个 segment
# segment多了之后会merge成更大的segment,lucene 查询时会遍历每个 segment
# 由于lucene写入的数据是在内存中完成,所以写入效率极高,但也存在丢失数据的风险
# 所以Elasticsearch基于此现象使用了translog,只有在segment数据落盘后才会删除对应的translog

doc
# 表示lucene中的一条记录

field
# 表示记录中的字段概念,doc由若干field组成

term
# 是lucene中索引的最小单位,某个field对应的内容若是 "text" 全文检索类型,就会将其进行分词
# 分词的结果是由若干 term 组成的。如果是不分词的字段,则该字段内容就是一个 term

倒排索引(inverted index)
# lucene索引的通用叫法,即实现了 term 到 doc list 的映射 ...

正排数据
# 搜索引擎的通用叫法,即原始数据,可以理解为 doc list

docvalues
# Elasticsearch 中列式存储的名称,除了存储原始存储、倒排索引,还存储了一份 docvalues,用作分析和排序


官方提供的 Ansible role 部署方式
# https://github.com/elastic/ansible-elasticsearch

官方提供的各类语言的客户端集成
# https://www.elastic.co/guide/en/elasticsearch/client/index.html

Elastic stack 术语参考
# https://www.elastic.co/guide/en/elastic-stack-glossary/current/terms.html

# ------------------------------------------------------ Backup

# 快照可防止永久性数据丢失,快照生命周期管理是对集群进行定期备份的最佳实践,备份集群唯一可靠且支持的方法就是快照
# 不能通过复制节点的数据目录来备份 Elasticsearch 集群,不支持从文件系统级备份恢复任何数据的方法
# 若尝试从上述的备份中恢复,可能会失败并报告损坏或丢失文件或其他数据不一致,或丢失数据 ...

# ------------------------------------------------------ configure priority

# 若使用多种方法配置相同的设置,Elasticsearch 将按以下顺序应用设置
# 注: 建议使用集群更新 API 设置动态的、集群范围的设置,而 elasticsearch.yml 仅用于本地配置,使用集群更新 API 可确保所有节点配置相同
#   1.瞬态设置
#   2.持久设置
#   3.elasticsearch.yml
#   4.默认值

# ------------------------------------------------------ ML

# Elasticsearch 提供的 Machine Learning 无需指定算法、模型或其他与数据科学相关的配置即可执行操作
# 使用机器学习功能创建数据中的正常行为的准确基线来识别异常模式,通过其可检测:
#   1.与值、计数或频率的时间偏差相关的异常
#   2.统计稀有度
#   3.某个群体成员的异常行为

你可能感兴趣的:(elk,elasticsearch)