Elasticsearch 集群安装全解析

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

曾几何时,你是否遇到了 Elasticsearch 服务在本地测试环境用的好好的,但是在测试环境却无法启动? 你是否在启动 Elasticsearch 一会需要调整线程数,一会又要调整文件句柄数,到底…

曾几何时,你是否遇到了 Elasticsearch 服务在本地测试环境用的好好的,但是在测试环境却无法启动? 你是否在启动 Elasticsearch 一会需要调整线程数,一会又要调整文件句柄数,到底还有多少我们不知道的选项需要调整🤣,本文将从 如下方面来分析:

  1. 开发模式和生产模式
  2. 启动前校验系统环境参数
  3. 节点角色划分以及单一职责节点的配置
  4. 简单的冷热节点集群

四个步骤来解析集群安装全过程,让您以后对 Elasticsearch 集群安装做到手里有粮,心里不慌,奥里给!



ES集群安装
1. 开发模式和生产模式

首先 Elasticsearch 的启动模式分为 development 和 production 模式,一般情况下 development 模式以 http.host 和 transport.host 是不是回环地址(127.0.0.0),这种情况不能提供给外部使用以及组建成集群。修改了以上两个参数就是 production 模式,production 模式则需要进行启动前环境验证。

2. 生产模式启动前校验系统环境参数

a) 堆内存大小检查

默认情况下,Elasticsearch 会根据节点的角色和总内存自动调整 JVM 堆大小。如果您手动覆盖默认大小并使用不同的初始和最大堆大小启动 JVM,则 JVM 可能会在系统使用期间调整堆大小时暂停。如果启用 bootstrap.memory_lock,JVM 会在启动时锁定初始堆大小。如果初始堆大小不等于最大堆大小,则某些 JVM 堆在调整大小后可能不会被锁定。为避免这些问题,请使用等于最大堆大小的初始堆大小启动 JVM。

b) 文件描述符检查

文件描述符是用于跟踪打开的“文件”的 Unix 结构。但在 Unix 中,一切都是文件。例如,“文件”可以是物理文件、虚拟文件(例如/proc/loadavg)或网络套接字。Elasticsearch 需要大量文件描述符(例如,每个分片由多个段和其他文件组成,加上与其他节点的连接等)。此引导检查在 OS X 和 Linux 上强制执行。要通过文件描述符检查,您可能必须配置文件描述符。

临时设置:

sudo su  ulimit -n 65535 su elasticsearch

永久设置: 在 /etc/security/limits.conf 文件新增如下内容

elasticsearch  -  nofile  65535

然后重启 Elasticsearch 服务。

c) 内存锁定检查

当 JVM 执行 major garbage collection 时,会把内存中数据交换到 swap 分区,然后再重新加载到内存中,由于 Elasticsearch 本身就是大部分数据在内存中,所以这样一次交换对 Elasticsearch 来说就不够友好了,所以我们通过 bootstrap.memory_lock 可以禁止掉。

d) 检查的最大线程数

Elasticsearch 通过将请求分解为多个阶段并将这些阶段交给不同的线程池执行者来执行请求。Elasticsearch中的各种任务都有不同的线程池执行器。因此,Elasticsearch 需要创建大量线程的能力。最大线程数检查确保 Elasticsearch 进程有权在正常使用下创建足够的线程。此检查仅在 Linux 上强制执行。如果您在 Linux上,要通过最大线程数检查,必须将系统配置为允许 Elasticsearch 进程创建至少 4096 个线程。这可以通过 /etc/security/limits.conf 实现。使用 nproc 设置(请注意,必须增加 root 用户的限制)。

e) 最大文件大小检查

作为单个分片组成的 segment files 和 translog 组成的 translog generations 可能会变大(超过千兆字节)。在 Elasticsearch 进程可以创建的最大文件大小有限的系统上,这可能会导致写入失败。因此,这里最安全的选项是最大文件大小是无限的,这就是最大文件大小引导检查所强制执行的。要通过最大文件检查,您必须将系统配置为允许 Elasticsearch 进程写入无限大小的文件。这可以通过 /etc/security/limits.conf 实现,使用 fsize 设置为 unlimited(注意,还必须增加 root 用户的限制)。

f) 虚拟内存大小检查

