服务发现
服务发现的触发时机:1、启动一个新节点。2、当一个节点认为主节点宕机
节点启动时,会根据discovery.seed_hosts的配置+数据目录中保存的集群元数据来发现集群其他节点,向这些节点发送消息,这些节点收到后将自己是否是候选者、自己知道的候选者回复给发送者,如果没有主节点并且已发现足够多的候选者,则开始投票选主
投票配置节点(Voting configurations)
ES集群会维护一个称为投票配置的节点集合,选主和修改集群状态都需要投票配置的节点集合过半响应成功
投票配置节点可以是候选者(master-eligible)的集合,也可以是候选者集合的子集,这样的好处是当投票配置节点宕机时,非投票配置节点的候选者可以加入投票配置节点集合
当有候选者加入时,投票配置节点会自动伸缩,但是需要一些时间来调整,因为投票配置的节点集合的修改需要过半节点投票
集群允许同时挂掉半数以下的投票配置节点,当节点挂掉时,集群会自动收缩,因此如果不是同时挂掉,集群最少可以减少到2台投票配置节点(3台的过半节点),比如原本有5个节点,同时挂掉2个,经过调整后,投票配置节点由5收缩到3,仍允许挂掉一个;如果5个节点同时挂掉3个,则投票配置节点无法调整,因为调整本身需要过半节点投票,也就是至少3个
当集群中有偶数个候选者节点时,ES只会使用其中候选者-1个节点作为投票配置节点,使得投票配置节点的个数一定为奇数,因为当有偶数个节点时,集群对半脑裂将导致集群不可用,而奇数,集群任何一种脑裂的情况都不会导致不可用
GET _cluster/state?filter_path=metadata.cluster_coordination.last_committed_config//查看当前的投票配置节点,返回节点的UID
GET _cluster/state?filter_path=nodes//UID到节点的对应关系
集群扩缩容
建议集群中配置少量而固定个数的候选者节点
节点扩容:只需要在新加入节点中配置discovery.seed_hosts,启动时指定enroll-token
节点缩容:
- 如果缩容的节点不是候选者,或者少于过半节点数的候选者,则直接关闭即可
- 如果大于过半节点数,
- 分多批次关闭,每次关闭少于过半节点,等待集群调整投票配置节点,再关闭下一批次,GET _cluster/state?filter_path=metadata.cluster_coordination.last_committed_config查看投票配置节点。
- 通过cluster API(推荐),直接将要关闭的节点加入voting_config_exclusions,等待直到投票配置节点调整完毕,再关闭节点进程,最后删除voting_config_exclusions
POST /_cluster/voting_config_exclusions?node_names=node_name //将节点加入voting_config_exclusions
POST /_cluster/voting_config_exclusions?node_names=node_name&timeout=1m
GET /_cluster/state?filter_path=metadata.cluster_coordination.voting_config_exclusions //查询voting_config_exclusions
DELETE /_cluster/voting_config_exclusions //删除
DELETE /_cluster/voting_config_exclusions?wait_for_removal=false
cluster.initial_master_nodes
cluster.initial_master_nodes: ["node-1"]
cluster.initial_master_nodes:
- master-a
- master-b
- master-c
集群第一次启动时,默认会在第一个节点自动加入cluster.initial_master_nodes配置,并且其中的配置就是第一个节点,也可以手动配置,比如配置3个节点,这样第一次启动时集群就知道这些节点是候选节点,启动后会将候选节点信息保存到数据目录,后续再重启时不会再使用cluster.initial_master_nodes,而是使用数据目录中的配置来选主。
第一次启动后,应该删除cluster.initial_master_nodes配置。
cluster.initial_master_nodes可以是节点名称node.name,节点名称默认是hostname主机名称,也可以是 ip和端口
和discovery.seed_hosts的区别:
- cluster.initial_master_nodes是第一次启动时,只能在候选者节点上配置的,用来第一次选主的配置,第一次启动后需要删除,可以配置为节点名称
- discovery.seed_hosts是节点发现其他节点的配置,候选者和数据节点都需要配置,不能删除,可以配置为集群其他节点的IP和transport.port.
节点角色
节点角色通过node.roles配置,可以同时具备多个角色,节点默认具备所有类型的角色
角色主要分为候选者(master-eligible)和数据(data)节点2种类型,非仅投票节点(voting_only)的候选者可以当选为主节点
主节点的作用:管理整个集群,包括1、维护每个节点的存活状态。2、创建索引,管理索引和分片的元数据,索引到分片的对应关系,分片到节点的对应关系
数据节点的作用:保存索引的文档分片数据,数据的CRUD
建议配置专用主节点(dedicated master-eligible),不让候选者做大负载的数据工作,防止主节点宕机频繁选举,node.roles: master
仅投票节点:只能参与投票,不能当选主节点,仅投票节点必须配置master和voting_only角色,通常还可以加入data角色
cluster.name: c1-5nodes-9201-9205
node.name: node-m-2
path.data: /opt/framework/es-cluster/data/node-m-2
path.logs: /opt/framework/es-cluster/logs/node-m-2
network.host: 192.168.1.66
http.port: 9202
transport.port: 9302
discovery.seed_hosts: ["192.168.7.65:9301"]
# cluster.initial_master_nodes: ["node-m-1", "node-m-2","node-mdv-3"]
node.roles: ["master"]
xpack.security.enabled: false
xpack.security.http.ssl:
enabled: false
xpack.security.transport.ssl:
enabled: false
xpack.security.enrollment.enabled: true
cluster.name: c1-5nodes-9201-9205
node.name: node-d-4
path.data: /data/es-cluster/data/node-d-4
path.logs: /data/es-cluster/logs/node-d-4
network.host: 192.168.7.65
http.port: 9204
transport.port: 9304
discovery.seed_hosts: ["192.168.7.65:9301", "192.168.7.65:9303", "192.168.1.66:9302"]
node.roles: ["data"]
xpack.security.enabled: false
xpack.security.http.ssl:
enabled: false
xpack.security.transport.ssl:
enabled: false
xpack.security.enrollment.enabled: true
cluster.name: c1-5nodes-9201-9205
node.name: node-mdv-3
path.data: /data/es-cluster/data/node-mdv-3
path.logs: /data/es-cluster/logs/node-mdv-3
network.host: 192.168.7.65
http.port: 9203
transport.port: 9303
discovery.seed_hosts: ["192.168.7.65:9301", "192.168.1.66:9302"]
# cluster.initial_master_nodes: ["node-m-1", "node-m-2","node-mdv-3"]
node.roles: ["master","voting_only","data"]
xpack.security.enabled: false
xpack.security.http.ssl:
enabled: false
xpack.security.transport.ssl:
enabled: false
xpack.security.enrollment.enabled: true