角色是ES节点的重要属性,属于Elasticsearch的重要基础概念。
在高可用系统架构中,节点角色发挥着至关重要的作用。如果前期没有对业务系统和技术架构做足准备,没有充分考虑后期的扩展问题,势必会为将来的性能优化留下潜在问题。
ES中存在两个模式:“开发模式”和“生产模式”。
1 主节点 ≠ master节点
集群中只允许有一个活跃的主节点(下面简称主节点),我们称之为 active master 节点。一般为了避免主节点宕机造成集群无主,所以需要配置候选节点以便在主节点宕机时选举出新的主节点。
通常在口语中所说的主节点(或者master节点)指的都是active master
节点,而不是严格意义上的配置了master角色的节点,换句话说,配置了master的节点应该叫做候选节点,其不一定是主节点,只有在master选举中胜出的节点,才是主节点,即 active master节点。
2 主节点必须遵循以下分配原则:
voting-only
的 master-eligible
节点都可以被选举为 active master
。path.data
目录,其内容在重启后仍然存在,就像数据节点一样,因为这是存储集群元数据的地方。集群元数据描述了如何读取存储在数据节点上的数据,因此如果丢失,则无法读取存储在数据节点上的数据。候选节点即:master-eligible node,口语中经常也称之为 master node ,严格来说,用中文来解释,应该叫做 候选节点(中文口语中通常也叫 master节点)。默认情况下,候选节点默认也是有效的投票节点,即:配置了master角色的节点,默认具备选举权和被选举权,可以参与选举,也可以为其他节点投票。
活跃的主节点一定是配置了master角色的节点,即一定是候选节点,但是候选节点不一定是主节点,一个集群中只可能有一个主节点,而可以同时存在多个候选节点,候选节点的作用主要在于当主节点宕机或发生故障脱离集群时,参与选举成为新的主节点,从而避免集群无主。
任何不是仅投票节点的主合格节点都可以通过主选举过程选举成为主节点**。**
专用候选节点(专用主节点)一般指仅配置了master角色的节点,其设计初衷为尽可能的让主节点职责单一,避免重负载任务给集群管理带来压力。
1 配置
node.roles: [ master ]
1 什么是仅投票节点
仅投票节点即:仅具备选举权可以为其他候选节点投票,而没有被选举权无法参与竞选的节点。
2 仅投票节点存在的意义
仅投票节点存在的意义就是为了降低资源浪费,注意是降低而无法做到完全避免。因为高可用系统在很多层面都需要以空间换时间,在很多情况下需要我们去权衡利弊,做出最佳选择。
为了避免让主节点执行重负载任务,遵循职责单一原则,我们一般不为其分配 data 角色,从而避免让主节点执行数据的增删改查这种重负载任务。
但是这无形中造成很大的资源浪费,尤其是小规模集群,本身服务器资源就不多,节点就少。以一个五节点的集群为例,如果我们为了遵循职责单一法则,让其中3个master节点都作为专用候选节点(仅配置master角色),那么真正执行增删改查的节点就只有两个了,
一个很好的办法就是“二加一部署”,即两个专用主节点 + 一个仅投票节点
节点 | 角色 | 是否主节点 | 选举权 | 被选举权 | 备注 |
---|---|---|---|---|---|
node-1 | master | ★ | ✔ | ✔ | 活跃的主节点,同时也是一个负载均衡器 |
node-2 | master | 否 | ✔ | ✔ | 候选节点,主要作用是当 node-1 故障时替代node-1成为主节点,次要作用是充当负载均衡器 |
node-3 | master、voting_only、data | 不可能 | ✔ | X | 虽然配置了master角色,但是只能投票。其永远不可能成为主节点,因此可为其分配data角色,避免了node-3空置,降低了资源浪费 |
node-4 | data | 不可能 | 无效 | X | 主要承担数据的读写任务,不具备有效的选举权和被选举权 |
node-5 | data | 不可能 | 无效 | X | 主要承担数据的读写任务,不具备有效的选举权和被选举权 |
仅投票节点没有被选举权只有选举权,也就是仅投票节点永远无法成为主节点,这样的话我们就可以为其分配data角色让其承担数据负载,这样技能保证选举出的新的主节点是一个专用主节点,又降低的资源浪费。
3 配置仅投票节点
一般情况下,voting_only 和 master 角色是一起配置的,单独配置 voting_only 角色是没有意义的。
配置master角色的节点拥有被选举权和选举权,而voting_only 的作用就是阉割掉候选节点的被选举权,让其只能投票,而不能参与选举。所以如果没有master角色,配置voting_only也是没有意义的。
node.roles: [ data, master, voting_only ]
数据节点保存包含已编入索引的文档的分片。数据节点处理数据相关操作,如 CRUD、搜索和聚合。这些操作是 I/O 密集型、内存密集型和 CPU 密集型的。监控这些资源并在它们过载时添加更多数据节点非常重要。
配置数据节点:
node.roles: [ data, xxx ]
预处理节点有点类似于logstash的消息管道,所以也叫ingest pipeline,常用语一些数据写入之前的预处理操作,比如去除空格、split等操作,常和update_by_query、reindex等一起考
配置方法
node.roles: [ ingest, xxx ]
具有 remote_cluster_client
角色的节点,使其有资格充当远程客户端
当需要通过远程访问节点时,该角色必须配置,比如通过publish_host配置的地址访问服务节点时,该角色必须启用
配置方法
node.roles: [ remote_cluster_client, xxx ]
专用主节点存在的意义和集群规模是正相关的,也就是说,集群规模越大,配置专用主节点的意义也就越大
对于 3.4.2 中提到的五节点的集群,两个专用主节点的设计,对于当前集群规模来说,仍然是存在很大的浪费的
举个栗子:
我们可以把主节点想象成一个班级的班长,五个节点分别代表五个学生,这其中包含班长。
班级就是我们的集群,现在班级需要打扫卫生(重负载任务),班长的职责主要就是指挥其他学生打扫卫生,但是当班级里人数特别少的时候,指挥其他学生这个工作对于班长的负担并不大,因为学生人数本来就很少,这个时候缺的是打扫卫生的人,此时让班长同时也去打扫卫生是更加合理的。
但是如果班级学生很多,比如有几十个上百个甚至更多,此时班长就应该把他的主要职责放在“指挥”这件事上面,自己同时兼顾打扫卫生不仅不会对整个集群负载带来多少好处,反而会大大影响自己指挥整个班级。所以此时他应该这一件事做好,也就是专用主节点了。
节点 | 角色 | 是否主节点 | 选举权 | 被选举权 |
---|---|---|---|---|
node-1 | master、data | ★ | ✔ | ✔ |
node-2 | master 、data | 否 | ✔ | ✔ |
node-3 | master 、data | 否 | ✔ | ✔ |
node-4 | data | 不可能 | 无效 | X |
node-5 | data | 不可能 | 无效 | X |
小规模集群,尤其是节点个数为个位数的集群,分配专用主节点是得不偿失的!专用主节点带来的价值是远远无法弥补其浪费的节点所带来的损失的