创建索引指定副本和分片数量
1 | { |
elasticsearch-head安装
github上克隆代码elasticsearch-head,按照md中操作启动即可,需要安装node.js
1 | git clone https://github.com/mobz/elasticsearch-head.git |
访问localhost:9200。
健康状态说明:
绿色: 正常运行;
黄色: 副本未正常运行;
红色:分片未正常运行。
故障转移
单点集群不会创建副本,这是因为es集群中,索引分片和备份的副本不能在同一节点上。
当有第二个节点启动并加入集群时,备份和分片会自动分配。
水平扩容
多节点集群,es会自动将每个节点上的分片进行平均,保证每个节点的负荷量都在相同的水平。
如果节点数量大于所有分片的数量(包括主分片和副本),则会造成资源的浪费。
主分片在创建索引的时候已经被指定,”number_of_shards”,并且是不允许被修改的;
1 | curl --location --request PUT 'localhost:18120/users/_settings' \ |
![image-20230216160335268](/Users/cyj/Library/Application Support/typora-user-images/image-20230216160335268.png)
但是副本可以动态的修改。这样就可以在水平扩容时,保证资源不被浪费。
应对故障
同样,es集群与大多数分布式系统中的集群相同,如果某一节点挂掉了,则es集群会重新选举master节点,并对分片进行重新分配。
节点恢复后,也会重新加入集群中
路由计算&分片控制
路由计算:
进行分片后,文档(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 |