编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Elasticsearch的集群规划和X-Pack

wxchong 2024-07-23 21:13:30 开源技术 36 ℃ 0 评论

做集群规划的时候,我们通常会遇到这些问题。

1.我们需要多大规模的集群?

2.集群中的节点角色如何分配?

3.如何避免脑裂问题?

4.索引应该设置多少个分片?

5.分片应该设置几个副本?

那通常需要怎么做呢,第一问题:1、我们需要多大规模的集群?

首先需要考虑:

当前的数据量有多大?数据增长情况如何?你的机器配置如何?cpu、多大内存、多大硬盘容量?

推算的依据:

ES JVM heap 最大 32G 。30G heap 大概能处理的数据量10 T。如果内存很大如128G,可在一台机器上运行多个ES节点实例。

集群规划满足当前数据规模+适量增长规模即可,后续可按需扩展。

两类应用场景:

1.用于构建业务搜索功能模块,且多是垂直领域的搜索。数据量级几千万到数十亿级别。一般2-4台机器的规模。

2.用于大规模数据的实时OLAP(联机处理分析),经典的如ELK Stack,数据规模可能达到千亿或更多。几十到上百节点的规模。

2、集群中的节点角色如何分配?

节点角色:

Master

node.master: true 节点可以作为主节点

DataNode

node.data: true 默认是数据节点。

Coordinate node 协调节点

如果仅担任协调节点,将上两个配置设为false。

一个节点可以充当一个或多个角色,默认三个角色都有。

如何分配:

1.小规模集群,不需严格区分。

2.中大规模集群(十个以上节点),应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,不互影响。如不会因协调角色负载过高而影响数据节点的能力。

3、如何避免脑裂问题?

尽量避免脑裂,配置:

discovery.zen.minimum_master_nodes: (有master资格节点数/2) + 1。

这个参数控制的是,选举主节点时需要看到最少多少个具有master资格的活节点,才能进行选举。官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量。

常用做法(中大规模集群):

1.Master 和 dataNode 角色分开,配置奇数个master,如3。

Bash
node.master: true  //主节点
node.data: false//数据节点

2.单播发现机制,配置master资格节点。

Bash
discovery.zen.ping.multicast.enabled: false  
discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"] 

3.配置选举发现数,及延长ping master的等待时长。

discovery.zen.ping_timeout: 30(默认值是3秒)
discovery.zen.minimum_master_nodes: 2

4、索引应该设置多少个分片?

首先这几个思考问题:

1.分片对应的存储实体是什么?

2.分片是不是越多越好?

3.分片多有什么影响?

分片并不是越多越好,分片过多的影响:

  • 每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源。
  • 每个搜索请求会调度到索引的每个分片中,如果分片分散在不同的节点倒是问题不大, 但当分片开始竞争相同的硬件资源时, 性能便会逐步下降。
  • ES使用词频统计来计算相关性,当然这些统计也会分配到各个分片上。如果在大量分片上只维护了很少的数据, 则将导致最终的文档相关性较差。

分片设置的可参考原则:

  • ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 推荐你最多分配7到8个分片。
  • 在开始阶段, 一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片. 例如,如果你有3个节点, 则推荐你创建的分片数最多不超过9(3x3)个。当性能下降时,增加节点,ES会平衡分片的放置。
  • 对于基于日期的索引需求, 并且对索引数据的搜索场景非常少. 也许这些索引量将达到成百上千, 但每个索引的数据量只有1GB甚至更小. 对于这种类似场景, 建议只需要为索引分配1个分片

分片数指定后不可变,除非重索引。

5、分片应该设置几个副本?

首先思考:

副本的用途是什么?

针对它的用途,我们该如何设置它的副本数?

集群规模没变的情况下副本过多会有什么影响?

基本原则:

1.为保证高可用,副本数设置为2即可。要求集群至少要有3个节点,来分开存放主分片、副本。

2.如发现并发量大时,查询性能会下降,可增加副本数,来提升并发查询能力。