Elasticsearch 和 Lucene 非常有效地使用 mmap 将索引的部分映射到 Elasticsearch 地址空间。这将某些索引数据从 JVM 堆中保留下来,但保留在内存中,以便快速访问。为了有效,Elasticsearch 应该有无限的地址空间。最大大小虚拟内存检查强制执行 Elasticsearch 进程具有无限的地址空间,并且仅在 Linux 上强制执行。要通过最大大小虚拟内存检查,必须将系统配置为允许 Elasticsearch 进程拥有无限的地址空间,可以通过在 /etc/security/limits.conf 文件中添加 <user> – as unlimited ,同样还必须增加 root 用户的限制。

g) 最大map数检查

接着上面一条,为了有效地使用 mmap,Elasticsearch 还需要能够创建许多内存映射区域。最大映射计数检查,检查内核是否允许进程至少有 262144 个内存映射区域,并且仅在 Linux 上强制执行。要通过最大映射计数检查,必须配置 vm。通过 sysctl 的最大映射计数至少为 262144。

h) Client JVM 检查

OpenJDK 派生的 JVM 提供了两种不同的 JVM:客户机 JVM 和服务器 JVM。这些 JVM 使用不同的编译器从Java 字节码生成可执行的机器代码。客户机 JVM 针对启动时间和内存占用进行了优化,而服务器 JVM 针对最大化性能进行了优化。两个虚拟机之间的性能差异可能很大。客户端 JVM 检查确保 Elasticsearch 没有在客户端 JVM 内运行。要通过客户端 JVM 检查,必须使用服务器 VM 启动 Elasticsearch。在现代系统和操作系统上,服务器虚拟机是默认的。

i) 串行收集器检查

针对不同的工作负载,OpenJDK 派生的 JVM 有各种垃圾收集器。串行采集器尤其适合单逻辑 CPU 机器或非常小的堆,这两种机器都不适合运行 Elasticsearch。将串行收集器与 Elasticsearch 结合使用可能会对性能造成破坏。串行收集器检查确保 Elasticsearch 未配置为与串行收集器一起运行。要通过串行收集器检查,您不能使用串行收集器启动 Elasticsearch(无论它是来自您正在使用的 JVM 的默认值,还是使用-XX:+UseSerialGC 显式指定的)。请注意,Elasticsearch 附带的默认 JVM 配置将 Elasticsearch 配置为在JDK14 及更高版本中使用 G1GC 垃圾收集器。对于早期的 JDK 版本,配置默认为 CMS 收集器。

j) 系统调用筛选器检查

Elasticsearch 根据操作系统(例如 Linux 上的 seccomp )安装不同风格的系统调用过滤器。安装这些系统调用过滤器是为了防止执行与分叉相关的系统调用,作为抵御 Elasticsearch 上任意代码执行攻击的防御机制。系统调用筛选器检查可确保如果启用了系统调用筛选器,则它们已成功安装。要通过系统调用筛选器检查,您必须修复系统上阻止安装系统调用筛选器的任何配置错误(检查日志),或者通过设置引导禁用系统调用筛选器,并自行承担风险。系统调用过滤器为 false 。

k) OnError 和 OnOutOfMemoryError 检查

如果JVM遇到致命错误(OnError)或 OutOfMemoryError(OnOutOfMemoryError),JVM 选项 OnError和 OnOutOfMemoryError 允许执行任意命令。然而,默认情况下,Elasticsearch 系统调用过滤器(seccomp)是启用的,这些过滤器可以防止分叉。因此,使用 OnError 或 OnOutOfMemoryError 和系统调用筛选器是不兼容的。如果使用了这些 JVM 选项中的任何一个,并且启用了系统调用筛选器,OnError 和OnOutOfMemoryError 检查将阻止 Elasticsearch 启动。这项检查总是强制执行的。要通过此检查,请不要启用 OnError 或 OnOufMemoryError ;相反,请升级到 Java 8u92 并使用JVM标志ExitOnOutOfMemoryError 。虽然它没有 OnError 或 OnAutofMemoryError 的全部功能,但在启用seccomp 的情况下,将不支持任意分叉。

l) 早期访问检查

OpenJDK 项目提供了即将发布的版本的早期访问快照。这些版本不适合生产。早期访问检查检测这些早期访问快照。要通过此检查,必须在 JVM 的发布版本上启动 Elasticsearch 。

m) G1GC 检查

