微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
SpringCloud微服务架构
文章目录
- 微服务框架
- SpringCloud微服务架构
- 29 ES 集群
- 29.4 分布式新增和查询流程
- 29.4.1 ES集群的分布式存储
- 29.4.2 总结
 
 
 
 
29 ES 集群
29.4 分布式新增和查询流程
29.4.1 ES集群的分布式存储
先来一个演示
因为没有开kibana,就直接使用接口测试工具来实现CRUD 【笔者这里用的是postman】
新增文档

再来一个3

再来一个5

OK【都是9200 啊es01 节点】
现在做一个查询

OK,可以看到成功拿到了 3 条文档
试试9201

好家伙,它也查到了3 条
再试试9202

我超,现在的效果就是我是在9200 插入的3 条文档,但是在每一个节点上都能查到
【所以这些数据到底是存在了哪个分片?】
加上一个查询字段
{
    "explain":true,
    "query":{
        "match_all":{}
    }
}

{
    "took": 7,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_shard": "[itcast][0]",
                "_node": "jG9h6IFyQkmNrqNKtVSqRQ",
                "_index": "itcast",
                "_type": "_doc",
                "_id": "5",
                "_score": 1.0,
                "_source": {
                    "title": "试着插入一条 id = 5"
                },
                "_explanation": {
                    "value": 1.0,
                    "description": "*:*",
                    "details": []
                }
            },
            {
                "_shard": "[itcast][1]",
                "_node": "5pEyBkCISr65w6qJtj9R8Q",
                "_index": "itcast",
                "_type": "_doc",
                "_id": "3",
                "_score": 1.0,
                "_source": {
                    "title": "试着插入一条 id = 3"
                },
                "_explanation": {
                    "value": 1.0,
                    "description": "*:*",
                    "details": []
                }
            },
            {
                "_shard": "[itcast][2]",
                "_node": "jG9h6IFyQkmNrqNKtVSqRQ",
                "_index": "itcast",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "title": "试着插入一条 id = 1"
                },
                "_explanation": {
                    "value": 1.0,
                    "description": "*:*",
                    "details": []
                }
            }
        ]
    }
}
OK,可以看到id = 5 在itcast 的0 号片,id =3 在1号,id =1 在2 号
刚好每个分片都分了一个【这说明协调节点确实是工作了】
【所以下面的问题就来了】
当新增文档时,应该保存到不同分片,保证数据均衡,那么coordinating node【协调节点】如何确定数据该存储到哪个分片呢?
elasticsearch会通过hash算法来计算文档应该存储到哪个分片:

说明:
- _routing默认是文档的id
- 算法与分片数量有关,因此索引库一旦创建,分片数量不能修改!【一改,将来就找不到了】
【新增文档流程】

妙啊,关键就是协调节点
【elasticsearch 的查询阶段】
elasticsearch的查询分成两个阶段:
- scatter phase:分散阶段,coordinating node会把请求分发到每一个分片
- gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户

29.4.2 总结
分布式新增如何确定分片?
- coordinating node根据id做hash运算,得到结果对shard数量取余,余数就是对应的分片
分布式查询的两个阶段
- 分散阶段: coordinating node将查询请求分发给不同分片
- 收集阶段:将查询结果汇总到coordinating node ,整理并返回给用户



















