目录
一、elasticsearch简介
官网:https://www.elastic.co/cn/
Elasticsearch 是一个开源的分布式搜索分析引擎,建立在一个全文搜索引擎库 Apache Lucene基础之上。
Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎:
- 一个分布式的实时文档存储,每个字段 可以被索引与搜索
- 一个分布式实时分析搜索引擎
- 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负载等。
elasticsearch应用场景:
- 信息检索
- 日志分析
- 业务数据分析
- 数据库加速
- 运维指标监控
二、elasticsearch安装与配置
软件下载
软件安装
[root@server1 ~]# rpm -ivh elasticsearch-7.6.1-x86_64.rpm
[root@server1 ~]# systemctl daemon-reload
修改配置文件
[root@server1 ~]# cd /etc/elasticsearch/
[root@server1 elasticsearch]# ls
elasticsearch.keystore jvm.options role_mapping.yml users
elasticsearch.yml log4j2.properties roles.yml users_roles
[root@server1 elasticsearch]# vim elasticsearch.yml
cluster.name: my-es #集群名称
node.name: server1 #主机名需要解析
bootstrap.memory_lock: true #锁定内存分配
network.host: 0.0.0.0 #主机ip
http.port: 9200 #http服务端口
discovery.seed_hosts: ["server1", "server2","server3"]
cluster.initial_master_nodes: ["server1", "server2","server3"]
此时执行开启命令会报错[root@server1 elasticsearch]# systemctl start elasticsearch.service
我们查看日志
[root@server1 elasticsearch]# cd /var/log/elasticsearch/
[root@server1 elasticsearch]# cat my-es.log
需要设置限制值
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch – nproc 4096 ##noproc 是代表最大进程数
elasticsearch – nofile 65535 ##nofile 是代表最大文件打开数
不限制最大锁定内存地址空间
[root@server1 elasticsearch]# vim /usr/lib/systemd/system/elasticsearch.service
LimitMEMLOCK=infinity #在service语句块下添加
关闭swap分区
[root@server1 elasticsearch]# swapoff -a
[root@server1 elasticsearch]# vim /etc/fstab ##注释掉swap分区
设置完成,重新启动服务
[root@server1 elasticsearch]# systemctl daemon-reload
[root@server1 elasticsearch]# systemctl restart elasticsearch.service
可以看到9200端口开启
同理,在server2、server3中都安装设置好elasticsearch
在server2、server3中安装好elasticsearch后(rpm -ivh elasticsearch-7.6.1-x86_64.rpm)将配置文件复制给2、3
[root@server1 elasticsearch]# cd /etc/elasticsearch/
[root@server1 elasticsearch]# scp -p elasticsearch.yml server2:/etc/elasticsearch/
elasticsearch.yml 100% 2854 963.0KB/s 00:00
[root@server1 elasticsearch]# scp -p elasticsearch.yml server3:/etc/elasticsearch/
elasticsearch.yml 100% 2854 1.3MB/s 00:00
[root@server1 elasticsearch]# scp /etc/security/limits.conf server2:/etc/security/limits.conf
limits.conf 100% 2552 686.2KB/s 00:00
[root@server1 elasticsearch]# scp /etc/security/limits.conf server3:/etc/security/limits.conf
limits.conf 100% 2552 798.4KB/s 00:00
同理修改配置文件、关闭swap分区
设置完成后见检测
可以在server1中查看到1与2、3都已相连接
elasticsearch查看日志的命令是 cat /var/log/elasticsearch/my-es.log
三、elasticsearch插件安装
安装一个图形化插件
这里选择用容器的方法安装
[root@foundation37 ~]# podman pull docker.io/lmenezes/cerebro
[root@foundation37 ~]# podman run -d --name cerebro -p 9000:9000 docker.io/lmenezes
[root@foundation37 ~]# podman ps -a
[root@foundation37 ~]# podman start cerebro
[root@foundation37 ~]# podman ps
前端可以看到页面
用http://172.25.6.1:9200登陆
可以看到集群的三台主机以及状态
master为server1
同样用容器的方法拉取head,注意需要修改配置文件
podman pull docker.io/mobz/elasticsearch-head:5
podman run -d --name head -p 9100:9100 docker.io/mobz/elasticsearch-head:5
[root@server1 elasticsearch]# vim elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@server1 elasticsearch]# systemctl restart elasticsearch.service
访问172.25.6.250:9100
另一种方法:直接安装head插件
下载elasticsearch-head插件:wget https://github.com/mobz/elasticsearch-head/archive/master.zip
head插件本质上是一个nodejs的工程,因此需要安装node:https://mirrors.tuna.tsinghua.edu.cn/nodesource/rpm_9.x/el/7/x86_64/nodejs-9.11.2-1nodesource.x86_64.rpm
[root@server1 ~]# rpm -ivh nodejs-9.11.2-1nodesource.x86_64.rpm
[root@server1 ~]# npm -v
5.6.0
[root@server1 ~]# node -v
v9.11.2
[root@server1 ~]# npm install -g cnpm --registry=https://registry.npm.taobao.org
[root@server1 ~]# unzip elasticsearch-head-master.zip
[root@server1 ~]# cd elasticsearch-head-master/
[root@server1 elasticsearch-head-master]# cnpm install
[root@server1 elasticsearch-head-master]# netstat -antlp| grep :9200
[root@server1 elasticsearch]# vim elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@server1 elasticsearch-head-master]# cnpm run start &
9200端口开启
访问172.25.6.1:9100可以建立索引
在前端我们可以建立一个demo
四、elasticsearch节点角色
• Master:
主要负责集群中索引的创建、删除以及数据的Rebalance等操作。
Master不负责数据的索引和检索,所以负载较轻。当Master节点失联或者挂掉的时候,ES集群会自动从其他Master节点选举出一个Leader。• Data Node:
主要负责集群中数据的索引和检索,一般压力比较大。• Coordinating Node:
原来的Client node的,主要功能是来分发请求和合并结果的。所有节点默认就是Coordinating node,且不能关闭该属性。• Ingest Node:
专门对索引的文档做预处理
五、ES集群
Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的
Node:节点(简单理解为集群中的一个服务器),集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。
Index:索引(简单理解就是一个数据库),包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。
六、elasticsearch节点优化
在生产环境下,如果不修改elasticsearch节点的角色信息,在高数据量,高并发的场景下集群容易出现脑裂等问题。
默认情况下,elasticsearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。
节点角色是由以下属性控制:
• node.master: false|true
• node.data: true|false
• node.ingest: true|false
• search.remote.connect: true|false
默认情况下这些属性的值都是true
node.master:
这个属性表示节点是否具有成为主节点的资格
注意:此属性的值为true,并不意味着这个节点就是主节点。因为真正的主节点,是由多个具有主节点资格的节点进行选举产生的。
node.data:
这个属性表示节点是否存储数据。
node.ingest:
是否对文档进行预处理。
search.remote.connect:
是否禁用跨集群查询
组合:
第一种组合:(默认)
• node.master: true
• node.data: true
• node.ingest: true
• search.remote.connect: true
这种组合表示这个节点即有成为主节点的资格,又存储数据。
如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。
测试环境下这样做没问题,但实际工作中不建议这样设置。第二种组合:(Data node)
• node.master: false
• node.data: true
• node.ingest: false
• search.remote.connect: false
这种组合表示这个节点没有成为主节点的资格,也就不参与选举,只会存储数据。
这个节点称为data(数据)节点。在集群中需要单独设置几个这样的节点负责存储数据。后期提供存储和查询服务。第三种组合:(master node)
• node.master: true
• node.data: false
• node.ingest: false
• search.remote.connect: false
这种组合表示这个节点不会存储数据,有成为主节点的资格,可以参与选举,有可能成为真正的主节点。
这个节点我们称为master节点。第四种组合:(Coordinating Node)
• node.master: false
• node.data: false
• node.ingest: false
• search.remote.connect: false
这种组合表示这个节点即不会成为主节点,也不会存储数据,
这个节点的意义是作为一个协调节点,主要是针对海量请求的时候可以进行第五种组合:(Ingest Node)
• node.master: false
• node.data: false
• node.ingest: true
• search.remote.connect: false
这种组合表示这个节点即不会成为主节点,也不会存储数据,
这个节点的意义是ingest节点,对索引的文档做预处理。
生产集群中可以对这些节点的职责进行划分
• 建议集群中设置3台以上的节点作为master节点,这些节点只负责成为主节点,维护整个集群的状态。
• 再根据数据量设置一批data节点,这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大。
• 所以在集群中建议再设置一批协调节点,这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。
节点需求
• master节点:普通服务器即可(CPU、内存 消耗一般)
• data节点:主要消耗磁盘、内存。
• path.data: data1,data2,data3
这样的配置可能会导致数据写入不均匀,建议只指定一个数据路径,磁盘可以使用raid0阵列,而不需要成本高的ssd。
• Coordinating节点:对cpu、memory要求较高。
调整ES集群状态
server1中
[root@server1 elasticsearch]# vim /etc/elasticsearch/elasticsearch.yml
node.name: server1
node.master: true
node.data: false
node.ingest: true
node.ml: false
#
[root@server1 elasticsearch]# systemctl restart elasticsearch.service
Job for elasticsearch.service failed because the control process exited with error code. See "systemctl status elasticsearch.service" and "journalctl -xe" for details.
重启服务失败,因为我们之前在server1中建立了索引,而此时设置不可以储存数据,所以我们需要先清理server1上的数据。看日志可以得知如何清理
[root@server1 elasticsearch]# cat /var/log/elasticsearch/my-es.log
[root@server1 bin]# ./elasticsearch-node repurpose
[root@server1 ~]# systemctl start elasticsearch
同理,优化server2和server3,让2、3可以存储数据但不可以进行预处理
node.name: server2
node.master: true
node.data: true
node.ingest: false
node.ml: false
调整后的ES集群状态