elasticsearch集群

一 什么是搜索引擎

  • 就是根据客户需求,运用一定的算法将数据通过检索的方式呈现给客户

二 倒排索引

  • 将一段文本按照一定的规则,进行分词,拆分成不同的词条然后记录词条和数据的唯一标识(ID)关系。
  • 举例
    假如我们在jd搜索“手机”关键词,此时我们是客户端服务端会显示各种品牌手机,其名称各种各样,如华为手机、诺基亚手机、苹果手机等,这个时候服务端就将“xx手机”拆分为词条,服务端将搜索该词条返回给客户端

三 elasticsearch概念

ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

四 elasticsearch核心概念

  • 索引:es存储数据的地方,可以理解为关系型数据库中的数据库
  • 映射:定义了每个字段的类型,可以理解为关系型数据库中的表结构
  • 文档:es中的最小数据单元,常以json格式显示,一个文档相当于关系型数据库中的一行数据
  • 倒排索引:将一段文本按照一定的规则,进行分词,拆分成不同的词条然后记录词条和数据的唯一标识(ID)关系。
  • 类型:一种type相当于一张表
    1:es5中一个index可以有多个type。
    2:es6中一个index只能由一个type。
    3:es7中已经移除了type,默认_doc。

五elasticsearch使用场景

  • 原文连接
https://blog.csdn.net/laoyang360/article/details/52227541
  • 总结:es在整个架构中充当的角色为“搜索引擎”的角色,需要将数据库中的数据实时同步到es中,供给客户端检索

六 elasticsearch官网

https://www.elastic.co/

七 安装es

  • 版本:elasticsearch-7.4.0
  • es是基于jdk环境,但是es在部署中包含了jdk环境,无需我们再次安装,并且es对应jdk版本环境,推荐使用其包含的jdk版本

1. 上传解压

tar xvf elasticsearch-7.4.0-linux-x86_64.tar.gz -C ~/APP

2. 修改配置文件

cat << EOF >> /home/finance/APP/elasticsearch-7.4.0/config/elasticsearch.yml
#配置elasticsearch集群名称,建议修改成一个有意义的名称。
cluster.name: elasticsearch
#节点名称,elasticsearch会随机指定一个名称,建议修改成一个有意义的名称,方便管理。
node.name: node-1
#设置为0.0.0.0允许外网访问。
network.host: 0.0.0.0
#es的http端口
http.port: 9200
#初始化集群的时候需要此配置来进行master选举
cluster.initial_master_nodes: ["node-1"]
#数据目录位置
path.data: /home/finance/data/es7
#日志路径
path.logs: /home/finance/logs/es7
EOF

2.1 其他可配置参数

参数 说明
cluster.name 配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。
node.name 节点名,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
path.conf 设置配置文件的存储路径,tar或zip包安装默认在es根目录下的config文件夹,rpm安装默认在/etc/ elasticsearch
path.data 设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开
path.logs 设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins 设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrap.memory_lock 设置为true可以锁住ES使用的内存,避免内存进行swap
network.host 设置bind_host和publish_host,设置为0.0.0.0允许外网访问
http.port 设置对外服务的http端口,默认为9200。
transport.tcp.port 集群结点之间通信端口
discovery.zen.ping.timeout 设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些
discovery.zen.minimum_master_nodes 主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这里要设置为2

3.优化系统参数

  • 使用root用户
#修改limit最大打开数量
cat << EOF >> /etc/security/limits.conf 
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
EOF

#修改最大虚拟内存大小
cat << EOF >> /etc/sysctl.conf
vm.max_map_count=655360
fs.file-max=655360
EOF

#生效配置
sysctl -p

4.优化jvm参数

#将默认的1G改为512,也可根据业务需求更改
vim config/jvm.options
-Xms512m
-Xmx512m

5. 配置环境变量并启动

  • 为了安全起见,es不允许root用户启动。
echo 'export PATH=$PATH:/home/finance/APP/elasticsearch-7.4.0/bin' >> /etc/profile.d/elasticsearch.sh
source /etc/profile.d/elasticsearch.sh

#启动
elasticsearch -d