众所周知,JDK 8 附带的 HotSpot JVM 的早期版本在启用 G1GC 收集器时会出现问题,导致索引损坏。受影响的版本早于 JDK 8u40 附带的 HotSpot 版本。G1GC 检查检测热点 JVM 的这些早期版本。

n) 所有权限检查

所有权限检查确保引导过程中使用的安全策略不会授予 java.security.AllPermission 权限给 Elasticsearch 。在授予所有权限的情况下运行相当于禁用安全管理器。

o) 发现配置检查

默认情况下,当 Elasticsearch 首次启动时,它将尝试发现在同一主机上运行的其他节点。如果在几秒钟内找不到选定的主节点,那么 Elasticsearch 将形成一个包含已发现的任何其他节点的集群。在开发模式下,无需任何额外配置就可以形成这个集群是很有用的,但这不适合生产,因为可能会形成多个集群并因此丢失数据。

此引导检查可确保发现未使用默认配置运行。可以通过设置以下至少一个属性来满足此要求:

discovery.seedhosts discovery.seedproviders cluster.initialmasternodes

以上比较常见的问题是文件描述符检查、检查的最大线程数、虚拟内存大小检查、最大map数检查、发现配置检查等项。

3. 节点的角色划分及单一角色节点配置

一个节点其实就是一个 Elasticsearch 服务的实例,一个这样的集合就构成了一个集群,当然一个节点也可以看成是一个只有单节点的集群。默认情况下,每个节点都可以处理 HTTP 和 transport 流量,传输层专门用于节点之间的通信;HTTP 层被应用与 Rest client 。如果没有在 elasticsearch.yml 中设置 node.roles ,则一个节点默认的角色为:

  • master
  • data
  • data_content
  • data_hot
  • data_warm
  • data_cold
  • data_frozen
  • ingest
  • ml
  • remote_cluster_client
  • transform

如果设置了 node.roles 则需要注意一个集群中必须要要有的节点是

  • master
  • data_content and data_hot 或者 data

    另外还有一些其他的设置,如:

  • 跨群集搜索和跨群集复制需要 remoteclusterclient 角色
  • 堆栈监控和摄取管道需要 ingest 角色
  • 弹性安全应用Fleet和transforms需要 transform 角色。当然这个也需要有 remoteclusterclient 角色
  • 机器学习功能,例如异常检测,需要 ml 角色。

随着集群的增长,尤其是如果你有大量的机器学习工作或持续传输,可以考虑从专用数据节点,机器学习节点和传输节点分离出专用的 master-eligible 节点。

下面我们来看一下各个节点的职责:

Master-eligible node :

​ 具有主节点角色的节点,有资格被选为控制集群的主节点。主节点负责轻量级集群范围的操作,例如创建或删除索引、跟踪哪些节点是集群的一部分,以及决定将哪些分片分配给哪些节点。拥有稳定的主节点对于集群健康非常重要。任何不属于仅投票节点的 master-eligible 节点都可以通过主节点选举过程被选为主节点。这样的节点必须配置 path.data 目录,其内容在重新启动时保持不变,就像数据节点一样,因为这是存储集群元数据的地方。集群元数据描述了如何读取存储在数据节点上的数据,因此如果数据丢失,则无法读取存储在数据节点上的数据。专用的主节点在服务负载比较大的时候是有必要的,将节点配置为专门用于选举为主节点的配置为:

node.roles: [ master ]

同时还有另外一种特殊的主节点,仅投票,但不参与选举,这样的节点为:

node.roles: [ master, voting_only ]

当然对于中小集群来说,这样的节点其实意义不大,所以经常会被用于数据节点,如下:

node.roles: [ data, master, voting_only ]

综上所述,master 节点的机器应该是计算密集性,并且要快速响应,所以应该选 CPU 核数较大的,并且硬盘读取速度要快的,但是不需要大容量的;

Data node :

​ 具有数据角色的节点。数据节点保存数据并执行与数据相关的操作,如 CRUD 、搜索和聚合。这些操作是 I/O 密集型、内存密集型和 CPU 密集型的。

设置为数据节点:

node.roles: [ data ]

在多层部署架构中,使用专门的数据角色将数据节点分配给特定层:data_contentdata_hotdata_warm、 data_colddata_frozen。一个节点可以属于多个层级,但具有特定数据角色之一的节点不能具有通用data角色。

