(window.webpackJsonp=window.webpackJsonp||[]).push([[86],{388:function(s,t,a){"use strict";a.r(t);var n=a(10),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"部署"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#部署"}},[s._v("#")]),s._v(" 部署")]),s._v(" "),t("p",[s._v("ES 常见的部署架构：")]),s._v(" "),t("ul",[t("li",[s._v("单实例")]),s._v(" "),t("li",[s._v("集群\n"),t("ul",[t("li",[s._v("由多个实例组成分布式集群，获得更大的容量、更高的性能，还可通过冗余节点提高可用性。")])])]),s._v(" "),t("li",[s._v("远程集群\n"),t("ul",[t("li",[s._v("远程集群与本地集群之间独立工作，但可以查询、拷贝其数据，实现横向扩容。")])])])]),s._v(" "),t("h2",{attrs:{id:"版本"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#版本"}},[s._v("#")]),s._v(" 版本")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("ElasticSearch、Kibana 的开源版本又称为社区版（OSS），只提供了基础功能。其它功能通过一组闭源插件 x-pack 提供。")]),s._v(" "),t("ul",[t("li",[s._v("x-pack 提供的 Monitoring、Grok Debugger 等功能是免费使用的，属于 basic license ，但 Security、Alerting 等功能是收费的。")]),s._v(" "),t("li",[s._v("详见 Elastic 公司的 "),t("a",{attrs:{href:"https://www.elastic.co/cn/subscriptions",target:"_blank",rel:"noopener noreferrer"}},[s._v("订阅列表"),t("OutboundLink")],1),s._v(" 。")])])]),s._v(" "),t("li",[t("p",[s._v("v1.0")]),s._v(" "),t("ul",[t("li",[s._v("：于 2010 年发布。最初由 Shay Banon 开发，后来由 Elastic 公司管理。")])])]),s._v(" "),t("li",[t("p",[s._v("v6.0")]),s._v(" "),t("ul",[t("li",[s._v("：于 2017 年发布。")]),s._v(" "),t("li",[s._v("创建索引时，只能定义一个 type ，默认命名为 _doc 。")])])]),s._v(" "),t("li",[t("p",[s._v("v7.0")]),s._v(" "),t("ul",[t("li",[s._v("：于 2019 年发布。")]),s._v(" "),t("li",[s._v("创建索引时，建议不包含 type 。")]),s._v(" "),t("li",[s._v("number_of_shards 默认值从 5 改为 1 。")]),s._v(" "),t("li",[s._v("终端日志改为 JSON 格式。")]),s._v(" "),t("li",[s._v("默认配置了 "),t("code",[s._v('"search.max_open_scroll_context": 500')]),s._v(" 。建议将 scroll 请求改为 PIT + search_after 请求。")]),s._v(" "),t("li",[s._v("从 v6.8、v7.1 版本开始，将 x-pack 中的 RBAC 身份认证、TLS 加密通信改为免费功能。\n"),t("ul",[t("li",[s._v("启用方法：在 elasticsearch.yml 中加入 "),t("code",[s._v("xpack.security.enabled: true")]),s._v(" ，然后执行 "),t("code",[s._v("bin/elasticsearch-setup-passwords auto")]),s._v(" 生成各个内置用户的密码。")])])]),s._v(" "),t("li",[s._v("v7.8 新增了可组合的索引模板（composable index template）。")]),s._v(" "),t("li",[s._v("v7.10 新增了 PIT（point in time）。")])])]),s._v(" "),t("li",[t("p",[s._v("v8.0")]),s._v(" "),t("ul",[t("li",[s._v("：于 2022 年发布。")]),s._v(" "),t("li",[s._v("创建索引时，禁用 type 。")]),s._v(" "),t("li",[s._v("内置字段 _id 默认禁用 fielddata ，避免占用大量 JVM 内存，因此不支持 aggregations、sorting、scripting 操作。给集群配置 "),t("code",[s._v('"indices.id_field_data.enabled": true')]),s._v(" 才会启用。")]),s._v(" "),t("li",[s._v("初次部署 ES 时，默认会自动修改 "),t("code",[s._v("config/elasticsearch.yml")]),s._v(" 文件，启用 x-pack 中的 RBAC 身份认证、TLS 加密通信。\n"),t("ul",[t("li",[s._v("它会自动生成自签名的 TLS 证书文件，保存到 "),t("code",[s._v("config/certs/")]),s._v(" 目录下，有三个文件："),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("http_ca.crt     "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# CA 证书文件，用于签署 http.p12 证书")]),s._v("\nhttp.p12        "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ES 提供 HTTP 端口供客户端访问时，采用该证书进行 TLS 加密通信")]),s._v("\ntransport.p12   "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ES 集群的各节点通过 TCP 端口相互通信时，采用该证书进行 TLS 加密通信")]),s._v("\n")])])])]),s._v(" "),t("li",[s._v("用户需要执行以下命令，为内置用户生成随机密码。"),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("bin/elasticsearch-reset-password "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("--url")]),s._v(" https://localhost:9200 "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-u")]),s._v(" elastic\nbin/elasticsearch-reset-password "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("--url")]),s._v(" https://localhost:9200 "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-u")]),s._v(" kibana_system\n")])])])]),s._v(" "),t("li",[s._v("用户需要拷贝 "),t("code",[s._v("config/certs/http_ca.crt")]),s._v(" 这个 CA 证书文件，给访问 ES 的客户端使用，例如："),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" https://localhost:9200 "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("--cacert")]),s._v(" http_ca.crt "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-u")]),s._v(" elastic\n")])])]),s._v("如果客户端不使用 CA 证书文件，则不能验证 ES 服务器的身份，只能忽略 TLS 认证，例如："),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" https://localhost:9200 "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-k")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-u")]),s._v(" elastic\n")])])])])])])])])]),s._v(" "),t("h2",{attrs:{id:"单实例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#单实例"}},[s._v("#")]),s._v(" 单实例")]),s._v(" "),t("h3",{attrs:{id:"部署-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#部署-2"}},[s._v("#")]),s._v(" 部署")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("下载二进制版：")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("wget")]),s._v(" https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz\n")])])]),t("p",[s._v("解压后运行：")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("bin/elasticsearch       "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在前台运行")]),s._v("\n                  "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-d")]),s._v("    "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 以 daemon 方式运行")]),s._v("\n")])])]),t("ul",[t("li",[s._v("运行时需要 JDK 环境，不过二进制发行版自带了一个 JDK 。")]),s._v(" "),t("li",[s._v("安装插件时，只需将插件解压到 plugins 目录下。")])])]),s._v(" "),t("li",[t("p",[s._v("或者用 docker-compose 部署：")]),s._v(" "),t("div",{staticClass:"language-yml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v("'3'")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("services")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("elasticsearch")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("container_name")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" elasticsearch\n    "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("image")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" elasticsearch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("7.10.0\n    "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("restart")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" unless"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("stopped\n    "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("ports")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 9200"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9200")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# - 9300:9300")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("volumes")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" ./config"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("/usr/share/elasticsearch/config\n      "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" ./data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("/usr/share/elasticsearch/data\n")])])]),t("ul",[t("li",[s._v("容器内以非 root 用户运行服务，需要调整挂载目录的权限："),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-p")]),s._v(" data\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-R")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\n")])])])])])])]),s._v(" "),t("h3",{attrs:{id:"配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置"}},[s._v("#")]),s._v(" 配置")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("ES 启动时会检查 Linux 主机是否满足以下条件，如果不满足则会发出警告。如果此时还配置了 "),t("code",[s._v("network.host")]),s._v(" 参数，则 ES 会按生产环境严格要求，将这些警告升级为异常。")]),s._v(" "),t("ul",[t("li",[s._v("禁用 Swap 分区：\n"),t("ul",[t("li",[s._v("需要执行命令 "),t("code",[s._v("swapoff -a")]),s._v(" ，并且将 "),t("code",[s._v("/etc/fstab")]),s._v(" 文件中的 swap 分区都注释。")])])]),s._v(" "),t("li",[s._v("增加进程的内存映射区域数量的上限：\n"),t("ul",[t("li",[s._v("需要执行命令 "),t("code",[s._v("sysctl vm.max_map_count=262144")]),s._v(" ，并在 "),t("code",[s._v("/etc/sysctl.conf")]),s._v(" 文件中永久修改该参数。")])])]),s._v(" "),t("li",[s._v("增加进程数量的上限：\n"),t("ul",[t("li",[s._v("需要执行命令 "),t("code",[s._v("ulimit -u 4096")]),s._v(" ，并在 "),t("code",[s._v("/etc/security/limits.conf")]),s._v(" 文件中永久修改该参数。")])])]),s._v(" "),t("li",[s._v("增加文件描述符数量的上限：\n"),t("ul",[t("li",[s._v("需要执行命令 "),t("code",[s._v("ulimit -n 65535")]),s._v(" ，并在 "),t("code",[s._v("/etc/security/limits.conf")]),s._v(" 文件中永久修改该参数。")])])])])]),s._v(" "),t("li",[t("p",[s._v("可以在 "),t("code",[s._v("config/jvm.options")]),s._v(" 文件中配置 ES 的 JVM ：")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-Xms4g")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-Xmx4g")]),s._v("\n")])])]),t("ul",[t("li",[s._v("JVM -Xmx 过低时，会频繁引发 GC ，增加 CPU 负载，增加 ES 读写耗时。")]),s._v(" "),t("li",[s._v("建议 JVM -Xmx 不超过 32G 。\n"),t("ul",[t("li",[s._v("超过 32G 时，内存的寻址范围变大，JVM 会停止使用 CompressedOops 压缩指针，改为使用普通指针，导致多占用 10 多 GB 的内存。")]),s._v(" "),t("li",[s._v("如果需要使用超过 32G 的内存，则建议增加 ES 集群的节点数，横向扩容。")])])]),s._v(" "),t("li",[s._v("主机应该留出一些空闲内存，相当于 JVM -Xmx 的 0.5~1 倍，用作 Page Cache ，提高 Lucene 读写磁盘的性能。")])])]),s._v(" "),t("li",[t("p",[s._v("ES 的主配置文件是 "),t("code",[s._v("config/elasticsearch.yml")]),s._v(" 。修改它之后，需要重启 ES 才会生效。")]),s._v(" "),t("ul",[t("li",[s._v("部署 ES 集群时，修改一个 elasticsearch.yml 只会作用于一个 ES 节点，因此需要同步修改所有 ES 节点的配置文件。")])])]),s._v(" "),t("li",[t("p",[s._v("elasticsearch.yml 的内容示例：")]),s._v(" "),t("div",{staticClass:"language-yml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cluster.name")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" cluster"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("             "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 该 ES 所属的集群名")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery.type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" single"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("node         "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 发现模式。这里取消发现集群的其它节点，从而部署成单实例")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.name")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" node"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("                   "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 该 ES 的节点名，默认采用当前主机名")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# path.data: /var/data/elasticsearch")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# path.logs: /var/log/elasticsearch")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("network.host")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 0.0.0.0               "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 该 ES 的 Socket 绑定的 IP")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("network.publish_host")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" 10.0.0.1      "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 该 ES 公布给集群中其它 ES 的 IP ，供它们访问。默认等于 network.host")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# transport.port: 9300              # TCP 通信监听的端口，供集群中其它 ES 节点访问")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 关于 HTTP API")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# http.port: 9200                   # HTTP 通信监听的端口，供用户访问")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# http.max_initial_line_length: 4kb # 允许接收的 HTTP 请求的 URL 长度")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# http.max_header_size: 8kb         # 允许接收的 HTTP 请求的 header 体积")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# http.max_content_length: 100mb    # 允许接收的 HTTP 请求的 body 体积（解压之后）")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# http.compression: true            # 是否压缩 HTTP 响应的 body")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# http.compression_level: 3         # 压缩级别，取值范围为 1~9 ，9 的压缩率最高")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# http.cors.enabled: false          # 是否允许 CORS 请求")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("xpack.monitoring.enabled")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("     "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 是否启用对 ELK 自身的监控，默认为 true ，监控数据保存到索引 .monitoring-*")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# xpack.security.enabled: true                # 是否启用 security 功能，包括 RBAC 身份认证、TLS 加密通信等")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# xpack.security.http.ssl.enabled: true       # ES 提供 HTTP 端口供客户端访问时，是否启用 TLS 加密通信")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# xpack.security.transport.ssl.enabled: true  # ES 集群的各节点通过 TCP 端口相互通信时，采用启用 TLS 加密通信")]),s._v("\n")])])])]),s._v(" "),t("li",[t("p",[s._v("ES 允许在运行时通过 API 修改一些配置参数，称为动态参数（Dynamic）。而其它配置参数称为静态参数（Static）。")]),s._v(" "),t("ul",[t("li",[s._v("动态参数分为两种作用域：\n"),t("ul",[t("li",[s._v("persistent ：持久配置，即使集群重启也会生效。")]),s._v(" "),t("li",[s._v("transient ：暂时配置，在集群重启之后失效。")])])]),s._v(" "),t("li",[s._v("集群按以下优先级顺序采用配置参数：\n"),t("ul",[t("li",[s._v("transient")]),s._v(" "),t("li",[s._v("persistent")]),s._v(" "),t("li",[s._v("配置文件")]),s._v(" "),t("li",[s._v("默认配置")])])]),s._v(" "),t("li",[s._v("例：将一个参数的 transient 值设置为 null ，或者等集群重启，则会采用该参数的 persistent 值。")]),s._v(" "),t("li",[s._v("修改动态参数的示例："),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("PUT /_cluster/settings\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"persistent"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"indices.id_field_data.enabled"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" false,       "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 内置字段 _id 是否启用 fielddata ，ES v8 开始默认禁用")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"indices.recovery.max_bytes_per_sec"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"50mb"')]),s._v(", "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 每个节点执行 peer recovery 或 snapshot recovery 操作时，最大的 IO 速度")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cluster.max_shards_per_node"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),s._v("   "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 每个数据节点最多打开的 shard 数量（包括主分片、副分片、unassigned_shards，不包括 closed 索引的分片），默认为 1000")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"transient"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"indices.recovery.max_bytes_per_sec"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"20mb"')]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])])])])])]),s._v(" "),t("h2",{attrs:{id:"备份数据"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#备份数据"}},[s._v("#")]),s._v(" 备份数据")]),s._v(" "),t("p",[s._v("ES 备份数据的几种方式：")]),s._v(" "),t("ul",[t("li",[s._v("通过 Snapshot API 创建快照文件。\n"),t("ul",[t("li",[s._v("适合离线备份，备份速度快。")])])]),s._v(" "),t("li",[s._v("通过 reindex API 将远程集群的数据拷贝到本地集群。")])]),s._v(" "),t("h2",{attrs:{id:"集群"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#集群"}},[s._v("#")]),s._v(" 集群")]),s._v(" "),t("h3",{attrs:{id:"部署-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#部署-3"}},[s._v("#")]),s._v(" 部署")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("部署 ES 集群时，需要部署多个 ES 实例，在它们的 elasticsearch.yml 中都加入以下配置：")]),s._v(" "),t("div",{staticClass:"language-yml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# discovery.type: single-node   # 不部署成单节点")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("discovery.seed_hosts")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("   "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 声明该集群的所有节点，默认值为 127.0.0.1、[::1]")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 10.0.0.1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9300")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 10.0.0.2"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9300")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 10.0.0.3"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9300")]),s._v("\n")])])]),t("ul",[t("li",[s._v("每个 ES 节点启动时，会自动根据 "),t("code",[s._v("discovery.seed_hosts")]),s._v(" 连接到其它 ES 节点，如果它们拥有相同的 "),t("code",[s._v("cluster.name")]),s._v(" ，则组成同一个 ES 集群。")])])]),s._v(" "),t("li",[t("p",[s._v("初次启动 ES 集群时，尚未选举出主节点。第一个启动的 ES 节点应该属于主资格节点，并临时添加以下配置：")]),s._v(" "),t("div",{staticClass:"language-yml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cluster.initial_master_nodes")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" node"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("              "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定当前节点的名称或 IP")]),s._v("\n")])])]),t("ul",[t("li",[s._v("这表示初始的主资格节点有哪些，需要从中选举出一个节点，担任主节点。")]),s._v(" "),t("li",[s._v("ES 集群初次启动成功之后，即可删除 "),t("code",[s._v("cluster.initial_master_nodes")]),s._v(" 配置。此后如果重启 ES 节点、新增 ES 节点，会自动根据 "),t("code",[s._v("discovery.seed_hosts")]),s._v(" 连接到其它 ES 节点，获知当前的主节点地址。")])])])]),s._v(" "),t("h3",{attrs:{id:"节点"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#节点"}},[s._v("#")]),s._v(" 节点")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("ES 集群（cluster）中，每个 ES 实例称为一个节点（node）。")]),s._v(" "),t("ul",[t("li",[s._v("全部节点中，有且仅有一个主节点（master），负责管理集群，比如增删索引、分配分片给某个节点。")])])]),s._v(" "),t("li",[t("p",[s._v("一个 ES 节点可以担任多种角色：")]),s._v(" "),t("ul",[t("li",[t("code",[s._v("master")]),s._v(" "),t("ul",[t("li",[s._v("：主资格节点（master-eligible），有资格被选举为主节点。")]),s._v(" "),t("li",[s._v("ES 集群中可存在一个或多个主资格节点，会自动选举出一个节点，担任主节点。")]),s._v(" "),t("li",[s._v("只有主资格节点有权参与主节点的选举投票，data、coordinating 等角色的节点无权参与 。")]),s._v(" "),t("li",[s._v("可以给某个主资格节点配置 "),t("code",[s._v("node.voting_only: true")]),s._v(" ，表示只参与选举投票，不会当选。")])])]),s._v(" "),t("li",[t("code",[s._v("data")]),s._v(" "),t("ul",[t("li",[s._v("：数据节点，负责存储数据，支持增删查改、聚合等操作。")]),s._v(" "),t("li",[s._v("master 和 data 节点都需要使用 "),t("code",[s._v("path.data")]),s._v(" 目录。")])])]),s._v(" "),t("li",[t("code",[s._v("ingest")]),s._v(" "),t("ul",[t("li",[s._v("：摄取节点，负责将管道应用于文档，以便在建立索引之前加工文档。")])])]),s._v(" "),t("li",[t("code",[s._v("ml")]),s._v(" "),t("ul",[t("li",[s._v("：机器学习节点。集群至少拥有一个此类节点才能提供机器学习功能。")])])]),s._v(" "),t("li",[t("code",[s._v("remote_cluster_client")]),s._v(" "),t("ul",[t("li",[s._v("：远程集群节点，可以连接到远程集群，作为其客户端。")])])]),s._v(" "),t("li",[t("code",[s._v("transform")]),s._v(" "),t("ul",[t("li",[s._v("：转换节点。提供转换功能。")])])]),s._v(" "),t("li",[t("code",[s._v("coordinating")]),s._v(" "),t("ul",[t("li",[s._v("：协调节点。它是每个节点的隐式角色，不能取消。")]),s._v(" "),t("li",[s._v("每个节点都知道各个文档存储在哪个节点上，也默认可以处理用户的 HTTP 请求。"),t("br"),s._v("\n因此用户可以向任意节点发出查询请求，该节点会将请求转发给存储相应文档的数据节点（可能有多个），然后将查询结果返回给用户。")])])])])]),s._v(" "),t("li",[t("p",[s._v("节点的默认角色配置如下：")]),s._v(" "),t("div",{staticClass:"language-yml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.master")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.voting_only")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.data")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.ingest")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.ml")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cluster.remote.connect")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n")])])])]),s._v(" "),t("li",[t("p",[s._v("在以下情况下，主资格节点会发起主节点的选举：")]),s._v(" "),t("ul",[t("li",[s._v("发现它自己不是主节点。")]),s._v(" "),t("li",[s._v("询问其它节点，发现大家都没有连接到主节点。")]),s._v(" "),t("li",[s._v("发现有至少 "),t("code",[s._v("discovery.zen.minimum_master_nodes")]),s._v(" 个主资格节点没有连接到主节点。该参数的默认值为："),t("code",[s._v("主资格节点总数/2 + 1")])])])]),s._v(" "),t("li",[t("p",[s._v("ES 集群的高可用方案：")]),s._v(" "),t("ul",[t("li",[s._v("部署至少 3 个主资格节点，其中至少 2 个节点为 "),t("code",[s._v("node.voting_only: false")]),s._v(" ，从而可以通过选举更换主节点。")]),s._v(" "),t("li",[s._v("不能同时停止 50% 数量的主资格节点，否则集群不能投票决策。但可以分多次停止。")]),s._v(" "),t("li",[s._v("让每个节点专注于一种角色，以减少不相关的工作负担。比如配置专用的主节点："),t("div",{staticClass:"language-yml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.master")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.voting_only")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.data")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.ingest")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("node.ml")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cluster.remote.connect")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("false")]),s._v("\n")])])])])])])]),s._v(" "),t("h3",{attrs:{id:"管理"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#管理"}},[s._v("#")]),s._v(" 管理")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("相关 API ：")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("GET  /                    "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询集群的基本信息")]),s._v("\nGET  /_cluster/stats      "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询集群的统计信息")]),s._v("\nGET  /_cluster/health     "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询集群的健康状态")]),s._v("\nGET  /_cluster/settings   "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询集群的配置")]),s._v("\n\nGET  /_nodes              "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询所有节点的配置")]),s._v("\nGET  /_nodes/stats        "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询所有节点的状态")]),s._v("\n")])])])]),s._v(" "),t("li",[t("p",[s._v("例：查询所有节点")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@CentOS ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# curl 127.0.0.1:9200/_cat/nodes?v")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ip")]),s._v("         heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("10.0")]),s._v(".0.1             "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("11")]),s._v("          "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("85")]),s._v("   "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("    "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.06")]),s._v("    "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.09")]),s._v("     "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.18")]),s._v(" dilm      *      node-1\n")])])])]),s._v(" "),t("li",[t("p",[s._v("例：查询集群的基本信息")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@CentOS ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# curl 127.0.0.1:9200")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"name"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"node-1"')]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cluster_name"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cluster-1"')]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cluster_uuid"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cDXF4mIeRqK4Dlj_YmSSoA"')]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"version"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"number"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"7.10.0"')]),s._v(",\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"build_flavor"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"default"')]),s._v(",\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"build_type"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"tar"')]),s._v(",\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"build_hash"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"7f634e9f44834fbc12724506cc1da681b0c3b1e3"')]),s._v(",\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"build_date"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2020-02-06T00:09:00.449973Z"')]),s._v(",\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"build_snapshot"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" false,\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"lucene_version"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"8.4.0"')]),s._v(",\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"minimum_wire_compatibility_version"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6.8.0"')]),s._v(",\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"minimum_index_compatibility_version"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6.0.0-beta1"')]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"tagline"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"You Know, for Search"')]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])])]),s._v(" "),t("li",[t("p",[s._v("例：查询集群的健康状态")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@CentOS ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# curl 127.0.0.1:9200/_cluster/health?pretty")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cluster_name"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cluster-1"')]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"status"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"yellow"')]),s._v(",            "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 集群的状态")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"timed_out"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" false,\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"number_of_nodes"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(",          "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 节点的数量")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"number_of_data_nodes"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(",     "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 数据节点的数量")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"active_shards"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v(",            "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 可用分片的数量，包括主分片、副分片，不包括未分配的分片")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"active_primary_shards"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v(",    "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 可用主分片的数量")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"relocating_shards"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"initializing_shards"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"unassigned_shards"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v(",        "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 未分配的分片的数量")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"delayed_unassigned_shards"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"number_of_pending_tasks"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"number_of_in_flight_fetch"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"task_max_waiting_in_queue_millis"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(",\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"active_shards_percent_as_number"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("50.0")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])]),t("ul",[t("li",[s._v("status 的可能取值：\n"),t("ul",[t("li",[s._v("green ：所有主分片、副分片都可用。")]),s._v(" "),t("li",[s._v("yellow ：所有主分片都可用，但存在不可用的副分片。")]),s._v(" "),t("li",[s._v("red ：存在不可用的主分片。")])])])])]),s._v(" "),t("li",[t("p",[s._v("例：查询所有索引的状态")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@CentOS ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# curl 127.0.0.1:9200/_cat/indices?v")]),s._v("\nhealth status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size\nyellow "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("open")]),s._v("   class    aeUT1h6QS8-vSAzoEclR3Q   "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("   "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("          "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("            "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("       283b           283b\nyellow "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("open")]),s._v("   test_log EaDptPz9TtqGk-CNL-yTMg   "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("   "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("          "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("            "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("      "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v(".4kb          "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v(".4kb\n")])])]),t("ul",[t("li",[s._v("health 表示分片的状态，status 表示索引是否被关闭。")]),s._v(" "),t("li",[s._v("这里索引的 health 为 yellow ，是因为只部署了单实例 ES ，而副分片不能被分配到主分片所在节点上，导致一直处于未分配状态。")])])])]),s._v(" "),t("h2",{attrs:{id:"远程集群"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#远程集群"}},[s._v("#")]),s._v(" 远程集群")]),s._v(" "),t("ul",[t("li",[s._v("ES 支持给本地集群添加多个远程集群（remote cluster）。\n"),t("ul",[t("li",[s._v("这些集群之间会独立工作，独立存储自己的数据。")]),s._v(" "),t("li",[s._v("这是单向连接，本地集群故障时不会影响远程集群，但远程集群故障时可能影响本地集群。")])])]),s._v(" "),t("li",[s._v("用户可以跨集群搜索，同时查询本地集群和远程集群，从而实现 ES 的横向扩容。\n"),t("ul",[t("li",[s._v("原理：\n"),t("ol",[t("li",[s._v("用户将跨集群的查询请求发送到本地集群。")]),s._v(" "),t("li",[s._v("本地集群验证用户的身份，如果有效，则将请求及用户的身份转发到远程集群。")]),s._v(" "),t("li",[s._v("远程集群验证用户的身份，如果有权访问指定的数据，则执行查询，然后将查询结果返回给本地集群。")]),s._v(" "),t("li",[s._v("本地集群将远程集群的查询结果返回给用户。")])])]),s._v(" "),t("li",[s._v("本地集群使用的 SSL 公钥必须受到远程集群的信任。")]),s._v(" "),t("li",[s._v("用户账号必须在本地集群、远程集群都存在。")])])])]),s._v(" "),t("h3",{attrs:{id:"配置-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置-2"}},[s._v("#")]),s._v(" 配置")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("可以在 elasticsearch.yml 文件中配置远程集群，但这只会对当前节点生效。如下：")]),s._v(" "),t("div",{staticClass:"language-yml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cluster")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("remote")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cluster_1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("                                  "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 添加一个远程集群，该名称不必与目标集群的实际名称一致")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seeds")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n        "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 10.0.0.1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9300")]),s._v("                         "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 远程集群中的节点列表")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cluster_2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("                                  "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 添加另一个远程集群")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("seeds")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n        "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 10.0.0.2"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("9300")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# transport.initial_connect_timeout: 30s  # 启动当前节点时，第一次连接到远程集群的超时时间")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# transport.ping_schedule: 30s            # 每隔多久检查与远程集群的连接是否正常正常，默认为 -1 ，即不检查")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# transport.compress: true                # 将请求压缩之后再发送到远程集群")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# skip_unavailable: false                 # 跨集群搜索时是否跳过不可用集群")]),s._v("\n")])])])]),s._v(" "),t("li",[t("p",[s._v("也可以通过 API 添加远程集群，上传其配置信息：")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("PUT /_cluster/settings\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"persistent"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cluster"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"remote"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n        "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cluster_1"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n          "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seeds"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("            "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# 设置 "seeds": null 则会删除该远程集群')]),s._v("\n              "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1:9300"')]),s._v("\n          "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n        "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(",\n        "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"cluster_2"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n          "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"seeds"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("\n              "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"10.0.0.2:9300"')]),s._v("\n          "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n        "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n      "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])])]),s._v(" "),t("li",[t("p",[s._v("相关 API ：")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("GET  /_cluster/settings    "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询集群的配置，包括远程集群")]),s._v("\nGET  /_remote/info         "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询远程集群的状态")]),s._v("\n")])])])])]),s._v(" "),t("h3",{attrs:{id:"查询"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#查询"}},[s._v("#")]),s._v(" 查询")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("用 "),t("code",[s._v("<cluster_name>:<index_name>")]),s._v(" 的格式，即可查询远程集群的索引：")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("GET  /test_log/_search                "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 不指定集群名，则默认查询本地集群")]),s._v("\nGET  /cluster_1:test_log/_search      "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 可以指定一个集群进行查询")]),s._v("\nGET  /test_log,cluster_1:test_log,cluster_2:test_log/_search    "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 可以指定多个集群进行查询")]),s._v("\n")])])])]),s._v(" "),t("li",[t("p",[s._v("可创建指向远程集群的 index pattern ，例如：")]),s._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("cluster_1:test_log\n")])])])])])])}),[],!1,null,null,null);t.default=e.exports}}]);