做集群规划的时候,我们通常会遇到这些问题。
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。
node.master: true //主节点
node.data: false//数据节点
2.单播发现机制,配置master资格节点。
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);
}
}));
本文暂时没有评论,来添加一个吧(●'◡'●)