#验证,也可使用web页面
curl -I localhost:9200

八 es索引相关操作

1.接口请求方式

  • Get 向特定资源发出请求(请求指定页面信息,并返回实体主体)
  • Post 向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改
  • Put 向指定资源位置上上传其最新内容(从客户端向服务器传送的数据取代指定文档的内容)
  • Head 与服务器索与get请求一致的相应,响应体不会返回,获取包含在小消息头中的原信息(与get请求类似,返回的响应中没有具体内容,用于获取报头)
  • Delete 请求服务器删除request-URL所标示的资源*(请求服务器删除页面)
  • Trace 回显服务器收到的请求,用于测试和诊断
  • opions 返回服务器针对特定资源所支持的HTML请求方法 或web服务器发送*测试服务器功能(允许客户端查看服务器性能)

2. es常用接口请求

  • 工具为postman

  • get:查

  • put:增

  • post:改

  • delete:删

2.1 增加索引

elasticsearch集群

2.2 查看索引

elasticsearch集群

2.3 删除索引

elasticsearch集群

2.4 关闭索引

elasticsearch集群

2.5 打开索引

elasticsearch集群

九 es集群分布式架构

1. 集群部署

1.1 主机分布

clsuter name node name IP PORT
elasticsearch node-1 192.168.100.101 9200
elasticsearch node-2 192.168.100.102 9200
elasticsearch node-3 192.168.100.102 9200

1.2 配置文件更改

  • node-1
