微服务框架
【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 ,整理并返回给用户