在Elasticsearch有两类节点,一类是Master,一类是DataNode。
在Elasticsearch启动时,会选举出来一个Master节点。当某个节点启动后,然后使用Zen Discovery机制找到集群中的其他节点,并建立连接。
discovery.seed_hosts: "node1", "node2", "node3"
并从候选主节点中选举出一个主节点。
cluster.initial_master_nodes: "node1", "node2"
Master节点主要负责:
一个Elasticsearch集群中,只有一个Master节点。在生产环境中,内存可以相对小一点,但机器要稳定。
在Elasticsearch集群中,会有N个DataNode节点。DataNode节点主要负责:
为了对Elasticsearch的分片进行容错,假设某个节点不可用,会导致整个索引库都将不可用。所以,需要对分片进行副本容错。每一个分片都会有对应的副本。在Elasticsearch中,默认创建的索引为1个分片、每个分片有1个主分片和1个副本分片。
// 创建指定分片数量、副本数量的索引
PUT /job_idx_shard
{
"mappings": {
"properties": {
"id": { "type": "long", "store": true },
"area": { "type": "keyword", "store": true },
"exp": { "type": "keyword", "store": true },
"edu": { "type": "keyword", "store": true },
"salary": { "type": "keyword", "store": true },
"job_type": { "type": "keyword", "store": true },
"cmp": { "type": "keyword", "store": true },
"pv": { "type": "keyword", "store": true },
"title": { "type": "text", "store": true },
"jd": { "type": "text"}
}
},
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
// 查看分片、主分片、副本分片
GET /_cat/indices?v
1、选择任意一个DataNode发送请求,例如:node2。此时,node2就成为一个 coordinating node(协调节点)
2、计算得到文档要写入的分片
shard = hash(routing) % number\_of\_primary\_shards
3、coordinating node会进行路由,将请求转发给对应的primary shard所在的DataNode(假设primary shard在node1、replica shard在node2)
4、node1节点上的Primary Shard处理请求,写入数据到索引库中,并将数据同步到 Replica shard
5、Primary Shard和Replica Shard都保存好了文档,返回client