elasticsearch 单节点 && 集群 && 健康检查安装
elasticsearch安装
ElasticSearch是一个基于Luncene的搜索服务器。它提供了一个分布式多用户能力全文搜索引擎,基于RESTful web接口,ElsticSearch使用Java开发的,并作为Apache许可下的开源码发布,是当前流行的企业级搜索引擎,设计用域云计算中,能够达到实时搜索,稳定可靠,快速安装的效果。
- Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。
- Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。
- Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。
人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。
我们建立一个网站或者应用程序,并要添加搜索功能,但是想要完成搜索工作的hi非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和完全免费的搜索模式,我们希望使用Json通过HTTp来索引数据,我们希望我们的搜索服务器始终可用,我们希望能从一台开始扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案,因此我们利用Elasticsearch类解决这些问题集可能出现的更多其它问题
官网:https://www.elastic.co/cn/products/elasticsearch
es基本概念
cluster
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
shards
代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
replicas
代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
recovery
代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
river
代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。
gateway
代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
discovery.zen
代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
Transport
代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)
安装java
安装java
elasticsearch和Logstash 的运行依赖于 Java 运行环境, Logstash 5.6 以上版本不低于 Oracle JDK version 1.8.0_131,7.0之后貌似对OpenJDK支持友好。
java -version #查看java版本,如果有信息返回说明已经有安装java
vm配置调整
调整最大打开文件数
elasticsearch要求65535否则报错
vi /etc/ssh/sshd_config
将# UseLogin no 改成 UseLogin yes,并重启 ssh
echo "* soft nofile 655350" >> /etc/security/limits.conf
echo "* hard nofile 655350" >> /etc/security/limits.conf
ulimit –Hu
ulimit -Su
调整可用内存
echo "vm.max_map_count=655360" >> /etc/sysctl.conf
sysctl -p
sysctl -a | grep max_map_count
rpm安装es(推荐)
创建用户
useradd elasticsearch
新建日志和数据目录
mkdir -p /home/admin/elk/elasticsearch
chown -R elasticsearch: /home/admin/elk/elasticsearch
下载安装包
cd /home/admin/elk/elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-x86_64.rpm
rpm -ivh elasticsearch-7.2.0-x86_64.rpm --nodeps
配置
vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-lvs #集群名称
node.name: elk-slave1 #另一台集群只有这个地方不一样,集群节点id,唯一
path.data: /home/admin/elk/elasticsearch/data #数据
path.logs: /home/admin/elk/elasticsearch/logs #日志
network.host: 192.168.40.128 #主机或IP
http.port: 9200 #http端口
cluster.initial_master_nodes: ["elk-slave1"] #设置默认master节点,7.0版本新特性,否则加入不了集群,很坑,head插件也用不了。集群中可以成为master节点的节点名,这里指定唯一的一个,防止脑裂
discovery.seed_hosts: ["192.168.40.128", "192.168.40.129"] #广播区域
修改elasticsearch的JVM内存
elasticesearch在实际生产中非常消耗cpu,需要将初始申请的JVM内存调高,默认是1G
vim /etc/elasticsearch/jvm.options
-Xms4g
-Xmx4g
启动
systemctl daemon-reload
systemctl start elasticsearch
systemctl enable elasticsearch
注意:如果你想部署es集群,然后偷懒scp拷贝的配置文件或者文件夹,需要注意文件的属主属组
如果文件权限不对,启动elasticsearch的时候会报错,甚至日志都不会打印(踩坑)
源码安装es
Elasticsearch的发展是非常快的,所以在ES5.0之前,ELK的各个版本都不统一,出现版本号混乱的状态,所以5.0开始,所有的ElasticStack中的项目全部统一版本号。目前最新的版本是7.4.2,我的实验也是基于这个版本完成
安装包下载
[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.4.2-linux-x86_64.tar.gz
[root@node1 src]# tar -xf elasticsearch-7.4.2-linux-x86_64.tar.gz
[root@node1 src]# mv elasticsearch-7.4.2 /usr/local/elasticsearch
修改配置文件
[root@node1 elasticsearch]# vi config/elasticsearch.yml
cluster.name: elk-lvs #集群名称
node.name: elk-slave1 #另一台集群只有这个地方不一样,集群节点id,唯一
path.data: /home/admin/elk/elasticsearch/data #数据
path.logs: /home/admin/elk/elasticsearch/logs #日志
network.host: 192.168.40.128 #主机或IP
http.port: 9200 #http端口
cluster.initial_master_nodes: ["elk-slave1"] #设置默认master节点,7.0版本新特性,否则加入不了集群,很坑,head插件也用不了。集群中可以成为master节点的节点名,这里指定唯一的一个,防止脑裂
discovery.seed_hosts: ["192.168.40.128", "192.168.40.129"] #广播区域
说明:在Elasticsearch中如果,network.host不是localhost或者127.0.0.1的话,就会认为是生产环境,会对环境的要求比较高,我们的测试环境不一定能够满足,一般情况下需要修该两处配置,如下
修改jvm参数
[root@node1 elasticsearch]# vi config/jvm.options
-Xms512m #根据自己情况进行修改
-Xmx512m
修改一个进程在VMAS(虚拟内存区域)创建内存映射的最大数量
[root@node1 elasticsearch]# vi /etc/sysctl.d/99-sysctl.conf
vm.max_map_count=655360
[root@node1 elasticsearch]# sysctl -p /etc/sysctl.d/99-sysctl.conf
vi config/jvm.options
#-XX:+UseConcMarkSweepGC
添加一个用户
[root@node1 elasticsearch]# useradd elasticsearch
[root@node1 elasticsearch]# vi /etc/security/limits.conf
添加如下参数
- soft nofile 65536
- hard nofile 131072
- soft nproc 2048
- hard nproc 4096
修改目录权限
[root@node1 elasticsearch]# chown -R elasticsearch:elasticsearch /usr/local/elasticsearch/
尝试使用普通用户启动
[root@node1 elasticsearch]# su elasticsearch -c "/usr/local/elasticsearch/bin/elasticsearch"
使用systemd脚本管理控制
写一个systemd控制脚本
[root@node1 elasticsearch]# vi /lib/systemd/system/elasticsearch.service
[Service]
Environment=ES_HOME=/usr/local/elasticsearch
Environment=ES_PATH_CONF=/usr/local/elasticsearch/config
Environment=PID_DIR=/usr/local/elasticsearch
WorkingDirectory=/usr/local/elasticsearch
User=elasticsearch
Group=elasticsearch
ExecStart=/usr/local/elasticsearch/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid --quiet
# StandardOutput is configured to redirect to journalctl since
# some error messages may be logged in standard output before
# elasticsearch logging system is initialized. Elasticsearch
# stores its logs in /var/log/elasticsearch and does not use
# journalctl by default. If you also want to enable journalctl
# logging, you can simply remove the "quiet" option from ExecStart.
StandardOutput=journal
StandardError=inherit
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Specifies the maximum number of processes
LimitNPROC=4096
# Specifies the maximum size of virtual memory
LimitAS=infinity
# Specifies the maximum file size
LimitFSIZE=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0
# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM
# Send the signal only to the JVM rather than its control group
KillMode=process
# Java process is never killed
SendSIGKILL=no
# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143
[root@node1 elasticsearch]# systemctl start elasticsearch
[root@node1 elasticsearch]# systemctl status elasticsearch
测试
curl 192.168.40.128:9200
页面访问:
优化
脑裂优化
vim /etc/elasticsearch/elasticsearch.yml
cluster.initial_master_nodes: ["elk-slave1"] #设置默认master节点,7.0版本新特性,否则加入不了集群,head插件也用不了。集群中可以成为master节点的节点名,这里指定唯一的一个,防止脑裂
discovery.zen.minimum_master_nodes: 2 #这个参数貌似在新版本中被优化掉了
脑裂是什么?
如果网络的故障导致一个集群被划分成两片,每片都有多个node,以及一个master。因为master是维护集群状态,以及shard的分配。如果出现了两个master,可能导致数据破损。discovery.zen.minimum_master_nodes的作用是只有足够的master候选节点时,才可以选举出一个master。该参数必须设置为集群中master候选节点的quorum数量。quorum的算法=master候选节点数量/2+1
举例:
1、如果有10个节点,都是data node,也是master的候选节点。则quorum=10/2+1=6
2、如果有3个master候选节点,100个数据节点。则quorum=3/2+1=2
3、如果有2个节点,都是data node,也是master的候选节点。则quorum=2/2+1=2(有问题)
如果其中一个节点挂了,那么master的候选节点只有一个,无法满足quorum数量。即无法选举出master。此时只能将quorum设置成1,但是设置为1有可能出现脑裂。
总结:一般es集群的节点至少要有3个,quorum设置为2
脑裂案例一:
两个同时重启后出现以下错误,选不出master,可能跟之前的历史数据有关系,我清空历史数据,重启就OK 了。
master not discovered or elected yet, an election requires a node with id
启动内存优化
vim /usr/lib/systemd/system/elasticsearch.service #可以最大化使用内存
[Service]
LimitMEMLOCK=infinity
vim /etc/elasticsearch/jvm.options #xmx和xms不要超过物理机器内存的一半
-Xms1g
-Xmx1g
修改完毕后重启 elasticsearch
/etc/elasticsearch/elasticsearch.yml # els的配置文件
/etc/elasticsearch/jvm.options # JVM相关的配置,内存大小等等
/etc/elasticsearch/log4j2.properties # 日志系统定义
/usr/share/elasticsearch # elasticsearch 默认安装目录
/var/lib/elasticsearch # 数据的默认存放位置
cat查看节点信息
es集群部署
es的集群部署很简单,就是再部署一个es,配置文件有两处不一样
node.name: elk-slave2
network.host: 192.168.40.129
启动后就是一个es集群
集群简单测试
测试slave节点
关掉node2节点
[root@node2 ~]# systemctl stop elasticsearch
数据还在,开启node2
[root@node2 ~]# systemctl start elasticsearch
观察
集群回复正常状态
测试主节点宕机,对集群影响
关闭主节点
五角星代表是主节点,圆点代表从节点
[root@node1 ~]# systemctl stop elasticsearch
可以看到node-1节点不在,master节点已经转移到node-2上,数据也分不到node-2和node-3上
恢复node-1
[root@node1 ~]# systemctl start elasticsearch
集群回复正常
查看集群信息
查看master节点
[root@node1 ~]# curl http://192.168.132.131:9200/_cat/master
9qVjdVSvSAGlZ7lpB9O78g 192.168.132.132 192.168.132.132 node-2
查看数据节点
[root@node1 ~]# curl -XGET http://127.0.0.1:9200/_cat/nodes?pretty
192.168.132.133 32 95 0 0.00 0.01 0.05 dilm - node-3
192.168.132.131 35 80 0 0.00 0.01 0.05 dilm - node-1
192.168.132.132 29 96 0 0.00 0.01 0.05 dilm * node-2
查看集群健康状态
[root@node1 ~]# curl localhost:9200/_cluster/health?pretty
{
"cluster_name" : "my-elktest-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 5,
"active_shards" : 15,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
其他的查看命令
[root@node1 ~]# curl localhost:9200/_cat
=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates
健康检查
shell监控
curl -sXGET http://10.6.76.28:9200/_cluster/health?pretty=true
页面插件
下面三种方法三选一即可
使用docker的集成好的elasticsearch-head
dockerrun -p 9100:9100 mobz/elasticsearch-head:5
docker容器下载成功并启动以后,运行浏览器打开http://localhost:9100/
使用git安装elasticsearch-head
# yum install -y npm
# git clone git://github.com/mobz/elasticsearch-head.git
# cd elasticsearch-head
# npm install
# npm run start
检查端口是否起来
netstat -antp |grep 9100
浏览器访问测试是否正常
http://IP:9100/
镜像: lmenezes/cerebro 内部9000端口
docker run -itd -p 9000:9000 --name es_head liwenchao1995/elasticsearchhead:v01