Elasticsearch集群:集群及相关概念
-
集群:多个人做一样的事。
-
分布式:多个人做不一样的事。
-
节点(node) :集群中的一个 Elasticearch 服务实例。在Elasticsearch中,节点的类型主要分为如下三种:
-
master eligible节点:有资格参加选举成为Master的节点,默认为true(可以通过node.master: false设置)。
-
data节点:保存数据的节点,默认为true(可以通过node.data: false设置)。
-
Coordinating 节点:客户端节点。负责接收客户端请求,将请求发送到合适的节点,最终把结果汇集到一起返回,默认为true。
-
-
集群(cluster):一组拥有相同集群名称的节点,集群名称默认是elasticsearch。
-
索引(index) :es存储数据的地方,相当于关系数据库中的database。
-
分片(shard):索引库可以被拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引库的不同分片可以拆分到放到不同的节点中,分片的好处有如下两点。
-
提高查询性能(多个节点并行查询)
-
提高数据安全性(鸡蛋不要放在一个篮子里)
-
-
主分片(Primary shard):相对于副本分片的定义。
-
副本分片(Replica shard):即对主分片数据的备份,每个主分片可以有一个或者多个副本,数据和主分片一样,副本的好处有如下两点:
-
数据备份,防止数据丢失
-
一定程度提高查询的并发能力(同一份完整的索引库的数据,分成了两份,都可以查询)
-
主分片和副本分片永远不会分配在同一个节点上
Elasticsearch集群:路由原理
-
文档存入对应的分片,ES计算分片编号的过程,称为路由。
-
Elasticsearch 是怎么知道一个文档应该存放到哪个分片中呢?
-
查询时,根据文档id查询文档, Elasticsearch 又该去哪个分片中查询数据呢?
-
路由算法 :shard_index(分片编号) = hash(文档id) % number_of_primary_shards(主分片个数)
Elasticsearch集群:脑裂问题
何为脑裂?
-
一个正常es集群中只有一个主节点(Master),主节点负责管理整个集群。如创建或删除索引,并决定哪些分片分配给哪些节点。此外还跟踪哪些节点是集群的一部分。
-
脑裂就是一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。简单来说就是一个集群里只能有一个老大来指挥工作,如果有多个老大,就乱套了。
脑裂原因
-
网络原因:网络延迟 一般es集群会在内网部署,也可能在外网部署,比如阿里云。 内网一般不会出现此问题,外网的网络出现问题的可能性大些。
-
节点负载 主节点的角色既为master又为data。数据访问量较大时,可能会导致Master节点停止响应(假死状态)。
-
JVM内存回收 当Master节点设置的JVM内存较小时,引发JVM的大规模内存回收,造成ES进程失去响应
避免脑裂
脑裂产生的原因:
-
网络原因:网络延迟较高
-
节点负载:主节点的角色既为master又为data
-
JVM内存回收:JVM内存设置太小
避免脑裂:
-
网络原因:discovery.zen.ping.timeout 超时时间配置大一点。默认是3S
-
节点负载:角色分离策略
-
主节点配置:
node.master: true # 是否有资格参加选举成为master node.data: false # 是否存储数据
-
数据节点配置:
node.master: false # 是否有资格参加选举成为master node.data: true # 是否存储数据
-
-
JVM内存回收:修改 config/jvm.options 文件的 -Xms 和 -Xmx 为服务器的物理内存一半。
-
还可以在选举层面解决脑裂问题(即不让第二个老大产生):
# 声明获4得大于几票,主节点才有效,请设置为(master eligble nodes / 2) + 1 discovery.zen.minimum_master_nodes: 5
Elasticsearch集群:故障迁移
集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其它节点,确保数据安全,这个叫做故障转移。