0%

elasticsearch简易原理

创建索引指定副本和分片数量

1
2
3
4
5
6
{
"settings": {
"number_of_shards": 3, //主分片数
"number_of_replicas": 1 //副本
}
}

elasticsearch-head安装

github上克隆代码elasticsearch-head,按照md中操作启动即可,需要安装node.js

1
2
3
4
5
6
git clone https://github.com/mobz/elasticsearch-head.git

cd elasticsearch-head

npm install
npm run start

访问localhost:9200。

健康状态说明:

绿色: 正常运行;

黄色: 副本未正常运行;

红色:分片未正常运行。

故障转移

单点集群不会创建副本,这是因为es集群中,索引分片和备份的副本不能在同一节点上。

img

当有第二个节点启动并加入集群时,备份和分片会自动分配。

img

水平扩容

多节点集群,es会自动将每个节点上的分片进行平均,保证每个节点的负荷量都在相同的水平。

img

如果节点数量大于所有分片的数量(包括主分片和副本),则会造成资源的浪费。

主分片在创建索引的时候已经被指定,”number_of_shards”,并且是不允许被修改的;

1
2
3
curl --location --request PUT 'localhost:18120/users/_settings' \
--header 'Content-Type: application/json' \
--data-raw '{"number_of_replicas": 2}'

![image-20230216160335268](/Users/cyj/Library/Application Support/typora-user-images/image-20230216160335268.png)

但是副本可以动态的修改。这样就可以在水平扩容时,保证资源不被浪费。

img

应对故障

同样,es集群与大多数分布式系统中的集群相同,如果某一节点挂掉了,则es集群会重新选举master节点,并对分片进行重新分配。

img

节点恢复后,也会重新加入集群中

img

路由计算&分片控制

路由计算:

进行分片后,文档(document)只会存储在某一个分片上,而与redis的slot类似,es集群所采用的路由计算方式也是通过对文档的唯一标识–id进行hash运算,根据倒排索引来获取到id

1
hash(_doc_id) % (number_of_shards)

分片控制:

对于查询,由于每一个节点上都有主分片,或者是副本,忽略一致性问题,每一个节点上都有对应的数据。但是在实际中每一个节点可能此时面临的压力不一样,所以在查询时一般按照轮询的方式。

其他

es集群处理写请求。客户端发出的请求会落到任意节点上,该节点称为协调节点,协调节点会将请求转发到指定的节点(前面所提到的计算规则),主分片将数据保存后,会同步给副本,副本同步完成之后会反馈给主分片,从而主分片反馈给客户端。

es集群处理读请求,协调结点在每次请求的时候都会通过轮询所有的副本分片来达到负载均衡。在文档被检索时,已经被索引的文档可能已经存在于主分片上但是还没有复制到副本分片。 在这种情况下,副本分片可能会报告文档不存在,但是主分片可能成功返回文档。 一旦索引请求成功返回给用户,文档在主分片和副本分片都是可用的。

kibana的使用:

1
https://github.com/elastic/kibana.git

ik分词器的使用:

1
https://github.com/medcl/elasticsearch-analysis-ik.git

Spring集成es

github地址:

1
https://github.com/Alwaysbryant/es-study-springdata-demo.git
-------------本文结束感谢您的阅读-------------