ElasticSearch 集群

1、集群介绍

目录

1、集群介绍

2、ES集群相关概念

3、集群搭建

4、kibina管理集群

5、JavaAPI 访问集群

6、分片配置

7、路由原理

8、脑裂


  • 集群和分布式:

        集群:多个人做一样的事。

        分布式:多个人做不一样的事

  • 集群解决的问题:

        让系统高可用

        分担请求压力

  • 分布式解决的问题:

        分担存储和计算的压力,提速

        解耦

  • 集群和分布式架构往往是并存的  

2、ES集群相关概念

es 集群:

  • ElasticSearch 天然支持分布式
  • ElasticSearch 的设计隐藏了分布式本身的复杂性

ES集群相关概念:

  • 集群(cluster):一组拥有共同的 cluster name 的 节点。
  • 节点(node) :集群中的一个 Elasticearch 实例
  • 索引(index) :es存储数据的地方。相当于关系数据库中的database概念
  • 分片(shard):索引可以被拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引的不同分片可以拆分到不同的节点中
  • 主分片(Primary shard):相对于副本分片的定义。
  • 副本分片(Replica shard)每个主分片可以有一个或者多个副本,数据和主分片一样。

3、集群搭建

参考文档

4、kibina管理集群

vim  kibana-7.4.0-linux-x86_64-cluster/config/kibana.yml

 kibana.yml

#支持中文
i18n.locale: "zh-CN"
#5602避免与之前的冲突
server.port: 5602
server.host: "0.0.0.0"
server.name: "kibana-itcast-cluster"
elasticsearch.hosts: ["http://localhost:9201","http://localhost:9202","http://localhost:9203"]
elasticsearch.requestTimeout: 99999 

5、JavaAPI 访问集群

PUT cluster_test
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      }
    }
  }
}

GET cluster_test
GET cluster_test/_search

POST /cluster_test/_doc/1
{
  "name":"张三"
}

测试类  

 @Resource(name="clusterClient")
    RestHighLevelClient clusterClient;
 
 /**
     * 测试集群
     * @throws IOException
     */
    @Test
    public void testCluster() throws IOException {


        //设置查询的索引、文档
        GetRequest indexRequest=new GetRequest("cluster_test","1");

        GetResponse response = clusterClient.get(indexRequest, RequestOptions.DEFAULT);
        System.out.println(response.getSourceAsString());

    }

ElasticSearchConfig  

private String host1;

private int port1;

private String host2;

private int port2;

private String host3;

private int port3;

//get/set ...

@Bean("clusterClient")
    public RestHighLevelClient clusterClient(){
        return new RestHighLevelClient(RestClient.builder(
                new HttpHost(host1,port1,"http"),
                new HttpHost(host2,port2,"http"),
                new HttpHost(host3,port3,"http")
        ));
    }

 application.yml

elasticsearch:
   host: 192.168.140.130
   port: 9200
   host1: 192.168.140.130
   port1: 9201
   host2: 192.168.140.130
   port2: 9202
   host3: 192.168.140.130
   port3: 9203 

6、分片配置

  • 在创建索引时,如果不指定分片配置,则默认主分片1,副本分片1。
  • 在创建索引时,可以通过settings设置分片

 

 分片配置  

#分片配置
#"number_of_shards": 3, 主分片数量
#"number_of_replicas": 1  主分片备份数量,每一个主分片有一个备份
# 3个主分片+3个副分片=6个分片
PUT cluster_test1
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }, 
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      }
    }
  }

 1.三个节点正常运行(0、1、2分片标号)  

 2.itcast-3 挂掉  

 3.将挂掉节点的分片,自平衡到其他节点

4.itcast-3 恢复正常后,节点分片将自平衡回去(并不一定是原来的分片)   

分片与自平衡

  • 当节点挂掉后,挂掉的节点分片会自平衡到其他节点中

注意:分片数量一旦确定好,不能修改。

索引分片推荐配置方案:

1.每个分片推荐大小10-30GB

2.分片数量推荐 = 节点数量 * 1~3倍

思考:比如有1000GB数据,应该有多少个分片?多少个节点

1.每个分片20GB 则可以分为40个分片

2.分片数量推荐 = 节点数量 * 1~3倍 --> 40/2=20 即20个节点

7、路由原理

  • 文档存入对应的分片,ES计算分片编号的过程,称为路由。
  • Elasticsearch 是怎么知道一个文档应该存放到哪个分片中呢?
  • 查询时,根据文档id查询文档, Elasticsearch 又该去哪个分片中查询数据呢?
  • 路由算法 :shard_index = hash(id) % number_of_primary_shar

查询id为5的文档:假如hash(5)=17 ,根据算法17%3=2  

8、脑裂

ElasticSearch 集群正常状态:

  •  一个正常es集群中只有一个主节点(Master),主节点负责管理整个集群。如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。
  • 集群的所有节点都会选择同一个节点作为主节点。

脑裂现象:

  • 脑裂问题的出现就是因为从节点在选择主节点上出现分歧导致一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。  

脑裂产生的原因:

1.网络原因:网络延迟

  • 一般es集群会在内网部署,也可能在外网部署,比如阿里云。
  • 内网一般不会出现此问题,外网的网络出现问题的可能性大些。

2.节点负载

  • 主节点的角色既为master又为data。数据访问量较大时,可能会导致Master节点停止响应(假死状态)。

3.JVM内存回收

  • 当Master节点设置的JVM内存较小时,引发JVM的大规模内存回收,造成ES进程失去响应。

避免脑裂

1.网络原因:discovery.zen.ping.timeout 超时时间配置大一点。默认是3S

2.节点负载:角色分离策略

候选主节点配置为

  • node.master: true
  • node.data: false

数据节点配置为

  • node.master: false
  • node.data: true

3.JVM内存回收:修改 config/jvm.options 文件的 -Xms 和 -Xmx 为服务器的内存一半。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Elasticsearch是一种开源的分布式搜索和分析引擎,它可以用于快速搜索、分析和存储大量的数据。Elasticsearch集群是由多个节点组成的,每个节点都可以存储和处理数据。以下是关于Elasticsearch集群的一些介绍和演示: 1. 集群原理: Elasticsearch内置了一个名为ZenDiscovery的模块,用于节点发现和选主等功能。这意味着在启动Elasticsearch节点时,它们会自动加入集群,并通过选举机制选择一个主节点来协调集群操作。这使得构建和管理Elasticsearch集群变得非常简单,不需要额外的配置和第三方组件。 2. 单节点演示: 单节点是最简单的Elasticsearch集群配置,它只包含一个节点。以下是一个示例演示如何启动一个单节点的Elasticsearch集群: ```shell # 启动Elasticsearch节点 ./bin/elasticsearch ``` 在启动节点后,您可以使用Elasticsearch的REST API进行索引、搜索和其他操作。 3. 多节点演示: 多节点是更常见的Elasticsearch集群配置,它包含多个节点,可以提供更高的可用性和性能。以下是一个示例演示如何启动一个多节点的Elasticsearch集群: ```shell # 启动第一个节点 ./bin/elasticsearch # 启动其他节点,并指定第一个节点的地址 ./bin/elasticsearch -Ecluster.initial_master_nodes=node1 ``` 在启动所有节点后,它们会自动加入集群,并通过选举机制选择一个主节点来协调集群操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠然予夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值