ES高性能集群
1. 集群规划
1.1 集群规划问题
1.需要多大规模的集群?
2.集群中的节点角色如何分配?
3.如何避免脑裂问题?
4.索引应该设置多少个分片?
5.分片应该设置几个副本?
1.2 我们需要多大规模的集群?
1.当前的数据量有多大?数据增长情况如何?
2.你的机器配置如何? cpu、多大内存、多大硬盘容量?
推算依据:来自官方建议
ES JVM heap最大32G.30G heap大概能处理的数据量10T。如果内存很大如128G,可在一台机器上运行多个ES节点实例。
1.3 集群中的节点角色如何分配?
-
节点角色
Master Node : 设置node.master: true时,节点可作为主节点
DataNode Node : 设置node.data: true时,可作为数据节点,默认值为true
lngest Node : 默认都是预处理节点,配置node.ingest:false来禁用
Coordinate Node : 将上两个配置设为false时,仅担任协调节点。 -
如何分配
小规模集群: 不需严格区分
中大规模集群(十个以上节点):应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,不互影响。如不会因协调角色负载过高而影响数据节点的能力。
1.4 如何避免脑裂问题?
脑裂是指,出现了多个master节点
为尽量避免脑裂,可配置
discovery.zen.minimum_master_nodes:(有master资格节点数/2)+1
常用做法(中大规模集群);
1、Master和 dataNode角色分开,配置奇数个master,如3
2、配置选举发现数,及延长ping master的等待时长
discovery.zen.ping_timeout: 30(默认值是3秒)
1.5 索引应该设置多少个分片?
思考:
- 分片对应的存储实体是什么?
答:Lucene的index - 分片是不是越多越好,分片过多有什么影响?
答:不是越多越好,过多会导致消耗过多的文件句柄和内存以及CPU资源。此外也会导致词频统计出现偏差(因为都拆分到不同的分片中去了)
1.6 索引应该设置多少个分片?
分片设置的可参考原则:
-
ElasticSearch推荐的最大JVM堆空间是30~32G,所以把你的分片最大容量限制为30GB,然后再对分片数量做合理估算。例如,你认为你的数据能达到200GB,推荐你最多分配7到8个分片。
-
在开始阶段,一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片。例如,如果你有3个节点,则推荐你创建的分片数最多不超过9(3x3)个。当性能下降时,增加节点,ES会平衡分片的放置。
-
对于基于日期的索引需求。并且对索引数据的搜索场景非常少。也许这些索引量将达到成百上千,但每个索引的数据量只有1GB甚至更小。对于这种类似场景,建议只需要为索引分配1个分片。
1.7 分片应该设置几个副本?
思考:
- 副本的用途是什么?
答:备份冗余数据,提供数据的可用性。提供数据查询的并发度。 - 集群规模没变的情况下副本过多会有什么影响?
答:会占用磁盘的存储。消耗写入的性能。消耗文件的句柄、内存和CPU等硬件的资源。
设置的基本原则:
- 为保证高可用,副本数设置为2即可。要求集群至少要有3个节点,来分开存放主分片、副本。
- 如发现并发量大时,查询性能会下降,可增加副本数,来提升并发查询能力。
2. 搭建ES集群
- 假设有以下三台服务器
192.168.1.6
192.168.1.8
192.168.1.9
-
按照 Linux安装Elasticsearch(ES) 中的方式安装ES,但是
elasticsearch.yml
先不要做太大的修改。 -
修改各台服务器的
elasticsearch.yml
- 第一台服务器:192.168.1.6
cluster.name: elasticsearch #集群名称
node.name: node-1 #节点名称
network.host: 192.168.1.6
http.port: 9200 # 这个端口如果没有变化,其实可以不用管,因为默认就是9200
discovery.zen.ping.unicast.hosts: ["192.168.1.6", "192.168.1.8", "192.168.1.9"]
discovery.zen.minimum_master_nodes: 2 # 因为这里共三台,那么 3/2+1 = 2
- 第二台服务器:192.168.1.8
cluster.name: elasticsearch #集群名称,这个要保证一致
node.name: node-2 #节点名称
network.host: 192.168.1.8
http.port: 9200 # 这个端口如果没有变化,其实可以不用管,因为默认就是9200
discovery.zen.ping.unicast.hosts: ["192.168.1.6", "192.168.1.8", "192.168.1.9"]
discovery.zen.minimum_master_nodes: 2 # 因为这里共三台,那么 3/2+1 = 2
- 第三台服务器: 192.168.1.9
cluster.name: elasticsearch #集群名称,这个要保证一致
node.name: node-3 #节点名称
network.host: 192.168.1.9
http.port: 9200 # 这个端口如果没有变化,其实可以不用管,因为默认就是9200
discovery.zen.ping.unicast.hosts: ["192.168.1.6", "192.168.1.8", "192.168.1.9"]
discovery.zen.minimum_master_nodes: 2 # 因为这里共三台,那么 3/2+1 = 2
- 注意,如果服务器的防火墙没有关闭的话,可能会集群创建失败,所以如果遇到这个问题,可以找你们的运维协助解决,或者关闭防火墙。这里我尝试管开发某一个指定端口,但是还是提示访问路由失败,关闭防火墙后,确定是可以成功访问的。
# root用户
systemctl stop firewalld
- 然后分别启动即可
cd bin
# 非后台启动
./elasticsearch
# 后台启动记得加上 -d,即的deamon的意思
./elasticsearch -d
6.这里要注意,安装的过程中,可能会遇到一些问题,这里大概描述一下并且大概讲述一下解决方法
-
问题一
出现该错误表示内存不够,可以修改config下的jvm.options文件把内存改小。
-
问题二
解决办法:
切换到root用户修改配置/etc/sysctl.conf
su root
vim /etc/sysctl.conf
加入
# 总之要大于262144
vm.max_map_count=655360
然后使其生效
sysctl -p
-
问题三
文件描述符太低,解决办法如下:
切换到root用户修改/etc/security/limits.conf
su root
vim /etc/security/limits.conf
加入,记得前面的 *
也是要输入的哦
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
- 访问测试一下
http://192.168.1.6:9200/_cat/nodes?v
http://192.168.1.6:9200/_cluster/health?pretty
3. ES集群架构
3.1 集群组成
-
首先启动的节点会自动成为主节点
-
第二个节点启动后会向第一个节点单播信息,然后将新的节点信息加入到节点一的集群元信息中,并且也会返回给节点二,记得cluster-name的名字一定要一致。如果又来了一个node3,那么其实执行的步骤也和节点的是一样。
- 如果node3 接收到了下面的请求信息,但是其本身是没有资格处理这个请求的,那么它会讲这个请求发送给node1,也就是master节点,由master来处理创建这个index请求。
- 上边的请求中,要创建的是三个分片和一个副本,一共是 3个分片加上3个副本共6个。此时master会根据一定的算法来决定这些分片和副本分别在哪个机器,并且记录到matser节点。然后master会通知不同的节点应该做什么操作,比如应该创建分片,或者副本等等。这些节点创建完成后悔通知主节点已经创建完成。主节点等待一定时间后就会向其他的节点反馈创建的情况,或者在等待时间内创建完了就会反馈给对应的节点。
-
最后将集群元信息同步到其他的机器。
4. 集群管理
4.1 x-pack
为集群提供安全防护、监控、告警、报告等功能的收费组件;6.3开始已开源,并并入了elasticsearch核心中。
- 开启x-pack试用
# 开启X-Pack试用
POST /_xpack/license/start_trial?acknowledge=true
返回结果
{
"acknowledged" : true,
"trial_was_started" : true,
"type" : "trial"
}
如果要看到效果,需要修改一些elasticsearch.yml的一些内容,即最后下面的内容:
xpack.security.enabled: true
- 设置内指用户密码,总之请设置好下面的一堆类型账号的账号和密码。
bin/elasticsearch-setup-passwords interactive
1.elastic
2.apm_system
3.kibana
4.logstash_system
5.beats_system
6.remote_monitoring_user
- 执行过程
[es@192 bin]$ ./elasticsearch-setup-passwords interactive
Your cluster health is currently RED.
This means that some cluster data is unavailable and your cluster is not fully functional.
It is recommended that you resolve the issues with your cluster before running elasticsearch-setup-passwords.
It is very likely that the password changes will fail when run against an unhealthy cluster.
Do you want to continue with the password setup process [y/N]y
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
-
再次尝试访问 192.168.1.6:9200 时已经需要输入账号和密码了,输入用户名elastic和对应的密码即可访问。
-
配置kibana的用户名和密码
先关闭kibana
[es@192 bin]$ ps -ef | grep kibana
es 3095 2134 0 05:26 pts/1 00:00:00 grep --color=auto kibana
[es@192 bin]$ netstat -tunple |grep 5601
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 1002 196473 17902/bin/../node/b
[es@192 bin]$ kill -9 17902
[es@192 bin]$ netstat -tunple |grep 5601
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
[es@192 bin]$
修改kibana的配置文件kibana.yml,最后加上下面的内容即可
elasticsearch.username: "elastic" # 这里是账号
elasticsearch.password: "elastic" # 这里是修改的密码哦
xpack.security.enabled: true
xpack.security.encryptionKey: "4297f44b13955235245b2497399d7a93"
重新启动kibana
nohup ./kibana &
这里说一下,如果启动失败的话,可能是因为yml中的下面的内容冲突了,解决办法就是要么改一下,要么删掉
kibana.index: ".kibana"
# 尝试改成下面的试试
# kibana.index: ".kibana2"
- 测试一下访问 192.168.1.6:5601,输入账号kibana和对应的密码即可访问
- 启用/禁用xpack的特性
启用/禁用x-pack中的特性
默认情况下xpack中的各种特性都是开启的. 你可以通过在elasticsearch.yml、kibana.yml、logstash.yml中配置来开启或关闭他们。
-
Security
简介
x-pack security 组件从下面三个方面为 ES stack 提供安全防护。
· Preventing unauthorized access with password protection, role-based access control, and IP filtering.
· Preserving the integrity of your data with message authentication and SSL/TLS encryption.
· Maintaining an audit trail so you know who’s doing what to your cluster and the data it stores.
内建用户
-
elastic
A built-in superuser. See <u>Built-in Roles</u>. -
kibana
The user Kibana uses to connect and communicate with Elasticsearch. -
logstash_system
The user Logstash uses when storing monitoring information in Elasticsearch.
内建角色
https://www.elastic.co/guide/en/x-pack/6.8/built-in-roles.html
- 多种方式进行用户管理
1、Rest API
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/security-api-users.html
GET /_xpack/security/user
GET /_xpack/security/user/<username>
DELETE /_xpack/security/user/<username>
POST /_xpack/security/user/<username>
PUT /_xpack/security/user/<username>
PUT /_xpack/security/user/<username>/_disable
PUT /_xpack/security/user/<username>/_enable
PUT /_xpack/security/user/<username>/_password
2、Kibana Management
用有系统管理权限的用户(如 elastic)登录kibana,在 management菜单中进行用户、角色管理。
-
Monitor
Monitor简介
监控从ES nodes、lostash nodes、kibana实例 收集数据,被监控的ES集群可以决定整个技术栈的监控日志存在什么地方,默认情况下,会存在被监控的ES集群中。但ES官方强烈建议,在生产环境试用Monitoring时,要将监控数据放到一个单独的ES集群。
1、可以避免生产问题导致监控系统失效
2、也能防止监控系统影响生产程序的性能。
开启monitor
1、在es中配置
xpack.monitoring.collection.enabled: true
2、打开监控界面
如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~