天天看点

ElasticSearch 集群搭建、工作原理

目录

      • 概述
      • 搭建es集群
      • kibana连接es集群
      • 分片管理
      • 查看集群信息
      • 文档读写过程
        • 写操作
        • 读操作
      • es中的乐观锁
      • 倒排索引
      • analyzer 分词器

es为什么要集群?(集群的作用)

  • 高可用。高可用(High Availability)是分布式系统必须考虑的因素之一,实质是减少系统不能提供服务的时间。eg. 系统每运行100个时间单位,会有1个时间单位无法提供服务,则该系统的可用性是99%。
  • 负载均衡:将流量分散到多个节点上,减轻单个节点的压力
  • 提高整个系统的性能

es天生就是分布式的,就算只有一个节点,也是以集群方式部署的。

es集群的分布式优势

  • 自动分配分片,自动确定文档的存储位置
  • 自动同步数据至副分片(数据冗余),以防止硬件故障导致的数据丢失
  • 集群扩容时可以无缝整合新节点,自动重新分配分片

一个es节点可以同时具有多种角色,常见的角色有2种

  • master:master备选节点,有被选举为master的资格,默认具有此角色
  • data:数据存储节点,用于存储数据,默认具有此角色

一个es集群可以有多个master节点,但实际只有一个master节点,其余都是备胎。

当集群中一半以上的master正常时,集群才对外提供服务,否则集群不可用。这个数值可调,默认为 master数量/2+1 。

分片可分为

  • 主分片( primary shard):每个主分片只存储索引的部分数据,也就是说一个索引的数据是分散存储在多个分片上的,多个分片构成全样数据。
  • 副本分片(replica shard):主分片的副本,用于备份主分片上的数据

1、elasticsearch.yml

#集群名称
cluster.name: es

#节点名称
node.name: node-1

#自动绑定本机实际ip,允许外网访问
network.host: 0.0.0.0

#es对外提供服务使用的端⼝,默认9200
#http.port: 9200

#es节点之间通信使用的端口,默认9300
#transport.tcp.port: 9300

#指定集群节点(ip+通信端口)
discovery.seed_hosts: ["192.168.1.2:9300","192.168.1.3:9300","192.168.1.4:9300"]

#初始主节点,集群启动时会从里面选出一个真正的master
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
           

如果是本地模拟集群,需修改 http.port 、transport.tcp.port、discovery.seed_hosts 使用的端口。

2、jvm.options

#设置jvm的最小、最大堆内存
-Xms10g
-Xmx10g
           

3、如果data目录下有内容,清空data目录

4、其它系统配置参考:

防火墙要开启es对外提供服务使用的9200端口、集群内部节点之间通信的9300端口。

5、启动各节点,访问任意一个节点的 /_cat/nodes?v ,如果节点数正确,则集群搭建成功。*号标出的是真正的master节点。

如果每个节点都是真正的master,组成的都是单独的集群,检查

  • discovery.seed_hosts配置是否正确
  • 启动之前是否未清空data目录

kibana.yml