数据内容节点容纳用户创建的内容。它们支持 CRUD、搜索和聚合等操作。设置为数据内容节点:

node.roles: [ data_content ]

热数据节点在进入 Elasticsearch 时存储时间序列数据。热层对于读取和写入都必须快速,并且需要更多的硬件资源(例如 SSD 驱动器)。设置为热数据节点:

node.roles: [ data_hot ]

暖数据节点存储不再定期更新但仍在查询的索引。查询量的频率通常低于索引处于热层时的频率。此层中的节点通常可以使用性能较低的硬件。设置为暖数据节点:

node.roles: [ data_warm ]

冷数据节点存储访问频率较低的只读索引。该层使用性能较低的硬件,并且可以利用可搜索的快照索引来最小化所需的资源。

node.roles: [ data_cold ]

冻结层只存储挂载部分的索引。我们建议您在冻结层中使用专用节点。

node.roles: [ data_frozen ]

Ingest node :

​ 具有 ingest 角色的节点。执行由一个或多个摄取处理器组成的预处理管道。根据摄取处理器执行的操作类型和所需的资源,能够对文档应用摄取管道,以便在索引之前转换和丰富文档。在接收负载较重的情况下,应该使用专用的 ingest 节点。

node.roles: [ ingest ]

Remote-eligible node :

​ 具有 remoteclusterclient 角色的节点,有资格充当远程客户端去连接到集群,连接后,可以使用跨群集搜索来搜索远程群集。还可以使用跨群集复制在群集之间同步数据。

node.roles: [ remote_cluster_client ]

Machine learning node :

​ 具有 ml 角色的节点。如果要使用机器学习功能,群集中必须至少有一个机器学习节点。

node.roles: [ ml, remote_cluster_client]

remoteclusterclient 角色是可选的,但强烈建议使用。否则,当用于机器学习作业或获取数据源时,跨集群搜索将失败。如果在异常检测作业中使用跨群集搜索, 则所有 master-eligible 节点上也需要 remoteclusterclient 角色。否则,数据馈送无法启动。

Transform node :

​ 具有转换角色的节点。如果要使用变换,群集中必须至少有一个变换节点。有关详细信息,请参见变换设置和变换数据。

node.roles: [ transform, remote_cluster_client ]

同样 remoteclusterclient 角色是可选的,但强烈推荐。否则,在转换中使用跨集群搜索会失败。

4. 冷热节点集群

当我们掌握了单一 node 的启动前设置,同时我们也掌握了单一 node role 相关的知识,我们搭建集群不就是信手拈来么,下面我们以简单的冷热集群为实例,搭建一个最简单的集群。我们为这个集群规划 1 个master-eligible node,1 个 vote only 节点,这个vote only node 同时作为数据节点,用来存储 warm 数据,1 个 hot node 用来存储热点数据,共计 3 个节点;

首先我们来看一下 master-eligible 节点的配置:

master-eligible node 的配置:

cluster.name: my-applicationnode.name: node-1network.host: 0.0.0.0discovery.seed_hosts: [\"47.104.167.82\"]cluster.initial_master_nodes: [\"node-1\"]node.roles: [master]

vote only 和 warm data 数据节点的配置:

cluster.name: my-applicationnode.name: node-2network.host: 0.0.0.0discovery.seed_hosts: [\"47.104.167.82\"]cluster.initial_master_nodes: [\"node-1\"]node.roles: [data_warm, master, voting_only]

hot node 数据节点的配置:

cluster.name: my-applicationnode.name: node-3network.host: 0.0.0.0discovery.seed_hosts: [\"47.104.167.82\"]cluster.initial_master_nodes: [\"node-1\"]node.roles: [data_hot]

最终起来后,用查看集群的 api http://47.104.167.82:9200/_cluster/stats,我们发现节点的数量和我们设置的结果是一致的。

\"nodes\": {        \"count\": {            \"total\": 3,            \"coordinating_only\": 0,            \"data\": 0,            \"data_cold\": 0,            \"data_content\": 0,            \"data_frozen\": 0,            \"data_hot\": 1,            \"data_warm\": 1,            \"ingest\": 0,            \"master\": 2,            \"ml\": 0,            \"remote_cluster_client\": 0,            \"transform\": 0,            \"voting_only\": 1        }    }

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站(邮箱:1099252741@qq.com,备用微信:1099252741),本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。