节点和集群
集群
节点通过设置集群名称,在同一网络中发现具有相同集群名称的节点,组成集群
每个集群都有一个 cluster name 作为标识,默认的集群名称为 elasticsearch
如果在同一网络中只有一个节点,则这个节点成为一个单节点集群
集群状态
- Green
所有主分片和从分片都准备就绪(分配成功),即使有一台机器挂了(假设一台机器一个实例),数据都不会丢失,但会变成 Yellow 状态
- Yellow
所有主分片准备就绪,但存在至少一个主分片(假设是 A)对应的从分片没有就绪,此时集群属于警告状态,意味着集群高可用和容灾能力下降,如果刚好 A 所在的机器挂了,而从分片还处于未就绪状态,那么 A 的数据就会丢失(查询结果不完整),此时集群进入 Red 状态
- Red
至少有一个主分片没有就绪(直接原因是找不到对应的从分片成为新的主分片),此时查询的结果会出现数据丢失(不完整)
节点
一个 ES 节点就是一个运行的 ES 实例,可以实现数据存储并且搜索的功能
每个节点都有一个唯一的名称作为身份标识,如果没有设置名称,默认使用 UUID 作为名称
最好给每个节点都定义上有意义的名称,在集群中区分出各个节点
一个机器可以有多个实例,所以并不能说一台机器就是一个 node,大多数情况下每个 node 运行在一个独立的环境或虚拟机上
节点类型
在 Elasticsearch 当中,ES 分为三种角色:master、data、client
三种角色由 elasticsearch.yml 配置文件中的 node.master
、node.true
来控制。如果不修改 elasticsearch 的节点角色信息,那么默认就是 node.master: true
、node.data: true
默认情况下,es 集群中的每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务,负载均衡以及数据合并等服务。在高并发的场景下集群容易出现负载过高问题
角色划分
- master 节点
集群中的一个节点会被选为 master 节点,它将负责管理集群范畴的变更,例如创建或删除索引,添加节点到集群或从集群中删除节点
master 节点无需参与文档层面的变更和搜索,这意味着仅有一个 master 节点并不会因流量增长而成为瓶颈
任意一个节点都可以成为 master 节点
该节点不和应用创建连接,主要用于元数据 (metadata) 的处理,比如索引的新增、删除、分片分配等,master 节点不占用 IO 和 CPU,内存使用量一般
- data 节点
持有数据和倒排索引
默认情况下,每个节点都可以通过设定配置文件 elasticsearch.yml 中的 node.data
属性为 true (默认) 成为数据节点
如果需要一个专门的主节点 (一个节点既可以是 master 节点,同时也可以是 data 节点),应将其 node.data
属性设置为 false
该节点和索引应用创建连接、接收索引请求,该节点真正存储数据,ES 集群的性能取决于该节点的个数(每个节点最优配置的情况下),data 节点会占用大量的 CPU、IO 和内存
- client 节点
如果将 node.master 属性和 node.data 属性都设置为 false,那么该节点就是一个客户端节点,扮演一个负载均衡的角色,将到来的请求路由到集群中的各个节点
该节点和检索应用创建连接、接受检索请求,但其本身不负责存储数据,可当负责均衡节点,client 节点不占用 io、cpu 和内存
各节点间的关系
- master
master 节点具备主节点的选举权,有资格成为主节点,主节点控制整个集群的元数据
- data
data 节点的分片执行查询语句获得查询结果后将结果反馈给 client。此过程较消耗硬件资源
- client
client 节点接受搜索请求后将请求转发到与查询条件相关的多个 data 节点的分片上,然后多个 data 节点的分片执行查询语句或者查询结果再返回给 client 节点,client 来把各个 data 节点的返回结果进行整合、排序等一系列操作后再将最终结果返回给用户请求
资源规划
- master 节点
ES 如果做集群的话 master 节点至少三台服务器或者三个 master 实例加入相同集群,三个 master 节点最多只能故障一台 master 节点,如果故障两个 master 节点,ES 将无法组成集群
- data 节点
单个索引在一个 data 节点上分片数保持在 3 个以内;每 1GB 堆内存对应集群的分片保持在 20 个以内;每个分片不要超过 30G
如果单索引每个节点可支撑 90G 数据,依此可计算出所需 data 节点数 。
如果是多索引按照单个 data 节点 jvm 内存最大 30G 来计算,一个节点的分片保持在 600 个以内,存储保持在 18T 以内
主机的 CPU、IO 固定,建议一台主机只部署一个 data 节点,不同角色节点独立部署,方便扩容
每条数据保持在 2k 以下索引性能大约 3000-5000 条 /s/data 节点
,增加 data 节点数可大幅度增加索引速率,节点数与索引效率的增长关系呈抛物线形状
- client 节点
增加 client 节点可增加检索并发,但检索的速度还是取决于查询所命中的分片个数以及分片中的数据量
集群角色
node.master: true #主节点
;允许节点是否可以成为一个 master 节点,ES 是默认集群中的第一台机器成为 master,如果这台机器停止就会重新选举。(默认开启)
node.data: true #数据节点
;允许该节点存储索引数据(默认开启)
上面这两个属性可以有四种组合方式:
- 主节点+数据节点
第一种为 ES 默认选项,以下两个值都为 true,该节点既有成为 master 的资格还要存储数据,如果该节点被选为了真正的 master,还要存储数据,那么该节点的压力相对来说就较大了,生产中不建议这样,即成为了主节点还成为了数据节点
- 主节点
第二种为主节点模式,该节点只有成为 master 节点的资格,并不正真存储数据,在没有成为 master 的情况下还可以进行集群内的请求转发,数据合并等功能,此选择在生产中为 master 节点
- 数据节点
第三种为数据节点,该节点只存储数据,没有资格成为 master,只做数据存储功能;在集群中需要单独设置几个这样的节点,用来存储数据
- 客户端节点
第四种为 client 节点,该节点既没有成为 master 的资格,还不存储数据,主要是针对海量请求的时候可以进行负载均衡、数据合并、数据查询、请求转发等功能