#指定es集群节点
elasticsearch.hosts: ["http://192.168.1.2:9200","http://192.168.1.3:
9200","http://192.168.1.4:9200"]
           

查询数据时只使用其中某个节点,该节点故障时自动使用另一个节点。

分片是针对index而言的,es是分布式的搜索引擎,index通常会分解成不同部分(分片)分布在不同的数据节点上。es会自动分配、管理分片,在需要的时候会自动重新分配分片,无需用户手动管理分片。

从7.x开始,如果创建index时不指定分片数量,默认会创建1个主分片、⼀个副分片;7.x之前则是默认创建5个主分片。

可以在创建index时指定分片数量

PUT /mall
{
    "settings": {
        "number_of_shards": 1,  #主分片
        "number_of_replicas": 2   #副分片
    },
    "mappings": {
        "properties": {
            "goods_name": {
                "type": "keyword"
            },
            "goos_price": {
                "type": "float"
            },
            "goods_description": {
                "type": "text"
            }
        }
    }
}
           

可以修改分片数量

PUT /mall/_settings
{
    "number_of_replicas": 3  #修改副分片数量
}
           

GET /_cat  #查看选项

GET /_cat/shards?v   #查看所有分片的信息。?v会显示每一项的名称
GET /_cat/shards/mall?v  #指定index的分片
 
GET /_cat/nodes?v  #所有节点
GET /_cat/master?v  #主节点

GET /_cat/indices?v  #所有索引
GET /_cat/indices/mall?v  #指定索引

GET /_cat/count?v #文档总数
GET /_cat/count/mall?v  #指定index的文档数

GET /_cat/health?v  #集群健康状况

GET /_cat/plugins?v  #启用的插件
           

shards是分片,pri是主分片(primary shards)。

集群状态

  • red:集群不可用。至少缺失一个主分片以及它的全部副分片,缺失部分数据,搜索只能返回部分数据,而分配到这个分片上的写请求会返回一个异常。
  • yellow:集群可用但仍存在问题。所有的主分片都已分配,但缺失了至少一个副分片。数据是完整的,读写正常,但可用性降低了。
  • green:正常。所有的主分片、副分片都已分配。

master负责维护集群状态,在有新节点加入或离开时重新分配分片。

由主分片执行写操作,再同步到副分片。主分片往往分散在多个节点上,不一定在master上。(这一点和zk不同)

  • 客户端向es集群发送文档写请求
  • 集群的某个节点接收到请求,通过路由算法确定该文档所属的主分片,将请求转发给该主分片所在节点
  • 主分片执行写请求,成功后将请求转发给对应副分片所在节点
  • 副本分片执行请求,将执行结果通知主分片所在节点
  • 如果所有副分片都执行(同步)成功,主分片节点通知接受请求的接待您操作成功,接收请求的节点向客户端返回操作成功

  • 客户端向es集群发送文档读请求
  • 集群的某个节点接收到请求,根据路由算法确定文档所在分片的节点列表,再根据负载均衡算法(默认轮询)确定转发给其中的某个节点
  • 分片所在节点将数据返回给接收到请求的节点,接收到请求的节点将数据返回给客户端

es集群中的概念和普通集群不同

  • 普通集群:master处理写请求,master、slave都可以处理读请求
  • es集群:master负责集群的分片管理,写请求由主分片处理,读请求主分片、副分片都可以处理。分工不同。

  • 悲观锁:每次操作时都认为别⼈会修改数据,所以操作时会先加锁。eg. 关系数据库的行锁、表锁,都是在做操作之前先上锁。
  • 乐观锁:每次操作时都认为别⼈不会修改数据,不上锁,但提交更新时会检测操作期间数据是否已被修改。

悲观锁适合写多读少、并发量小的场景,乐观锁适合读多写少、并发量大的场景。

es读多写少,常使用乐观锁解决并发问题,使用乐观锁也可以提⾼系统吞吐量。

#读文档时会返回该文档的版本号_version,假设返回的是版本号是9
GET /mall/_doc/1999

#更新文档时校验版本号(+1)。如果更新后版本号为10则返回成功,否则返回失败
POST /mall/_doc/1999?version=10&version_type=external
{
 "goods_price": 12.00
}
           

倒排索引记录词项(分词得到的词)信息,包括含有该词的文档id、字段名、出现次数(频率)等。

搜索时,并非遍历所有文档、从前往后匹配关键字,而是在倒排索引中检索关键字,直接定位匹配的文档。

添加、更新文档时,会先把字段值中的大写字母转成小写字母,再分词,更新倒排索引中的词项信息。

分词器又叫做分析器,有2个作用时间点

  • 全文检索时对搜索关键字进行分词
  • 插入、更新文档时给字段值分词,以更新倒排索引中的词项统计信息

这也是es计算相关性(score)中的重要依据。

  • char filter:以字符流的形式接收文本,并对文本进行预处理
  • tokenizer : 分词器,对文本进行分词
  • token filter :token过滤器,处理分词得到的词项

继续阅读