副本数是可以随时调整的

监控API

我们可以通过Es提供的这些api来查看集群的索引,节点,分片等的情况。

GET  /_cat...

/_cat/health
/_cat/nodes
/_cat/master
/_cat/indices
/_cat/allocation 
/_cat/shards 
/_cat/shards/{index}
/_cat/thread_pool
/_cat/segments 
/_cat/segments/{index}

我们也可以通过其他的组件来查看,例如:X-Pack。

X-Pack

X-Pack 是一个Elastic Stack 的扩展组件包,将 security, alerting, monitoring, reporting, and graph 功能打在一个易于安装的包中。X-Pack组件被设计成无缝地协同工作,但是您可以很容易地启用或禁用您想要使用的特性。部分组件是收费的。

官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/installing-xpack-es.html

对于Elasticsearch 5.0.0以前的版本,你需要一个一个安装 Shield, Watcher, and Marvel 这些被统一打在X-Pack包中的插件。还需要选对这些插件的版本,使用x-pack就只需要选择和Elasticsearch版本一致的即可。

这里用的版本:6.2.4。其中包含的功能组件:

Security:为ES stack 提供安全防护。

Alerting:提供告警能力,让你实时获知集群的异常状态。

Monitoring:提供ES stack的监控能力,一目了然掌握集群的健康状况,及故障诊断。

Reporting:能够为任何 Kibana 可视化或仪表板快速生成报告。您可以即需即取报告、预约报告、根据特定条件触发报告,并自动将报告分享给指定的人员。

Graph:提供分析数据间关系的功能。

Machine Learning:提供机器学习能力。

SQL:6.3.0版本新推出的SQL查询能力,让我们可以通过写SQL来进行查询。

安装&配置

前置条件:先得安装elasticsearch、kibana。如果想在Logstash中也使用x-pack,先安装logstash。

安装流程:

在elasticsearch上安装x-pack

流程:

操作步骤:

1、 安装 x-pack

如果你的机器能访问外网,可以直接用如下命令进行安装:

Linux:bin/elasticsearch-plugin install x-pack
Windows:bin/elasticsearch-plugin.bat install x-pack

如果不能访问外网,则将x-pack的包下载下来,在安装命令中用 file指定安装包文件

下载地址:https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.2.4.zip

kibana和logstash的插件也在这个包中。

安装命令:bin/elasticsearch-plugin install file:///path/to/file/x-pack-6.2.4.zip

安装过程中,会向你确认向 x-pack 附加权限。可在安装命令上带--batch 选项自动授权。

安装完成后会在es中自动创建如下索引(这要求你的es中的允许自动创建索引打开,action.auto_create_index in elasticsearch.yml)

action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*

x-pack工作过程中的数据也会存到集群中。

2、 配置加密传输(TSL/SSL)

这个特性是收费的。

需要在各个节点上创建证书,并启用TSL

3、 启动/重启elasticsearch

bin/elasticsearch

4、 为内建的初始用户 elastic kibana logstash 设置密码

bin/x-pack/setup-passwords interactive,交互式的为三个用户设置密码

在 kibana 上安装 x-pack

流程:

步骤命令:

1、 安装 x-pack

如果你的机器能访问外网,可以直接用如下命令进行安装:

Linux:bin/kibana-plugin install x-pack
Windows:bin/kibana-plugin.bat install x-pack

如果不能访问外网,则将x-pack的包下载下来。

安装命令:bin/kibana-plugin install file:///path/to/file/x-pack-6.2.4.zip

The Kibana server needs to be able to write to files in the optimize directory. If you’re using

sudo or su, run the plugin installation as the built-in kibana user. For example:

sudo -u kibana bin/kibana-plugin install x-pack

2、 在kibana的配置文件 kibana.yml中配置内建用户kibana的密码

elasticsearch.username: "kibana"
elasticsearch.password: "kibanapassword" 

3、 启动/重启kibana

