ElatsicSearch使用及相关问题

搭建


单机


docker run -d --name es-single -e ES_JAVA_OPTS="-Xms512m -Xmx2048m" -v /home/docker/es/config/single:/usr/share/elasticsearch/config -v /home/docker/es/data/single:/usr/share/elasticsearch/data -v /home/docker/es/logs/single:/usr/share/elasticsearch/logs -p 9200:9200 -p 9300:9300 --network inet  elasticsearch:8.1.0

docker run -d --name kibana-single -p 5601:5601 -e ELASTICSEARCH_HOSTS=http://es-single:9200 -e I18N_LOCALE=zh-CN -v /home/docker/kibana/config/kibana-single.yml:/usr/share/kibana/config/kibana.yml --network inet  kibana:8.1.0
#es-single
cluster.name: "docker-single"
network.host: 0.0.0.0
discovery.type: single-node  #单节点模式

# Enable security features
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
  ...
#Kibana-single
# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://172.17.0.1:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"

集群CLUSTER


### 启动三master 三data
docker run -d  --name master-a -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" -v /home/docker/es/config/master1:/usr/share/elasticsearch/config -v /home/docker/es/data/master1:/usr/share/elasticsearch/data -v /home/docker/es/logs/master1:/usr/share/elasticsearch/logs -p ::9200 -p ::9300 --network inet  elasticsearch:8.1.0\
&&\
docker run -d  --name master-b -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" -v /home/docker/es/config/master2:/usr/share/elasticsearch/config -v /home/docker/es/data/master2:/usr/share/elasticsearch/data -v /home/docker/es/logs/master2:/usr/share/elasticsearch/logs -p ::9200 -p ::9300 --network inet  elasticsearch:8.1.0\
&&\
docker run -d  --name master-c -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" -v /home/docker/es/config/master3:/usr/share/elasticsearch/config -v /home/docker/es/data/master3:/usr/share/elasticsearch/data -v /home/docker/es/logs/master3:/usr/share/elasticsearch/logs -p ::9200 -p ::9300 --network inet  elasticsearch:8.1.0\
&&\
docker run -d  --name es-data1 -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" -v /home/docker/es/config/data1:/usr/share/elasticsearch/config -v /home/docker/es/data/data1:/usr/share/elasticsearch/data -v /home/docker/es/logs/data1:/usr/share/elasticsearch/logs -p ::9200 -p ::9300 --network inet  elasticsearch:8.1.0\
&&\
docker run -d  --name es-data2 -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" -v /home/docker/es/config/data2:/usr/share/elasticsearch/config -v /home/docker/es/data/data2:/usr/share/elasticsearch/data -v /home/docker/es/logs/data2:/usr/share/elasticsearch/logs -p ::9200 -p ::9300 --network inet  elasticsearch:8.1.0\
&&\
docker run -d  --name es-data3 -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" -v /home/docker/es/config/data3:/usr/share/elasticsearch/config -v /home/docker/es/data/data3:/usr/share/elasticsearch/data -v /home/docker/es/logs/data3:/usr/share/elasticsearch/logs -p ::9200 -p ::9300 --network inet  elasticsearch:8.1.0
#master 配置三台
#集群名称 如果改变名称则需要整个集群重启
cluster.name: my-es-cluster
#节点名称 默认为主机名
node.name: master-node-a
#node.name: master-node-b
#node.name: master-node-c
#指定节点角色为主节点
node.roles: [ master ]
path.data: /usr/share/elasticsearch/data
#绑定ip,开启远程访问,可以配置0.0.0.0
network.host: 0.0.0.0
#单节点(single-node)还是多节点 默认为多节点
discovery.type: multi-node
#主节点选举投票最小节点数 (候选节点数/2+1 eg 3/2+1 ) 从7开始最新版本已无该配置
#discovery.zen.minimum_master_nodes: 2
#用于集群发现
discovery.seed_hosts:
   - master-a:9300
   - master-b:9300
   - master-c:9300
#指定哪些节点被初始化为主节点
cluster.initial_master_nodes: 
   - master-node-a
   - master-node-b
   - master-node-c
#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------
#data节点 配置三台
#集群名称 如果改变名称则需要整个集群重启
cluster.name: my-es-cluster
#节点名称 默认为主机名
node.name: data-node-a
#node.name: data-node-b
#node.name: data-node-c
#指定节点角色为主节点
node.roles: [ data ]
path.data: /usr/share/elasticsearch/data
#绑定ip,开启远程访问,可以配置0.0.0.0
network.host: 0.0.0.0
#单节点(single-node)还是多节点 默认为多节点
discovery.type: multi-node
#用于集群发现
discovery.seed_hosts:
   - master-a:9300
   - master-b:9300
   - master-c:9300
