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"

image

使用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
image

测试

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
image

数据还在,开启node2

[root@node2 ~]# systemctl start elasticsearch

观察
image

集群回复正常状态

测试主节点宕机,对集群影响

关闭主节点

五角星代表是主节点,圆点代表从节点

[root@node1 ~]# systemctl stop elasticsearch
image

可以看到node-1节点不在,master节点已经转移到node-2上,数据也分不到node-2和node-3上

恢复node-1

[root@node1 ~]# systemctl start elasticsearch
image

image

集群回复正常

查看集群信息

查看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

posted @ 2022-03-17 15:08  liwenchao1995  阅读(276)  评论(0编辑  收藏  举报