概述
Elasticsearch 是分布式搜索和分析引擎,其核心是 Elastic Stack。Logstash 和 Beats 有助于收集、聚合和 丰富的数据并将其存储在 Elasticsearch 中。Kibana 使能够 以交互方式探索、可视化和共享对数据的见解,并管理 并监控堆栈。
Elasticsearch 为所有类型的数据提供实时搜索和分析。无论具有结构化或非结构化文本、数值数据或地理空间数据, Elasticsearch 可以以支持快速搜索的方式有效地存储和索引它。 可以远远超越简单的数据检索和聚合信息来发现数据中的趋势和模式。随着数据和查询量的增长, Elasticsearch 的分布式特性部署能够无缝扩展。
Elasticsearch 还提供了速度和灵活性来处理各种数据,如以下操作:
- 向应用程序或网站添加搜索框
- 存储和分析日志、指标和安全事件数据
- 使用机器学习自动对数据的实际行为进行建模时间
- 使用 Elasticsearch 作为存储引擎实现业务工作流自动化
- 使用 Elasticsearch 作为地理区域来管理、集成和分析空间信息 信息系统 (GIS)
- 使用 Elasticsearch 作为生物信息学研究工具存储和处理遗传数据
elasticsearch作为中间件,在百胜内使用场景主要为配置菜单、应用日志、订单派送信息等等。还有一种使用场景就是日志中心,用于收录消费者应用的日志(参考“百胜日志中心”百胜日志中心ELK使用指南 )。
为了部署和运维工作, 指导开发人员正确使用。本文档面向对象为:公司所有elasticsearch相关的IT架构与设计工作,开发,运维和DBA人员。
以下内容都是基于ES7.6.2版本撰写,ES各个版本之间特别是大版本之间的差距比较大,如果使用的低于或高于7.6.2的请酌情参考。
es在版本 7.10.2 时,OpenSearch 项目分叉了 Elasticsearch 代码库,并在自己的代码库上进行了重要的工作,清理了所有非 Apache 许可的代码。从7.11版本开始,Elasticsearch的许可证从Apache 2.0更改为Server Side Public License (SSPL)。这个更改可能会影响到一些希望在商业环境中使用Elasticsearch的用户。为了规避在商用环境中使用Elasticsearch带来的许可证风险,统一使用elasticsearch的7.6.2版本,对于超过7.10.2的ES集群建议迁移到7.6.2版本中。
一、elasticsearch介绍
-
简介
Elasticsearch(文中简称 ES)是分布式全文搜索引擎,产品提供高可用、易扩展以及近实时的搜索能力,广泛应用于数据存储、搜索和实时分析。很多服务的可用性对 ES 重度依赖。因此,保障 ES 自身可用性,是实现服务高可用的重中之重。用Java编写的开源分布式文档存储和搜索引擎,可以用于near real-time存储和数据检索。
一个近实时的 分布式 全文搜索和分析引擎,底层是基于lucene,提供友好的restful api。用作全文检索,一定会有些常用命令。
-
相关概念
| 序号 | 名称 | 说明 |
|---|---|---|
| 1 | number_of_shards | 每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。 |
| 2 | number_of_replicas | 每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。 |
| 3 | index | 索引是ES的一个逻辑存储,对应关系型数据库中的库,ES可以把索引数据存放到服务器中,也可以sharding(分片)后存储到多台服务器上。每个索引有一个或多个分片,每个分片可以有多个副本。 |
| 4 | 类型(type) | ES中,一个索引可以存储多个用于不同用途的对象,可以通过类型来区分索引中的不同对象,对应关系型数据库中表的概念。但是在ES6.0开始,类型的概念被废弃,ES7中将它完全删除。 |
| 5 | 文档(document) | 存储在ES中的主要实体叫文档,可以理解为关系型数据库中表的一行数据记录。 |
| 6 | 映射(mapping) | mapping是对索引库中的索引字段及其数据类型进行定义,类似于关系型数据库中的表结构。ES默认动态创建索引和索引类型的mapping,这就像是关系型数据中的,无需定义表机构,更不用指定字段的数据类型。 |
| 7 | 字段(field) | 文档里面的最小单位,是JSON对象的字段,相当于关系数据库的Column |
| 8 | 集群(cluster) | 一个ES集群由多个节点(node)组成, 每个集群都有一个共同的集群名称最为标识。 |
| 9 | 节点(node) | 一个es实例即为一个节点,一台机器可以有多个节点,正常使用下每个实例都应该会部署在不同的机器上。 |
| 10 | 分片(shard) | 一个分片本身就是一个完整的搜索引擎,文档存储在分片中,而分片会被分配到集群中的各个节点中,随着集群的扩大和缩小,ES会自动的将分片在节点之间进行迁移,以保证集群能保持一种平衡。 |
| 11 | 副本(replica) | 副本(replica shard)就是shard的冗余备份。如1个副本,表示1个主分片1个从分片;0副本,表示只有1个主分片。 |
| 12 | 集群状态 | 三种状态:green、yellow、red。green:所有的主分片和副本分片都正常运行 ;yellow: 所有的主分片都正常运行,但不是所有的副本分片都正常运行red: 有主分片没有正常运行 |
| 13 | 分词Analyzer | 默认安装 IK Analyzer 分词插件 |
| 14 | template | Index 模板,用于定义index的settings、mapping等 |
| 15 | DSL | 用来查询读取数据的一种语法 |
| 16 | Index patterns | 查询index的时候的视图,在使用kibana discovery的时候,必须要有index patterns。 |
-
使用场景
Elasticsearch是一种内存型的高性能key-value NoSQL存储,其技术设计基于如下出发点:
- 读写请求响应速度高于传统关系型数据库
- 适合高并发场景
- 对服务可用性的保障>对数据完整性的保障
- 查询效率快速
- 高可用性
因此,elasticsearch在百胜业务模式中的一些常见适用场景如下:
A. 非结构化的数据查询
B. 海量订单中快速定位到某一条订单信息。
C. 日志数据分析,filebeat采集日志,logstash或者flink转换处理日志,ES进行复杂的数据分析
D. 菜单的快速搜索功能场景
二、技术规范
基本规范
1.1、默认安装7.6.2版本
1.2、默认插件:analysis-ik 7.6.2
1.3、如果有同义词、中文分词器等额外需求,请明确提出,默认无。
1.4、默认没有权限认证,如有需要另外说明
1.5、默认端口9200(HTTP端口)和9300(TCP端口)
1.6、ES服务数据盘挂载在/data下,数据盘使用SSD
1.7、 JVM heap大小设置主机内存的50%,最大支持32G
1.8、 GC模式默认使用G1
1.9、 默认安装的es不带kibana,如有需要单独说明
2、elasticsearch节点角色
2.1、Master node:主节点,计算密集型。
2.2、Data node:用户存数据。数据密集型。
2.3、ingest node:数据前置处理转换节点,支持pipeline管道设置,可以使用ingest对数据进行过滤、转换等操作,类似logstash中filter的作用。 默认情况下,所有节点都启用Ingest,因此任何节点都可以处理Ingest任务。 计算密集型。同时与kibana 中monitor 监控有关,如果安装kinbana,则此角色一定要打开。
2.3、Coordinate node:协调节点,应用查询ES时的连接节点,用于分发查询请求。计算密集型。
3、架构规范
ES需要分布式部署,分布式的最少节点数量为3。(配置规格请参考“第三章”)
如果项目预算足够以及对ES的性能有要求,请参考如下5点和“第三章”,综合评估选择适合的套餐:
3.1、master节点
ES集群的管理节点和各个节点之间相互通讯的调度节点。master节点的配置套餐如:8C/8G/50GB 最少3台节点起。
3.2、data数据节点
对存储磁盘空间要求比较高。
ES磁盘计算方式:磁盘实际大小 * 节点数量n
ES占用的实际空间计算公式:实际空间 = 源数据 *( 1 + 副本数量)/(1 + 数据膨胀) / (1 - 内部任务开销)/(1-操作系统预留)≈ 源数据 * (1 + 副本数量) * 1.45
3.3、协调节点
接收查询请求后,会把查询子句发布到其他的节点,然后合并各个节点返回的查询结果,最后返回一个完整的数据集给用户。对CPU、内存的要求比较高。16C/32G/50GB 最少2台节点起。
3.4、分片shard设计
· 分片数量建议为data节点数的整数倍
· 单个分片数保持在10GB~50GB之间
· 分片数量不容易调整,必须一次定型
· 单个shard的文档个数不能超过21亿左右(Integer.MAX_VALUE - 128)
3.5、副本数replica,建议为1,后期可以动态调整。
3.6、路径要求规范:
- 应用路径:
/data/Elasticsearch/ - 配置路径:
/etc/Elasticsearch/elasticsearch.yml - 数据路径:
/data/Elasticsearch/data - 日志路径:
/data/Elasticsearch/log - 系统服务配置文件:
/usr/lib/systemd/system/elasticsearch.service
3.7、备份要求规范:
默认无备份,如有需另外说明。
3.8、集群管理规范:
- 集群规模和配置:根据数据量和查询负载合理配置节点数量和硬件资源。
- 负载均衡:确保集群中的负载均匀分配,避免某单一节点过载。
- 监控与日志:定期监控集群的健康状况和性能指标,如 CPU、内存、磁盘 I/O 和响应时间。使用 Elasticsearch 的监控工具如 Elastic Stack 的 Kibana
4、部署架构图:
4.1 常规架构
4.2 读写分离数据架构
4.3 多集群高可用架构:
4.4 Hot & Warm 或者 Cold架构:
三、资源规格
elasticsearch资源配置以套餐的形式提供。
| 套餐名称 | 配置规格 | 平均写入条数/s | 冷数据平均读取条数/s | 总容量(数据+副本) |
|---|---|---|---|---|
| es.micro.100g.v1 | 3all[8C/16G/100G] | 9900 | 300 | 50G |
| es.small.500g.v1 | 3all[8C/16G/500G] | 9900 | 300 | 600G |
| es.medium.1t.v1 | 3all[16C/32G/500G] | 15000 | 2550 | 1T |
| es.medium.1tp.v1 | 3master[8C/16G],2coord[16C/32G],3data[16C/32G/500G] | 30000 | 5100 | 1T |
| es.storage.2t.v1 | 3master[8C/16G],3data[32C/64G/1T] | 26000 | 3000 | 2T |
| es.performance.2t.v1 | 3master[8C/16G],4coord[16C/32G],3data[32C/64G/1T] | 52000 | 6000 | 2T |
| es.storage.4t.v1 | 3master[8C/16G],5data[32C/64G/1T] | 65000 | 7500 | 4T |
| es.performance.4t.v1 | 3master[8C/16G],4coord[16C/32G],5data[32C/64G/1T] | 130000 | 15000 | 4T |
| es.large.10t.v1 | 3master[8C/16G],4coord[16C/32G],7data[32C/64G/2T] | 182000 | 21000 | 10T |
| es.large.30t.v1 | 3master[8C/16G],4coord[16C/32G],17data[32C/64G/2T] | 442000 | 51000 | 30T |
四、使用规范
-
硬件资源分配
To do
- 为每个 Elasticsearch 节点分配足够的内存。建议至少为系统保留 2 - 4GB 的内存,其余内存分配给 Elasticsearch。一般来说,生产环境中每个节点的内存可根据数据量和查询负载在 16GB - 64GB 之间。
- 设置合适的堆内存大小(
ES_HEAP_SIZE环境变量),通常不超过系统内存的 50%,以避免内存交换和垃圾回收问题。例如,如果节点有 32GB 内存,可将堆内存设置为 16GB。 - 根据预期的查询和索引负载来选择合适的 CPU 核心数。对于高并发查询场景,更多的核心数有助于提高性能。一般建议每个节点至少有 4 个核心。
- 考虑数据的增长趋势,预留足够的磁盘空间,避免磁盘空间不足导致集群性能下降或故障。
- 确保 Elasticsearch 集群节点之间的网络带宽足够高,以支持数据的快速传输和复制。推荐使用千兆以太网或更高带宽的网络。
- 配置节点之间的通信端口(默认为 9300),确保防火墙规则允许节点之间的通信。
- 为客户端访问 Elasticsearch 集群(通常通过 HTTP 端口 9200)配置合适的网络访问控制。建议只允许授权的客户端访问集群,以保障数据安全。
- 禁用Swap , Swap交换会导致JVM堆内存被换出到磁盘,严重影响性能,应尽可能禁用Swap。
-
集群拓扑
To do
- 大集群建议独立部署主节点(Master)、数据节点(Data)和协调节点(Coordinating),如集群节点数量超过20台机器,数据量达到TB级别,且节点CPU使用率经常达到50%时。
- 主节点负责集群的管理和协调,应具有稳定的网络连接和足够的资源。建议为高可用性配置多个主节点(通常 3 个或更多),避免单点故障。
- 将节点分布在不同的物理服务器或机架上,以提高集群的容错能力。避免将所有节点集中在一个故障域内,如同一台服务器或同一个网络交换机下
-
index规范
-
To do
- 每个index都配置一个Alias,并通过Alias访问Index
- 必须手动指定分片数,每个索引定义的时候,必须明确给出【number_of_shards】与【number_of_replicas】,数据量不大的情况下,前者是1,后者是2就好。
- 每个Index Mapping定义时,尽可量详细的给出每个field的信息,如type、index、store、format、analyzer等。
- 将无需分词查询的字段类型设为keyword。
- 索引受文件系统的限制。仅可能为小写字母,不能下划线开头。
- 类型名称可以包括除了null的任何字符,不能以下划线开头。7.0版本之后不再支持类型,默认为_doc.
- 路由命名也是除了空的任何字符。问题是多个路由值传入查询字符串,使用逗号分隔。如果路由值包含逗号,会造成路由值解析错误。
- integer 能搞定的,就不要用 long、float 或 double。
- 对数据稳定性要求低于写入性能的index,建议关闭副本数。副本数越多,写index效率越低。
- text类型会加大对内存的占用,如果有需求使用,建议使用keyword
- 通过 API 或配置管理工具来创建索引,确保创建过程的可重复性和自动化。
- 在创建索引时,设置合适的副本数和分片数。副本数决定了数据的冗余程度和查询负载的分布能力,分片数影响索引的扩展性和数据分布。建议设置副本数为1
- 当需要增加索引的副本数或分片数时,通过 Elasticsearch 的 API 进行操作,并监控集群的状态以确保操作顺利进行。
- 根据业务需求制定索引数据的保留策略。例如,对于日志数据,可根据日志的时效性设置保留一定天数或一定数据量的索引。
- 定期清理过期的索引,可以使用 Curator 等工具来自动执行索引删除操作。
- 定期对索引进行优化,如合并小的分片、清理无用的文档数据等。这可以提高索引的性能和磁盘空间利用率。
- 监控索引的大小、文档数量和查询性能,根据监控结果及时调整索引的配置和进行优化操作。
-
Not to do
- 每个index禁用【_all】字段。
- 禁用【_type】这个概念,每个Index默认只有【doc】这个type。
- 代码中禁止使用WriteRequest.RefreshPolicy.IMMEDIATE 策略
- 字段内禁止json嵌套(如有客制化,联系DBA单独设置object类型)。
- 百胜elasticsearch的字段数量不能超过900
- 索引名称字符长度不要超过32位,字段名称字符长度不要超过32位。
- 字段名称禁止使用_开始的索引名称,默认Elasticsearch内部使用的字段名称使用_开始。
- Elasticsearch的索引命名禁止使用.开始的索引名称,默认Elasticsearch内部或者stack相关组件使用.开始的索引名称。
- 尽量避免频繁修改索引的映射,因为这可能导致索引的重新构建和数据的迁移。如果必须更新映射,要在低峰期进行,并充分测试对现有数据和查询的影响。
- 索引字段数量建议不要超过 100
-
分片(shard)容量
To do
- 非日志型(搜索型、线上业务型)的 单个shard 容量在 40GB以内
- 日志型的 单个
shard容量在 100GB 以内
-
数据操作规范
To do
- 尽量使用批量插入(
_bulkAPI)来提高数据插入的效率,减少网络开销。批量大小应根据数据大小和节点性能进行调整,一般建议每次批量插入 1000 - 5000 条文档。 - 在多线程或分布式环境下插入数据时,要注意数据的一致性。可以使用 Elasticsearch 的版本控制机制或自定义的逻辑来避免数据冲突
- 使用更新 API(
_update)来更新文档,尽量避免全量更新文档,以减少索引的负载。 - 在更新数据时,注意更新操作对索引性能的影响,避免在高负载期间进行大量的更新操作。
- 对于删除文档,使用删除 API(
_delete)。如果需要删除大量文档,可以使用查询删除(_delete_by_query),但要谨慎使用,因为这可能会对集群性能产生较大影响。
-
检索原则
To do
- 尽量设计简单、高效的查询。避免使用过于复杂的嵌套查询和多条件联合查询,这可能会导致查询性能下降。
- 对于复杂的查询需求,可以考虑在应用层进行数据预处理或使用 Elasticsearch 的聚合功能来简化查询。
- 合理利用 Elasticsearch 的查询缓存机制。对于频繁执行的查询,可以通过设置合适的缓存参数来提高查询性能。但要注意缓存的有效性和内存使用情况。
可以参考“百胜日志中心ELK使用指南”:百胜日志中心ELK使用指南
Not to do
- 避免查询深度过大(如查询大量的页面),这可能会导致性能问题。可以使用滚动查询(
scrollAPI)或游标查询(search_after)等机制来处理大量数据的分页查询。 - 聚合查询避免使用过多嵌套,聚合查询的中间结果和最终结果都会在内存中进行,嵌套过多,会导致内存耗尽。
-
优化原则
-
To do
- 合理设置对index做生存周期策略
- jvm heap使用主机内存的50%
- 单个shard大小控制在10G-30G之间
- 如果有协调节点,查询的连接全走协调节点
- 一定要做好index生存周期配置,比如定期清理任务。
-
Not to do
- 禁止使用大聚合,ES计算都是在JVM内存中完成。
- 尽量减少模糊查询
- 拒绝深度分页
- 禁止分页查询后不关闭
-
其他规范
To do
- 默认不记录慢查询,建议配置慢日志记录
- 部署 Elasticsearch 的新实例时,默认情况下实例没有用户、密码或访问控制,如需账号密码请提前说明。
五、监控告警
-
监控维度
· query load
· query latency
· fetch latency
· refresh
· flush
· 节点三大件(CPU、内存、磁盘)
· GC
· JVM使用率
· ES写入速率
· ES查询速率
· 分片健康度
-
监控告警
告警渠道:飞书群
-
服务等级
(To be continued)
-
监控屏注解
| 大屏面板 | 面板参数 | 参数/面板说明 |
|---|---|---|
| Cluster Status面板 | - | 整体集群状态,green、yellow或者red |
| 集群节点数量面板 | - | 集群全部节点数量和存活节点数量 |
| 分片相关面板 | 分片总数 | 集群中总分片使用数量 |
| 主分片数 | 集群中主分片使用数量 | |
| 初始化分片 | 集群中正在初始化分片的数量 | |
| 重定位分片 | 集群中正在重新分配分片的数量 | |
| 未分配分片 | 集群中未分配分片的数量 | |
| 延迟分片 | 集群中存在延迟分片的数量 | |
| ES集群总容量面板 | - | Elasticsearch集群可用的总容量 |
| indices总量面板 | - | Elasticsearch集群已使用的索引总量 |
| 内存总量(node)面板 | - | Elasticsearch集群各节点可使用的内存总量 |
| 磁盘使用率面板 | - | Elasticsearch集群各节点的磁盘使用率情况 |
| 磁盘使用量面板 | - | Elasticsearch集群各节点的磁盘使用数据量使用情况 |
| 节点状态面板 | - | Elasticsearch各节点状态,1表示正常 |
| CPU使用率(node)面板 | - | Elasticsearch各节点CPU使用率情况 |
| CPU总百分比(ES)面板 | - | Elasticsearch进程CPU使用率情况 |
| node_load1面板 | - | Elasticsearch集群node节点的负载情况 |
| 已使用内存%面板 | - | Elasticsearch集群各节点的内存使用情况 |
| network (IO)面板 | - | Elasticsearch集群各节点的网络使用情况 |
| 句柄数使用量面板 | - | Elasticsearch集群各节点的句柄数使用情况 |
| 节点索引大小面板 | - | Elasticsearch集群各节点索引数据量大小情况 |
| 节点文档数 面板 | - | Elasticsearch集群各节点的文档数量 |
| 平均查询耗时(fetch) 面板 | - | Elasticsearch集群fetch查询平均耗时 |
| 集群平均查询耗时(query)面板 | - | Elasticsearch集群query查询平均耗时 |
| JVM内存使用率 面板 | - | Elasticsearch集群各节点的JVM内存使用率情况 |
| qps 面板 | - | Elasticsearch集群的每秒查询量情况 |
| IO写入速度面板 | - | elasticsearch的IO写入操作速率 |
| 任务队列(per node)面板 | - | 服务器已分配的文件描述符数量 |
| 任务队列面板 | - | 当前存在的任务队列 |
| Query time 面板 | - | Elasticsearch索引搜索查询所花费的时间,单位是秒 |
| Fetch time 面板 | - | Elasticsearch执行搜索操作中的抓取(fetch)阶段所花费的时间总和,单位是秒。抓取阶段是搜索过程中的一个重要部分,涉及从索引的各个分片中检索数据并将其汇总 |
| GC 面板 | - | Elasticsearch节点上JVM的垃圾回收操作所消耗的时间瞬时变化率 |
-
metrics端口
命令示例: /usr/bin/Elasticsearch_exporter --es.uri=http://172.16.70.186:9200 --es.timeout=30s
端口: 9114
路由: /metrics
-
常用监控命令
- 查看集群健康情况
GET _cat/health?v
- 查看集群上整个索引 或 指定索引 统计信息
GET _cat/indices?v
- 查看集群整体分片 或 指定索引分片信息
GET _cat/shards?v
- 查看所有节点 或 主节点 信息
GET _cat/nodes?v
- 查看索引名称和别名
GET _cat/aliases?v
- 查看分片部署信息(包括分片所占磁盘大小等)
GET _cat/allocation?v
- 查看各个节点线程池的情况
GET _cat/thread_pool?v
- 输出集群中正在执行的任务
GET _cat/pending_tasks?v
六、配置文件模板
-
单节点
network.host: ["hostip","127.0.0.1"]
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/log
path.repo: ["/data/elasticsearch/backup"]
http.port: 9200
http.enabled: true
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
bootstrap.system_call_filter: false
discovery.seed_hosts: ["hostip"]
cluster.initial_master_nodes: ["hostip"]
2. ## 集群
以下配置模板根据elasticsearch6.7.2进行解释说明
主要区分master和data节点。
2.1 master node
cluster.name: phd-selection-wga
node.name: hostname
node.master: true
node.data: true
node.ingest: true
node.ml: true
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/log
path.repo: ["/data/elasticsearch/backup"]
network.host: sunip
http.port: 9200
# 这个参数设置了一个节点在认为自己是一个集群的一部分时,需要看到的最少的主节点数量。这可以防止脑裂
discovery.zen.minimum_master_nodes: 2
# 这个参数设置了节点在认为其他节点已经离线之前,需要等待的时间。
discovery.zen.ping_timeout: 3s
discovery.seed_hosts: ["172.21.36.152","172.21.36.155","172.21.36.156","172.21.36.166","172.21.36.171","172.21.36.172"]
cluster.initial_master_nodes: ["172.21.36.152","172.21.36.155","172.21.36.156"]
2.2 data node
cluster.name: phd-selection-wga
node.name: hostname
node.master: false
node.data: true
node.ingest: true
node.ml: true
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/log
path.repo: ["/data/elasticsearch/backup"]
network.host: hostip
http.port: 9200
# 这个参数设置了一个节点在认为自己是一个集群的一部分时,需要看到的最少的主节点数量。这可以防止脑裂
discovery.zen.minimum_master_nodes: 2
# 这个参数设置了节点在认为其他节点已经离线之前,需要等待的时间。
discovery.zen.ping_timeout: 3s
discovery.seed_hosts: ["172.21.36.152","172.21.36.155","172.21.36.156","172.21.36.166","172.21.36.171","172.21.36.172"]
cluster.initial_master_nodes: ["172.21.36.152","172.21.36.155","172.21.36.156"]
2.3 coord node
cluster.name: phd-selection-wga
node.name: hostname
node.master: false
node.data: false
node.ingest: true
node.ml: false
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/log
path.repo: ["/data/elasticsearch/backup"]
network.host: hostip
http.port: 9200
# 这个参数设置了一个节点在认为自己是一个集群的一部分时,需要看到的最少的主节点数量。这可以防止脑裂
discovery.zen.minimum_master_nodes: 2
# 这个参数设置了节点在认为其他节点已经离线之前,需要等待的时间。
discovery.zen.ping_timeout: 3s
discovery.seed_hosts: ["172.21.36.152","172.21.36.155","172.21.36.156","172.21.36.166","172.21.36.171","172.21.36.172"]
cluster.initial_master_nodes: ["172.21.36.152","172.21.36.155","172.21.36.156"]
3. ## jvm配置
es7.6.2默认为CMS回收器,百胜ES默认修改为G1
## GC configuration
# 注释 CMS部分的参数
#-XX:+UseConcMarkSweepGC
#-XX:CMSInitiatingOccupancyFraction=75
#-XX:+UseCMSInitiatingOccupancyOnly
# 开启G1的参数
-XX:MetaspaceSize=512m
-XX:MaxMetaspaceSize=512m
-XX:+UseG1GC
-XX:G1ReservePercent=25
-XX:InitiatingHeapOccupancyPercent=30
#设置GC日志的相关参数,匹配9以上的JDK环境
9-:-Xlog:gc*,gc+age=trace,safepoint:file=/data/elasticsearch/log/gc.log:utctime,pid,tags:filecount=32,filesize=64m
附录
-
elasticsearch命令清单
1.1 CURL方式
ES的操作支持使用curl方式调用,查询用GET,创建用POST,更新或创建用PUT,删除用DELETE。
在ES中,如果不确定document的ID(documents具体含义见下),那么直接POST对应uri( “POST /website/blog” ),ES可以自己生成不会发生碰撞的UUID;如果确定document的ID,比如 “PUT /website/blog/123”,那么执行创建或修改(修改时_version版本号提高1)
相关ES操作可以参考:
1.2 DSL方式
参考
-
ES 核心参数默认值:
| 序号 | 参数名 | 默认数值 |
|---|---|---|
| 1 | max_shards_per_node | 3000 |
| 2 | transport.tcp.connect_timeout | 30s |
| 3 | cluster.routing.allocation.disk.watermark.high | 90% |
| 4 | cluster.routing.allocation.disk.watermark.low | 85% |
| 5 | cluster.routing.rebalance.enable | all |
| 6 | cluster.routing.allocation.enable | all |
| 7 | cluster.routing.allocation.allow_rebalance | indices_all_active |
-
ES常用参数
| 分类 | 参数使用示例 | 说明 |
|---|---|---|
| Cluster集群相关配置 | cluster.name: my-application | 配置集群名称,由多个es实例组成的集群,有一个共同的名称。 |
| transport.tcp.port: 9300 | 集群端口设置。 | |
| discovery.seed_hosts: ["host1", "host2"] | 设置节点发现时联系的主机列表,用于集群的初始发现和自动节点加入 | |
| cluster.routing.allocation.same_shard.host:true | 防止同一个shard的主副本存在同一个物理机上。 | |
| cluster.routing.allocation.node_initial_primaries_recoveries: 4 | 初始化数据恢复时,并发恢复线程的个数,默认是4个。 | |
| cluster.routing.allocation.node_concurrent_recoveries: 4 | 添加删除节点或者负载均衡时并发恢复线程的个数。默认是4个。 | |
| cluster.fault_detection.follower_check.interval:10s | Master与其他node心跳检测的周期 | |
| cluster.fault_detection.leader_check.interval:10s | node检测Master是否存活的周期 | |
| cluster.fault_detection.follower_check.timeout:60s | Master与其他node心跳检测的超时时间 | |
| cluster.fault_detection.leader_check.timeout:60s | node检测Master是否存活的超时时间 | |
| cluster.follower_lag.timeout:300s | 节点滞后更新clusterstate的超时时间 | |
| cluster.publish.timeout:90s | Master等待cluster state发布完成的超时时间 | |
| Node节点相关配置 | node.name: node-1 | 节点名称配置,一个es实例其实是一个es进程,在集群中被称为节点。如果一个服务器上配置集群,各节点的名称不能重复。 |
| node.master: true | 该节点是否有资格成为主节点,默认为true | |
| node.data: true | 设置节点是否存储数据 | |
| index.number_of_shards: 5 | 设置默认主分片的个数,默认为5片,需要说明的是,主分片一经分配则无法更改 | |
| index.number_of_replicas: 1 | 设置默认复制分片的个数,默认一个主分片对应一个复制分片,需要说明的是,复制分片可以手动调整 | |
| indices.recovery.max_size_per_ser: 0 | 设置数据恢复时限制的带宽,默认0及不限制 | |
| indices.recovery.concurrent_streams: 5 | 设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5 | |
| indices.recovery.max_size_per_ser: 0 | 设置数据恢复时限制的带宽,默认0及不限制 | |
| indices.recovery.concurrent_streams: 5 | 设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5 | |
| Paths 存储路径配置 | path.data: /path/to/data | 存储数据路径设置,多个路径以英文状态的逗号分隔,默认根目录下的conf目录。 path.data: /path/to/data1,/path/to/data1 |
| path.work: /path/to/work | 设置临时文件存储路径,默认是es目录下的work目录。 | |
| path.logs: /path/to/logs | 日志文件路径,默认为根目录下的logs目录。 | |
| path.logs: /path/to/logs | 设置日志文件的存储路径,默认是es目录下的logs目录。 | |
| path.plugins: /path/to/plugins | 设置插件的存放路径,默认是es目录下的plugins目录。 | |
| Network相关配置 | network.host: 192.168.0.1 | 为es实例绑定特定的IP地址。 |
| network.bind_host: 192.168.0.1 | 设置绑定的ip地址,ipv4或ipv6都可以 | |
| network.publish_host: 192.168.0.1 | 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址 | |
| http.port: 9200 | 为es实例设置特定的端口,默认为9200端口。 | |
| Discovery相关配置 | discovery.zen.ping.multicast.enabled: true | 设置是否打开多播发现节点,默认是true。 |
| discovery.zen.ping.unicast.hosts: ["host1", "host2"] | 配置es单播发现列表,在es启动时,通过这个列表发现别的es实例,从而加入集群。 | |
| discovery.zen.minimum_master_nodes:2 | 设置是告诉集群有多少个节点有资格成为主节点,一般的规则是集群节点数除以2(向下取整)再加一。比如3个节点集群要设置为2,这个试着是为了防止脑裂问题。 | |
| discovery.zen.ping.timeout: 3s | 设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。 | |
| Memory相关配置 | bootstrap.memory_lock: true | 启动时锁定内存,默认为true,因为当jvm开始swapping时es的效率 会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。 同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过ulimit -l unlimited命令 |
| bootstrap.mlockall: true | 禁止swapping交换。 | |
| Gateway相关配置 | transport.tcp.compress: true | 设置是否压缩tcp传输时的数据。默认是false不压缩。 |
| http.max_content_length: 100mb | 设置内容的最大容量,默认是100mb。 | |
| http.enabled: false | 是否使用http协议对外提供服务。默认为true。 | |
| gateway.recover_after_nodes: 3 | 在完全重新启动集群之后阻塞初始恢复,直到启动N个节点为止 | |
| gateway.recover_after_time: 5m | 设置初始化数据恢复进程的超时时间。默认是5分钟。 | |
| gateway.expected_nodes: 2 | 设置该集群中节点的数量,一旦这N个节点启动,就会立即进行数据恢复。 | |
| Jvm相关配置 | -Xms -Xmx | JVM 的初始堆大小和最大堆大小,为避免堆内存动态扩展时性能损耗,建议初始和最大值一致。通常堆内存大小为机器内存的一半,但不超过 32GB,因为更大的堆会导致垃圾收集延迟增加。 |
| -XX:+UseG1GC | 使用 G1 垃圾收集器可以帮助减少因垃圾收集引起的延迟,特别是在堆内存较大的情况下。Java 8 以上版本中使用 G1GC,尤其是当 JVM 的堆内存配置超过了 8GB。 | |
| -XX:MetaspaceSize=128m | 元空间的初始大小设置为 128MB。元空间用于存放类的元数据,是 Java 8 之后替代永久代的内存区域。 | |
| -XX:MaxMetaspaceSize=256m | 元空间的最大大小设置为 256MB。这是元空间能够使用的最大内存量,防止元空间无限制增长导致的内存溢出 | |
| -XX:MinMetaspaceFreeRatio=20 | (完全垃圾回收)FullGC后,允许元空间空闲内存的最小比例 | |
| -XX:MaxMetaspaceFreeRatio=70 | (完全垃圾回收)FullGC后,允许元空间空闲内存的最大比例 | |
| -XX:G1ReservePercent=25 | 这个参数设置 G1GC 保留的内存百分比作为一个缓冲区来应对在 GC 期间无法预测的内存需求。增加这个百分比可以减少因内存不足而导致的频繁 GC | |
| -XX:InitiatingHeapOccupancyPercent=30 | 默认值45,超过这个值,开始触发全局标记,进而触发mixed gc,这个值表示的是:老年区已使用空间/整个堆空间 | |
| -XX:MaxGCPauseMillis=200 | 设定GC的最大停顿时间为200毫秒(这是一个目标值,JVM会尽力实现) | |
| XX:ParallelGCThreads=8 | 并行垃圾回收时的线程数为 8。这个参数应根据服务器的 CPU 核心数来配置,通常设置为 CPU 核心数的一半 | |
| -XX:ConcGCThreads=2 | 并发垃圾回收的线程数为 2。这是在执行并发标记等操作时使用的线程数,通常小于 ParallelGCThreads。 | |
| -XX:+PrintGCDetails | 启用打印垃圾回收详细信息。有助于分析 GC 性能和问题 | |
| 其他配置 | action.destructive_requires_name: true | 删除索引时需要显式名称,不能匹配通配符批量删除。 |
官方建议不要调整JVM参数,可能会导致集群失衡,默认的JVM参数通过多年验证已经非常均衡
-
部署与技术标准
-
基本数据类型
ES文档的每个字段都至少有一个数据类型,此类型决定了字段值如何被存储以及检索。
| 数据类型 | 类型描述 |
|---|---|
| binary | 接受二进制值作为 Base64 编码的字符串。默认情况下,该字段不存储,也不可搜索,不能包含换行符 \n |
| boolean | 布尔类型,可以接受 true 或 false ,可以使用字符串和直接布尔类型,空字符串为 false |
| keyword | 关键字类型,不进行分词,直接索引,支持模糊、支持精确匹配,支持聚合、排序操作,用于筛选数据。最大支持的长度为——32766 个 UTF-8 类型的字符。 |
| long | 一个有符号的 64 位整数,最小值为-2^63,最大值为 2^63-1。 |
| integer | 一个有符号的 32 位整数,最小值为-2^31,最大值为 2^31-1 |
| short | 一个有符号的 16 位整数,最小值为 -32,768,最大值为 32,767 |
| byte | 一个有符号的 8 位整数,最小值为 -128,最大值为 127 |
| double | 双精度 64 位 IEEE 754 浮点数,限制为有限值。 |
| float | 单精度 32 位 IEEE 754 浮点数,限制为有限值。 |
| half_float | 半精度 16 位 IEEE 754 浮点数,限制为有限值。 |
| scaled_float | 一个浮点数,由 ,由固定缩放因子缩放。longdouble |
| unsigned_long | 一个无符号的 64 位整数,最小值为 0,最大值为 2^64-1 |
| date | 可以是格式化后的日期字符串,也可以是时间戳,例如 2015-01-01, 2015-01-01T12:10:30Z,1420070400001 |
| date_nanos | 支持纳秒的日期格式,在 es 内部是存的长整型 |
| alias | 别名类型 |
| object | 对象类型,是一个 json 对象 |
| flattened | 将对象作为单个字段值存储 |
| nested | 嵌套数据类型,可以看成是一个特殊的对象类型,可以让对象数组独立检索 |
| join | 同一个文档,但具有父子关系的,类似于树 |
| integer_range | 具有最小值和最大值的有符号 32 位整数范围-2^31到2^31-1 |
| float_range | 一系列单精度 32 位 IEEE 754 浮点值。 |
| long_range | 具有最小值和最大值的有符号 64 位整数范围-2^63到2^63-1 |
| double_range | 一系列双精度 64 位 IEEE 754 浮点值。 |
| date_range | 日期值的范围。日期范围支持各种日期格式 通过 Format mapping 参数。无论 使用的格式,日期值被解析为无符号的 64 位整数 表示自 Unix 纪元 (UTC) 以来的毫秒数。不支持包含 date math 表达式的值。 |
| ip_range | 支持 IPv4 或 IPv6(或混合)地址的 IP 值范围。 |
-
常用命令清单
常用命令参考:
| 类别 | 含义 | 命令参考 | 备注 |
|---|---|---|---|
| Elasticsearch实例 | 启动服务 | systemctl start elasticsearch | |
| 查看服务状态 | systemctl status elasticsearch | ||
| 重启服务 | systemctl restart elasticsearch | ||
| 停止服务 | systemctl stop elasticsearch | ||
| _cat系列操作 | 查看节点shard分配整体情况 | GET _cat/allocation | |
| 查看各shard的详细情况 | GET _cat/shards/{index} | ||
| 查看集群节点信息 | GET _cat/nodes | ||
| 查看集群索引信息 | GET _cat/indices/{index} | ||
| 查看集群中各个索引的 Lucene 段信息的 | GET _cat/segments/{index} | ||
| 条件操作符 | 询文档总数 | GET _cat/count/{index} | |
| 查看集群内每个shard的recovery过程 | GET _cat/recovery/{index} | ||
| 查看集群当前状态:红、黄、绿 | GET _cat/health | ||
| 查看当前集群的pending task | GET _cat/pending_tasks | ||
| 查看集群中所有alias信息,路由配置等 | GET _cat/aliases/{alias} | ||
| 查看集群各节点内部不同类型的threadpool的统计信息 | GET _cat/thread_pool | ||
| 查看集群各个节点上的plugin信息 | GET _cat/plugins | ||
| 查看当前集群各个节点的字段占用了多少堆内存 | GET _cat/fielddata/{fields} | ||
| 输出当前正在存在的模板信息 | GET _cat/templates | ||
| _cluster系列 | 查看所有索引的健康状态 | GET _ cluster/health?level=indices | |
| 查看未分配分片的原因 | GET _ cluster/allocation/explain?pretty | ||
| 显示集群系统信息,包括CPU JVM等等 | GET _cluster/stats?pretty=true | ||
| 查询集群堆积的任务 | GET _cluster/pending_tasks?pretty=true | ||
| 修改集群配置命令 | PUT _cluster/settings | ||
| 修改路由配置,重分配分片等 | POST _cluster/reroute | ||
| 索引操作 | 获取索引信息 | GET index/{type}/id | |
| 删除索引 | DELETE index/{type}/id | ||
| 获取索引的mapping信息 | GET index/{type}/_mapping | ||
| 更新索引的mapping | PUT index/{type}/_mapping | ||
| 搜索索引里面的内容 | GET {index}/{type}/_search | ||
| 清空所有索引缓存 | POST /{_index}/_flush | ||
| 关闭索引 | POST /{_index}/_close | ||
| 打开索引 | POST /{_index}/_open | ||
| 任务操作 | 查看当前等待任务 | GET _tasks?detailed=true | |
| 查看所有任务 | GET _tasks | ||
| 查看正在执行的任务 | GET _nodes/hot_threads |
-
核心参数
| 分类 | 参数使用示例 | 说明 |
|---|---|---|
| Cluster集群相关配置 | cluster.name: my-application | 配置集群名称,由多个es实例组成的集群,有一个共同的名称。 |
| transport.tcp.port: 9300 | 集群端口设置。 | |
| cluster.routing.allocation.same_shard.host:true | 防止同一个shard的主副本存在同一个物理机上。 | |
| cluster.routing.allocation.node_initial_primaries_recoveries: 4 | 初始化数据恢复时,并发恢复线程的个数,默认是4个。 | |
| cluster.routing.allocation.node_concurrent_recoveries: 4 | 添加删除节点或者负载均衡时并发恢复线程的个数。默认是4个。 | |
| cluster.fault_detection.follower_check.interval:10s | Master与其他node心跳检测的周期 | |
| cluster.fault_detection.leader_check.interval:10s | node检测Master是否存活的周期 | |
| cluster.fault_detection.follower_check.timeout:60s | Master与其他node心跳检测的超时时间 | |
| cluster.fault_detection.leader_check.timeout:60s | node检测Master是否存活的超时时间 | |
| cluster.follower_lag.timeout:300s | 节点滞后更新clusterstate的超时时间 | |
| cluster.publish.timeout:90s | Master等待cluster state发布完成的超时时间 | |
| Node节点相关配置 | node.name: node-1 | 节点名称配置,一个es实例其实是一个es进程,在集群中被称为节点。如果一个服务器上配置集群,各节点的名称不能重复。 |
| node.master: true | 该节点是否有资格成为主节点,默认为true | |
| node.data: true | 设置节点是否存储数据 | |
| index.number_of_shards: 5 | 设置默认主分片的个数,默认为5片,需要说明的是,主分片一经分配则无法更改 | |
| index.number_of_replicas: 1 | 设置默认复制分片的个数,默认一个主分片对应一个复制分片,需要说明的是,复制分片可以手动调整 | |
| indices.recovery.max_size_per_ser: 0 | 设置数据恢复时限制的带宽,默认0及不限制 | |
| indices.recovery.concurrent_streams: 5 | 设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5 | |
| indices.recovery.max_size_per_ser: 0 | 设置数据恢复时限制的带宽,默认0及不限制 | |
| indices.recovery.concurrent_streams: 5 | 设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5 | |
| Paths 存储路径配置 | path.data: /path/to/data | 存储数据路径设置,多个路径以英文状态的逗号分隔,默认根目录下的conf目录。 path.data: /path/to/data1,/path/to/data1 |
| path.work: /path/to/work | 设置临时文件存储路径,默认是es目录下的work目录。 | |
| path.logs: /path/to/logs | 日志文件路径,默认为根目录下的logs目录。 | |
| path.logs: /path/to/logs | 设置日志文件的存储路径,默认是es目录下的logs目录。 | |
| path.plugins: /path/to/plugins | 设置插件的存放路径,默认是es目录下的plugins目录。 | |
| Network相关配置 | network.host: 192.168.0.1 | 为es实例绑定特定的IP地址。 |
| network.bind_host: 192.168.0.1 | 设置绑定的ip地址,ipv4或ipv6都可以 | |
| network.publish_host: 192.168.0.1 | 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址 | |
| http.port: 9200 | 为es实例设置特定的端口,默认为9200端口。 | |
| Discovery相关配置 | discovery.zen.ping.multicast.enabled: true | 设置是否打开多播发现节点,默认是true。 |
| discovery.zen.ping.unicast.hosts: ["host1", "host2"] | 配置es单播发现列表,在es启动时,通过这个列表发现别的es实例,从而加入集群。 | |
| discovery.zen.minimum_master_nodes:2 | 设置是告诉集群有多少个节点有资格成为主节点,一般的规则是集群节点数除以2(向下取整)再加一。比如3个节点集群要设置为2,这个试着是为了防止脑裂问题。 | |
| discovery.zen.ping.timeout: 3s | 设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。 | |
| Memory相关配置 | bootstrap.memory_lock: true | 启动时锁定内存,默认为true,因为当jvm开始swapping时es的效率 会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。 同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过ulimit -l unlimited命令 |
| bootstrap.mlockall: true | 禁止swapping交换。 | |
| Gateway相关配置 | transport.tcp.compress: true | 设置是否压缩tcp传输时的数据。默认是false不压缩。 |
| http.max_content_length: 100mb | 设置内容的最大容量,默认是100mb。 | |
| http.enabled: false | 是否使用http协议对外提供服务。默认为true。 | |
| gateway.recover_after_nodes: 3 | 在完全重新启动集群之后阻塞初始恢复,直到启动N个节点为止 | |
| gateway.recover_after_time: 5m | 设置初始化数据恢复进程的超时时间。默认是5分钟。 | |
| gateway.expected_nodes: 2 | 设置该集群中节点的数量,一旦这N个节点启动,就会立即进行数据恢复。 | |
| 其他配置 | action.destructive_requires_name: true | 删除索引时需要显式名称,不能匹配通配符批量删除。 |