#指定哪些节点被初始化为主节点
cluster.initial_master_nodes: 
   - master-node-a
   - master-node-b
   - master-node-c
#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------
#Kibana-single
# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://master-a:9200" ,"http://master-b:9200","http://master-c:9200"]
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"

 查看集群节点 集群状态

#查看集群节点
curl http://localhost:9200/_cat/nodes?v
ip         heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.18.0.5           12          98   8    1.39    1.47     0.98 d         -      data-node-a
172.18.0.2           22          98   8    1.39    1.47     0.98 m         *      master-node-a
172.18.0.3           35          98   8    1.39    1.47     0.98 m         -      master-node-b
172.18.0.4           40          98   8    1.39    1.47     0.98 m         -      master-node-c
#集群健康
curl http://localhost:9200/_cluster/health?pretty
{
  "cluster_name" : "my-es-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 7,
  "active_shards" : 7,
  "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
}

节点 Node


节点数据路径设置 配置文件中配置 path.data: /var/elasticsearch/data 也可以使用命令方式 elasticsearch -Epath.data=/var/elasticsearch/data

Coordinating Node

Coordinating Node:协调节点(我理解为读节点) 负责接受Client的请求, 将请求分发到合适的节点,最终把结果汇集到一起 每个节点启动后默认都是 coordinating 节点。设置其他类型全部为 false

Coordinating only node:单协调节点 该节点设置为负责协调 处理路由请求、处理搜索缩减阶段和分发批量索引等 ,不负责主数据和数据的存储,但过多的单协调节点会增加集群负担 配置方式 node.roles: [ ]

Ingest Node

Ingest Node:摄取节点可以执行由一个或多个摄取处理器组成的预处理管道。根据摄取处理器执行的操作类型和所需资源 默认节点启动都是 通过node.roles: [ ingest ] 配置

Master eligible nodes

Master eligible nodes:候选主节点,专注于管理集群。有资格成为主节点的节点也会充当协调节点,但不应将专用主节点用于此目的 每个节点启动后,默认就是一个Master eligible节点,即都可以参与集群选举,成为Master节点。通过node.roles: [ master ]设置

Voting-only master-eligible node:投票专用的有主节点资格的节点是一种参与主节点选举但不会作为集群中被选出的主节点的节点, 仅用于投票 通过 node.roles: [ master, voting_only ]设置 同时也可以担任其他角色。例如数据节点 node.roles: [ data, master, voting_only ]

Data Node

Generic data node:通用数据节点 包括所有数据节点,负责保存分片数据 节点启动后,默认就是数据节点。数据节点包含索引content 通过node.roles: [ data ]设置

Content data node: 内容数据节点是内容层的一部分。存储在内容层中的数据通常是一系列项目的集合,例如产品目录或文章档案。与时间序列数据不同,内容的值在一段时间内相对保持恒定,所以随着时间推移将其移动到具有不同性能特征的层是没有意义的。内容数据通常有很长的数据保留要求,并且无论数据有多旧,都希望能够快速检索到项目
内容层是必需的。系统索引和其他不属于数据流的索引会自动分配到内容层。

Hot data node: 热数据节点是热层的一部分。热层是时间序列数据进入 Elasticsearch 的入口,保存着你最近、最常搜索的时间序列数据。热层中的节点在读取和写入方面都需要快速,这需要更多的硬件资源和更快的存储(固态硬盘)。为了实现弹性,热层中的索引应配置为使用一个或多个副本。 通过node.roles: [ data_hot ]设置

Warm data node:温数据节点是温层的一部分。时间序列数据在被查询的频率低于热层中最近索引的数据时,可以移动到温层。温层通常保存最近几周的数据。仍然允许更新,但可能不频繁。温层中的节点通常不需要像热层中的节点那样快速。为了提高弹性,温层中的索引应配置为使用一个或多个副本。 通过node.roles: [ data_warm ]设置

Cold data node:冷数据节点是冷层的一部分。当你不再需要定期搜索时间序列数据时,它可以从温层移动到冷层。虽然仍然可搜索,但这个层通常针对较低的存储成本而非搜索速度进行优化 通过node.roles: [ data_cold ]设置