4、 以有kibana_user角色的用户登录 http://localhost:5601

在 logstash 上安装 x-pack

在logstash上安装 x-pack是可选的。如果你想安装,流程如下。如果不安装,为了让logstash能访问elasticsearch索引数据,只需在配置文件logstash.yml中配置访问es的用户密码(下图的步骤2)。

流程:

步骤命令:

1、 安装 x-pack

如果你的机器能访问外网,可以直接用如下命令进行安装:

Linux:bin/logstash-plugin install x-pack
Windows:bin/logstash-plugin.bat install x-pack

如果不能访问外网,则将x-pack的包下载下来。

安装命令:bin/logstash-plugin install file:///path/to/file/x-pack-6.2.4.zip

2、 在logstash的配置文件 logstash.yml中配置内建用户logstash_system的密码

xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: logstashpassword

3、 启动/重启logstash

启用/禁用x-pack中的特性

可以在elasticsearch.yml,kibana.yml和logstash.yml配置文件中启用或禁用特定的X-Pack功能。

xpack.graph.enabled:设置为false以禁用X-Pack的graph功能

xpack.ml.enabled:设置为false以禁用X-Pack的机械学习功能

xpack.monitoring.enabled:设置为false以禁用X-Pack的monitoring功能

xpack.reporting.enabled:设置为false以禁用X-Pack的reporting功能

xpack.security.enabled:设置为false以禁用X-Pack的security功能

xpack.watcher.enabled:设置为false以禁用X-Pack的watcher功能

卸载 x-pack

1. Stop Elasticsearch

2. Remove X-Pack from Elasticsearch:

bin/elasticsearch-plugin remove x-pack

3. Restart Elasticsearch

4. Remove X-Pack from Kibana:

bin/kibana-plugin remove x-pack

5. Restart Kibana

6. Remove X-Pack from Logstash:

bin/logstash-plugin remove x-pack

7. Restart Logstash

Client中加入 x-pack

Java client中加入x-pack:

1、在工程的pom文件中加入x-pack的jar依赖。需从elasticsearch的maven库上获取。如果无法从maven库中获取。则从官网上的地址下载对应的jar包。

bcpkix-jdk15on-1.58.jar,bcprow-jdk15on-1.58.jar,unboundid-Idapsdk-3.2.0.jar,x-pack-core-6.2.4.jar,x-pack-transport-6.2.4.jar

2、如果使用的是Maven,则需要将X-Pack JAR文件作为依赖项添加到项目的pom.xml文件中:

<project ...>
     <repositories>
     <!-- add the elasticsearch repo -->
      <repository>
         <id>elasticsearch-releases</id>
         <url>https://artifacts.elastic.co/maven</url>
         <releases>
          <enabled>true</enabled>
         </releases>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
      </repository>
      ...
   </repositories>
   ...

   <dependencies>
      <!-- add the x-pack jar as a dependency -->
      <dependency>
         <groupId>org.elasticsearch.client</groupId>
         <artifactId>x-pack-transport</artifactId>
              <version>{version}</version>
      </dependency>
      ...
   </dependencies>
   ...

</project>

客户端改用x-pack的,并指定对应的用户名密码

TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
        .put("cluster.name", "myClusterName")
        .put("xpack.security.user", "transport_client_user:x-pack-test-password")
        ...
        .build())
    .addTransportAddress(new TransportAddress("localhost", 9300))
    .addTransportAddress(new TransportAddress("localhost", 9301));

High level REST client

在构造High level client实例时,通过setHttpClientConfigCallback方法加入认证信息:

final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
	credentialsProvider.setCredentials(AuthScope.ANY,
			new UsernamePasswordCredentials("elastic", "123456"));

RestHighLevelClient client = new RestHighLevelClient(
	RestClient.builder(new HttpHost("localhost", 9200, "http"),
			new HttpHost("localhost", 9201, "http"))
		.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
			@Override
			public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
				return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
			}
		}));

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表