# 集群名称
cluster.name: elasticsearch
#节点名称
node.name: node-1
# 绑定IP地址
network.host: 0.0.0.0
# 指定服务访问端口
http.port: 9200
# 指定API端户端调用端口
transport.tcp.port: 9300
#集群通讯地址
discovery.seed_hosts: ["192.168.100.101:9300", "192.168.100.102:9300","192.168.100.103:9300"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.100.101:9300", "192.168.100.102:9300","192.168.100.103:9300"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
#数据目录位置
path.data: /home/finance/data/es7
#日志路径
path.logs: /home/finance/logs/es7
  • node-2
# 集群名称
cluster.name: elasticsearch
#节点名称
node.name: node-2
# 绑定IP地址
network.host: 0.0.0.0
# 指定服务访问端口
http.port: 9200
# 指定API端户端调用端口
transport.tcp.port: 9300
#集群通讯地址
discovery.seed_hosts: ["192.168.100.101:9300", "192.168.100.102:9301","192.168.100.103:9302"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.100.101:9300", "192.168.100.102:9301","192.168.100.103:9302"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
#数据目录位置
path.data: /home/finance/data/es7
#日志路径
path.logs: /home/finance/logs/es7
  • node-3
cluster.name: elasticsearch
#节点名称
node.name: node-3
# 绑定IP地址
network.host: 0.0.0.0
# 指定服务访问端口
http.port: 9200
# 指定API端户端调用端口
transport.tcp.port: 9300
#集群通讯地址
discovery.seed_hosts: ["192.168.100.101:9300", "192.168.100.102:9300","192.168.100.103:9300"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.100.101:9300", "192.168.100.102:9300","192.168.100.103:9300"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
#数据目录位置
path.data: /home/finance/data/es7
#日志路径
path.logs: /home/finance/logs/es7

1.3 查看节点及状态

#查看健康状态
curl localhost:9200/_cat/health?v


curl localhost:9200/_cat/nodes

1.3.1 健康状态回显说明

  • cluster
    集群名称
  • status
    集群状态,共有三种状态,分别green(正常)、red(代表主分片不可以,可能已经丢失数据)、yellow(代表了主分片,但至少缺失了一个副本,此时集群数据仍完整)
  • node.total
    在线的节点总数量
  • node.data
    在线的数据节点总数量
  • shards
    存活的分片数量
  • pri
    存活的主分片数量,正常情况下,pri是shards的两倍
  • relo
    迁移中的分片数量,正常是0
  • init
    初始化中的分片数量,正常是0
  • unassign
    未分配的分片,正常是0
  • pending_tasks
    准备中的任务,任务指迁移中的分片等,正常是0
  • max_task_wait_time
    任务最长等待时间
  • active_shards_percent
    正常分片百分比,正常情况为100%

2. 集群概念

2.1 集群

elasticsearch集群是由一个或者多个节点组成的集合。每一个集群都有一个唯一的名称。默认是elasticsearch,我们可以自己设置的cluster_name的值,cluster_name的值非常重要,一个节点就是通过集群的名称加入集群的。然后,每一个节点都有自己的名称。节点是可以存储数据,参与集群索引数据,以及搜索数据的独立服务。

2.2 分片

因为 ES 是个分布式的搜索引擎, 所以索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. ES自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 所以用户基本上不用担心分片的处理细节。

2.3 副本

ES 默认为一个索引创建 5 个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由 5 个主分片成本, 而每个主分片都相应的有一个 copy。对于分布式搜索引擎来说, 分片及副本的分配将是高可用及快速搜索响应的设计核心.主分片与副本都能处理查询请求,它们的唯一区别在于只有主分片才能处理索引请求.副本对搜索性能非常重要,同时用户也可在任何时候添加或删除副本。额外的副本能给带来更大的容量, 更高的呑吐能力及更强的故障恢复能力。

十 kibina

1. 部署

1.1下载kibina

kibana版本要与es版本匹配,不然会出现兼容性问题,此次部署的es7x

#查看es版本
 elasticsearch -V

#kibana下载
https://www.elastic.co/cn/downloads/past-releases

1.2 部署kibana

tar xvf kibana-7.4.0-linux-x86_64.tar.gz -C APP/
cd APP/
mv kibana-7.4.0-linux-x86_64/ kibana
cat >> /home/finance/APP/kibana/config/kibana.yml << EOF
#开启中文
i18n.locale: "zh-CN"
#http端口
server.port: 5601
#地址,此处不可写127.0.0.1,不然web页面访问不了
server.host: "192.168.100.101"
#服务名称
server.name: kibana
#es地址
elasticsearch.hosts: ["http://localhost:9200/"]
EOF

1.3 全局变量

cat >> /etc/profile.d/kibana.sh << EOF
export PATH=$PATH:/home/finance/APP/kibana/bin
EOF

source /etc/profile.d/kibana.sh

1.4 启动并验证

kibana >> /home/finance/logs/kibana.log &

#jobs查看是否running状态
#查看5601端口
#web访问IP:5601

2. 管理es集群

2.1 修改kibana配置

#此处为es集群地址,修改完以后重启kibana
elasticsearch.hosts: ["http://localhost:9200","http://192.168.100.101:9200","http://192.168.100.102:9200"]

十一 集群管理

1. 分片配置

在创建索引时,如果不指定分片,则默认主分片为1,副本分片为1.

1.1 创建分片

3个主分片,一个副本分片
elasticsearch集群

查看索引分片及副本

可以看到主分片及副本分片,在三个节点上都已经存在,如果node-1节点宕机,还可以通过其他两个节点获取到索引分片。
elasticsearch集群

2.脑裂

一个es集群中,启动了多台master,即为脑裂

2.1 网络问题

集群通信因为网络延迟、波动等情况,node节点与master节点失联,将会在选举一个master,这个时候就出现了脑裂的问题。

2.1.1 避免脑裂

discovery.zen.ping.timeout超时时间设置大一些,默认是3s

2.2 节点负载

主节点的角色即为master又为date,数据量访问较大时,可能出现假死状态。
配置文件参数:

#是否有主节点资格
node.master: true
#是否存储数据
node.date: true

2.2.1 避免脑裂

角色分离策略

  • 候选主节点配置
#是否有主节点资格
node.master: true
#是否存储数据
node.date: false
  • 数据节点配置
#是否有主节点资格
node.master: false
#是否存储数据
node.date: true

2.3 jvm回收

当master节点设置的jvm内存较小时,引发jvm大量的内存回收,造成es失去响应

2.3.1 避免脑裂

elasticsearch-7.4.0/config/jvm.options里-Xms,-Xmx
上一篇:spiring系列-看源码AbstractApplicationContext.refresh()->finishBeanFactoryInitialization()


下一篇:Java基础