Frozen data node:冻结数据节点 一旦数据不再被查询,或者很少被查询,它可能会从冷层移动到冻结层,通过node.roles: [ data_frozen ]设置

Remote-eligible node

Remote-eligible node: 远程节点 可以连接到远程集群 可以跨集群搜索和同步数据

Machine Learning Node

Machine Learning Node:负责跑机器学习的节点 node.roles: [ ml, remote_cluster_client]

Transform node

Transform node:转换节点运行转换并处理转换 API 请求 node.roles: [ transform, remote_cluster_client ]

分片 Shard

主分片 :Primary Shard,主要是用于解决数据水平扩展的问题,通过主分片,可以将数据分发到集群的所有结点上面,每一个分片是一个Lucene的一个实例,分片在创建之后,不允许被修改,因为获取数据需要通过hash取模运算,改了数量就会直接影响结果
副本分片 : Replica Shard,用于解决数据高可用的问题,就是主分片的一个拷贝,主分片数在创建之后不允许被修改,副本分片数是允许被修改的,并且在一定程度上,可以通过增加副本数来提高服务读取数据的性能。但是副本分片最好是设置成0或者1,如果是日志数据,可以直接设置为0,如果是商品信息这种检索数据,那么可以直接设置成为1。

分段存储 Segments

索引文档以段的形式存储在磁盘上,索引文件被拆分为多个子文件,则每个子文件叫作段,每一个段本身都是一个倒排索引,并且段具有不变性,一旦索引的数据被写入硬盘,就不可再修改。
在底层采用了分段存储模式,使它在读写时几乎完全避免了锁的出现,大大提升了读写性能。
段被写入到磁盘后会生成一个提交点,提交点是一个用来记录所有提交后段信息的文件。
一个段一旦拥有了提交点,就说明这个段只有读的权限,失去了写的权限 。相反, 当段在内存中时,就只有写的权限,而不具备读数据的权限,意味着不能被检索。
段的概念提出主要是因为:在早期全文检索中为整个文档集合建立了一个很大的倒排索引,并将其写入磁盘中。如果索引有更新,就需要重新全量创建一个索引来替换原来的索引。这种方式在数据量很大时效率很低,并且由于创建一次索引的成本很高,所以对数据的更新不能过于频繁,也就不能保证时效性。

段的不变性的优点:
不需要锁,如果从来不更新索引,那就不需要担心多进程同时修改数据的问题。一旦索引被读入内核的文件系统缓存,便会留在哪里,由于其不变性。只要文件系统缓存中还有足够的空间,那么大部分读请求会直接请求内存,而不会命中磁盘。这提供了很大的性能提升。其它缓存(像Filter缓存),在索引的生命周期内始终有效。它们不需要在每次数据改变时被重建,因为数据不会变化。写入单个大的倒排索引允许数据被压缩,减少磁盘I/O和需要被缓存到内存的索引的使用量。

段的不变性的缺点:
当对旧数据进行删除时,旧数据不会马上被删除,而是在.del文件中被标记为删除。而旧数据只能等到段更新时才能被移除,这样会造成大量的空间浪费。若有一条数据频繁的更新,每次更新都是新增新的标记旧的,则会有大量的空间浪费。每次新增数据时都需要新增一个段来存储数据。当段的数量太多时,对服务器的资源例如文件句柄的消耗会非常大。在查询的结果中包含所有的结果集,需要排除被标记删除的旧数据,这增加了查询的负担。

使用


增删改查

  • ES支持的字段类型

    text
    keyword
    date
    float

  • 创建索引

PUT /test_index
{
  "settings": {
    //更多参考https://www.cainiaojc.com/elasticsearch/elasticsearch-index-modules.html
    "index":{
        //索引具有的分片的数量
        "number_of_shards": 6,
        //每个主分片具有的副本数。
        "number_of_replicas": 1 
    }
  },
  //字段类型定义
  "mappings": {
    "properties": {
      "filed1": {
        "type": "text"
      },
      "filed2": {
        "type": "keyword"
      },
      "filed3": {
        "type": "date"
      },
      "filed4": {
        "type": "float"
      }
    }
  }
}
  • 修改索引setting
PUT /test_index/_settings
{
  "index":{
  //每个主分片具有的副本数。
  "number_of_replicas": 0 
  } 
}

ES 常见问题汇总及解决方案


启动异常

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

系统中的 vm.max_map_count 参数设置的值太低 编辑 /etc/sysctl.conf 添加 vm.max_map_count=262144 通过sudo sysctl -p 使之生效