一个ES集群中有多个Server节点,每个Server节点中含有多个Index。
主节点(Master)
主资格节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是集群的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的,默认情况下任何一个集群中的节点都有可能被选为主节点,索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。
数据节点(Server)
数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对cpu,内存,io要求较高, 在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点(可横向拓展)。
节点对等
每个节点都能接受请求, 每个节点接收到请求后能把该请求路由到相关数据的其它节点上, 接受原始请求的节点负责采集数据并返回给客户端。
Index(索引)
在ES中的index,可以理解为是一份数据的标识,类似于在hive中一份数据要通过一个表名来标识。
一个Index含有多个分片(shard),其中有一个 primary 主分片,负责写入,其他副本为 replica,不能写,只能同步 primary 的数据,但可以处理读请求。
分片机制
将文本数据切割成n个小文本存储在不同的节点, 减少大文件存储在单个节点上对设备带来的压力。
分片控制(路由计算)
当索引一个文档时,我们要确定这个文档存到那个分片中,当创建一个文档的时候,也要确定这个文档应该存到那个分片中。这个确定的方法我们是通过一个公式(路由计算)来确定的:
shard = hash(routing) % number_of_primary_shards
routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。 routing 通过hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置
分片的副本
在集群中某个节点宕机后,通过副本可以快速对缺失数据进行复盘
分片的负载均衡
例如现在有10个分片(shard),集群中有三个节点, ES会进行均衡分配,以保持整体请求的负载均衡。增加或减少节点时会自动负载均衡(rebalance)
ES的底层是Lucene引擎,ES的每一个分片对应到底层实际上就是一个 Lucene Index,包含多个 segment 文件,和一个 commit point 文件。
segment
segment 文件存储的就是一个个的 Document,是负责真正存储数据的。
commit point
commit point 相当于一个索引文件,记录了都有哪些 segment 文件。