一.elasticsearch简介
官网:https://www.elastic.co/cn/
Elasticsearch 是一个开源的分布式搜索分析引擎,建立在一个全文搜索引擎库 Apache Lucene基础之上。Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎:
- 一个分布式的实时文档存储,每个字段 可以被索引与搜索
- 一个分布式实时分析搜索引擎
- 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
- 与文档型数据库mongo相比,ES的文档查询与聚合性能更强,集群分片副本的架构更优。
特点:分布式,零配置,自动发现,索引自动分片,索引副本机制,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 ##主机名需要解析
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
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
Job for elasticsearch.service failed because the control process exited with error code. See "systemctl status elasticsearch.service" and "journalctl -xe" for details.
[root@server1 elasticsearch]# cd /var/log/elasticsearch/
[root@server1 elasticsearch]# cat my-es.log ##查看日志
需要设置限制值:
vim /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimitedelasticsearch - nproc 4096 ##noproc 是代表最大进程数
elasticsearch - nofile 65535 ##nofile 是代表最大文件打开数
不限制最大锁定内存地址空间
[root@server1 elasticsearch]# vim /etc/fstab ##注释掉swap分区
[root@server1 elasticsearch]# swapoff -a ##关闭swap分区
[root@server1 elasticsearch]# vim /usr/lib/systemd/system/elasticsearch.service
LimitMEMLOCK=infinity ###在service语句块下添加
[root@server1 elasticsearch]# sysctl vm.max_map_count
vm.max_map_count = 262144
设置完成,重新启动服务
[root@server1 elasticsearch]# systemctl daemon-reload
[root@server1 elasticsearch]# systemctl restart elasticsearch.service
[root@server1 elasticsearch]# netstat -antlup ##9200端口是否开启
[root@server1 elasticsearch]# curl localhost:9200
同理,在server2、server3中都安装设置好elasticsearch
在server2、server3中安装好elasticsearch后(rpm -ivh elasticsearch-7.6.1-x86_64.rpm)将配置文件复制给2、3
[root@server1 elasticsearch]# ssh-keygen
[root@server1 elasticsearch]# ssh-copy-id server2
[root@server1 elasticsearch]# ssh-copy-id server3
[root@server1 elasticsearch]# pwd
/var/log/elasticsearch
[root@server1 elasticsearch]# 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]# scp -p elasticsearch.yml server2:/etc/elasticsearch/
elasticsearch.yml
[root@server1 elasticsearch]# scp /etc/security/limits.conf server2:/etc/security/limits.conf
同理修改配置文件、关闭swap分区 :
设置完成后检测一下:
在server3中执行相同的操作:
elasticsearch查看日志的命令是 cat /var/log/elasticsearch/my-es.log
三、elasticsearch插件安装
安装一个图形化插件
这里选择用容器的方法安装
[westos@foundation52 Desktop]$ podman pull docker.io/lmenezes/cerebro
[westos@foundation52 Desktop]$ podman images
[westos@foundation52 Desktop]$ podman run -d --name cerebro -p 9000:9000 docker.io/lmenezes/cerebro
[westos@foundation52 Desktop]$ podman ps -a
[westos@foundation52 Desktop]$ podman start cerebro
cerebro
[westos@foundation52 Desktop]$ podman ps
前端可以看到页面
用http://172.25.52.1:9200登陆
可以看到集群的三台主机以及状态,master为server1
同样用容器的方法拉取head,注意需要修改配置文件
[westos@foundation52 Desktop]$ podman pull docker.io/mobz/elasticsearch-head:5
[westos@foundation52 Desktop]$ podman run -d --name head -p 9100:9100 docker.io/mobz/elasticsearch-head:5
[westos@foundation52 Desktop]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/lmenezes/cerebro latest 045d7f40bf06 6 months ago 289 MB
docker.io/mobz/elasticsearch-head 5 b19a5c98e43b 4 years ago 862 MB
[westos@foundation52 Desktop]$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09953f863cd7 docker.io/mobz/elasticsearch-head:5 /bin/sh -c grunt ... About a minute ago Up About a minute ago 0.0.0.0:9100->9100/tcp head
e45158a31e9a docker.io/lmenezes/cerebro:latest About an hour ago Up About an hour ago 0.0.0.0:9000->9000/tcp cerebro
[westos@foundation52 Desktop]$
访问172.25.52.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 ~]# yum install -y unzip
[root@server1 ~]# unzip elasticsearch-head-master.zip
[root@server1 ~]# cd elasticsearch-head-master/
[root@server1 elasticsearch-head-master]# ls
[root@server1 elasticsearch-head-master]# yum install -y bzip2
[root@server1 elasticsearch-head-master]# cnpm install
[root@server1 elasticsearch-head-master]# netstat -antlup | grep :9200
[root@server1 elasticsearch-head-master]# cnpm run start & ##开启打入后台
[root@server1 elasticsearch-head-master]# vim /etc/elasticsearch/elasticsearch.yml
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@server1 elasticsearch-head-master]# vim /etc/elasticsearch/elasticsearch.yml
[root@server1 elasticsearch-head-master]# systemctl restart elasticsearch.service
9200端口开启
访问172.25.52.1:9100可以建立索引
四、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集群状态
[root@server1 elasticsearch-head-master]# cd /etc/elasticsearch/
[root@server1 elasticsearch]# vim elasticsearch.yml
# Use a descriptive name for the node:
#
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]# cd /usr/share/elasticsearch/
[root@server1 elasticsearch]# cd bin/
[root@server1 bin]# ls
[root@server1 bin]# systemctl stop elasticsearch.service
[root@server1 bin]# ./elasticsearch-node repurpose
优化server2和server3,让2、3可以存储数据但不可以进行预处理
[root@server2 ~]# cd /etc/elasticsearch/
[root@server2 elasticsearch]# vim elasticsearch.yml
node.name: server2
node.master: true
node.data: true
node.ingest: false
node.ml: false
[root@server2 elasticsearch]# systemctl restart elasticsearch.service
[root@server3 elasticsearch]# vim /etc/elasticsearch/elasticsearch.yml
node.name: server3
node.master: true
node.data: true
node.ingest: false
node.ml: false
[root@server3 elasticsearch]# systemctl restart elasticsearch.service
访问http://172.25.52.1:9100/ 查看调整后的ES集群状态