写点什么

Elasticsearch 初步认识

用户头像
枫林
关注
发布于: 2020 年 09 月 03 日
Elasticsearch初步认识

ES介绍



  1. elasticsearch是一款面向文档的nosql数据库,使用json数据格式作为文档序列号格式。

  2. 使用Lucene作为核心来实现所有索引和搜索的功能,使得每个文档的内容都可以被索引、搜索、排序、过滤。

  3. 提供了丰富的聚合功能,可以对数据进行多维度分析

  4. 对外统一使用REST API接口进行沟通,即Client与Server之间使用HTTP协议通信。

  5. ElasticSearch和mysql对比



index(索引,名词)----> database
doc type(文档类型)---> table
document(文档)-------> row
field(字段)----------> column
mapping(映射)--------> schema
query DSL(查询语言)--> SQL
cluster :
代表一个集群,集群中有多个节点,其中有一个会被选为主节点,这个主节点是可以通过选举产生的。

shards:代表索引分片,es可以把一个完整的索引分成多个分片,一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

replicas: 代表索引副本,es可以设置多个索引的副本,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。




ElasticSearch安装



  1. 安装JDK,至少1.8或以上版本,java -version

  2. 下载和解压缩Elasticsearch安装包,目录结构

  3. 启动Elasticsearch:bin\elasticsearch (后台启动nohup ./bin/elasticsearch )直接启动就可以用了,注意使用非root用户启动

  4. 检查ES是否启动成功:



http://localhost:9200/?pretty //如果网页中显示如下信息就说明已经安装成功了。




Lucene与ES关系



  1. Lucene只是一个库,要使用它必须用Java来作为开发语言并将其直接集成到你的应用中。

  2. Elasticsearch使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能。它通过简单的RESTful API来隐藏Lucene的复杂性,让全文搜索变得简单。 ElasticSearch head总结



集群健康值颜色



green:每个索引的primary shard和replica shard都是active状态的
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
head页面访问: (可以直接安装elasticsearch-head的chrome的插件)或者服务中安装head插件
http://localhost:9200/_plugin/head/
elasticsearch常用命令
查看集群状态 curl -XGET ‘http://localhost:9200/_cluster/health?pretty’
列出节点信息 curl -XGET ‘http://localhost:9200/_cat/nodes?v’
列出索引信息 curl -XGET ‘http://localhost:9200/_cat/indices?v’
列出分片信息 curl -XGET ‘http://localhost:9200/_cat/shards?v’
查看进程信息 curl -XGET ‘http://localhost:9200/_nodes/process?pretty’
获取统计信息 curl -XGET ‘http://localhost:9200/_stats?pretty’
获取统计信息-执行索引 curl -XGET ‘http://localhost:9200/productindex/_stats?pretty’
热点线程 curl -XGET ‘http://localhost:9200/_nodes/hot_threads?pretty’
每10sdump热点线程 curl -XGET ‘http://localhost:9200/_nodes/hot_threads?type=cpu&interval=10s’
获取索引信息 curl -XGET ‘http://localhost:9200/productindex/_mapping?pretty’
获取JVM信息 curl -XGET “http://localhost:9200/_nodes/stats/jvm?pretty”
获取JVM信息-指定节点 curl -XGET “http://localhost:9200/_nodes/Perry01/stats/jvm?pretty”
删除全部索引 curl -XDELETE ‘http://localhost:9200/*?pretty’
删除指定索引 curl -XDELETE ‘http://localhost:9200/loancase?pretty’
查看段信息 curl -XGET ‘http://localhost:9200/loancase/_segments’
执行段合并 curl -XPOST ‘http://localhost:9200/loancase/_forcemerge?max_num_segments=1’
查看线程池配置 curl -XGET “http://localhost:9200/_nodes/thread_pool/”




elasticsearch.yml详解



cluster.name: elasticsearch
配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
node.name: "Franz Kafka"
节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。
node.master: true
指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
node.data: true
指定该节点是否存储索引数据,默认为true。
index.number_of_shards: 5
设置默认索引分片个数,默认为5片。
index.number_of_replicas: 1
设置默认索引副本个数,默认为1个副本。
path.conf: /path/to/conf
设置配置文件的存储路径,默认是es根目录下的config文件夹。
path.data: /path/to/data
设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,例: path.data: /path/to/data1,/path/to/data2
path.work: /path/to/work
设置临时文件的存储路径,默认是es根目录下的work文件夹。
path.logs: /path/to/logs
设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins: /path/to/plugins
设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrap.mlockall: true
设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过`ulimit -l unlimited`命令。
network.bind_host: 192.168.0.1
设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0。
network.publish_host: 192.168.0.1
设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
network.host: 192.168.0.1
这个参数是用来同时设置bind_host和publish_host上面两个参数。
transport.tcp.port: 9300
设置节点间交互的tcp端口,默认是9300。
transport.tcp.compress: true
设置是否压缩tcp传输时的数据,默认为false,不压缩。
http.port: 9200
设置对外服务的http端口,默认为9200。
http.max_content_length: 100mb
设置内容的最大容量,默认100mb
http.enabled: false
是否使用http协议对外提供服务,默认为true,开启。
gateway.type: local
gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置方法下次再详细说。
gateway.recover_after_nodes: 1
设置集群中N个节点启动时进行数据恢复,默认为1。
gateway.recover_after_time: 5m
设置初始化数据恢复进程的超时时间,默认是5分钟。
gateway.expected_nodes: 2
设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。
cluster.routing.allocation.node_initial_primaries_recoveries: 4
初始化数据恢复时,并发恢复线程的个数,默认为4。
cluster.routing.allocation.node_concurrent_recoveries: 2
添加删除节点或负载均衡时并发恢复线程的个数,默认为4。
indices.recovery.max_size_per_sec: 0
设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。
indices.recovery.concurrent_streams: 5
设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。
discovery.zen.minimum_master_nodes: 1
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.ping.timeout: 3s
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。
discovery.zen.ping.multicast.enabled: false
设置是否打开多播发现节点,默认是true。
discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。




ES RestFull API post、put、head、delete



  1. PUT是幂等方法,POST不是。所以PUT用于更新、POST用于新增比较合适。

  2. PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。

  3. 创建操作可以使用POST,也可以使用PUT,区别在于POST是作用在一个集合资源之上的/articles), 而PUT操作是作用在一个具体资源之上的(/articles/123)

  4. HEAD使用: 如果只想检查一下文档是否存在,你可以使用HEAD来替代GET方法,这样就只会返回HTTP头文件



eg:curl -i -XHEAD http://localhost:9200/hello/emp/1




ES疑问解答



Elasticsearch是如何实现Master选举的



1、Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分



2、对所有可以成为master的节点(node.master:true)根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。



3、如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举一直到满足上述条件。



Elasticsearch是如何避免脑裂现象的



1、当集群中master候选的个数不小于3个(node.master:true)。可以通过discovery.zen.minimum_master_nodes这个参数的设置来避免脑裂,设置为(N/2)+1



2、假如集群master候选节点为2的时候,这种情况是不合理的,最好把另外一个node.master改成false。如果我们不改节点设置,还是套上面的(N/2)+1公式,此时discovery.zen.minimum_master_nodes应该设置为2。这就出现一个问题,两个master备选节点,只要有一个挂,就选不出master了



客户端在和集群连接时,如何选择特定的节点执行请求的



TransportClient利用transport模块远程连接一个elasticsearch集群。它并不加入到集群中,只是简单的获得一个或者多个初始化的transport地址,并以 轮询 的方式与这些地址进行通信。



并发情况下Elasticsearch如何保证读写一致



1、可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;



2、另外对于写操作,一致性级别支持quorum/one/all,默认为quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。



3、对于读操作,可以设置replication为sync(默认),这使得操作在主分片和副本分片都完成后才会返回;如果设置replication为async时,也可以通过设置搜索请求参数_preference为primary来查询主分片,确保文档是最新版本。



Elasticsearch更新和删除文档的过程



1、删除和更新也都是写操作,但是Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更;



2、磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。 该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。



3、在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。



bulk一次最大处理多少数据量



1、bulk会把将要处理的数据载入内存中,所以数据量是有限制的



2、最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载



3、一般建议是1000-5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5-15MB,默认不能超过100M



4、可以在es的配置文件中修改这个值http.max_content_length: 100mb



create和index的区别



如果数据存在,使用create操作失败,会提示文档已经存在,使用index则可以成功执行



ES的两个web访问工具



kibana: 找到对应的版本下载解压到plugins目录下

还有几个是之前使用过的,之前从2.x开始使用,2.x的kibana还不是很好用

BigDesk Plugin : 监控es状态的插件,推荐!主要提供的是节点的实时状态监控,包括jvm的情况,linux的情况,elasticsearch的情况

Elasticsearch Head Plugin : 很方便对es进行各种操作的客户端

ElasticSearch-Kopf : Kopf是一个ElasticSearch的管理工具,它也提供了对ES集群操作的API




ES核心概念总结



Cluster总结



  1. 集群当中任何一个节点的通信和与整个es集群通信是等价的

  2. 主节点的职责是负责管理集群状态,包括管理分片的状态和副本的状态,以及节点的发现和删除。

  3. 只需要在同一个网段之内启动多个es节点,就可以自动组成一个集群。

  4. 默认情况下es会自动发现同一网段内的节点,自动组成集群。



发布于: 2020 年 09 月 03 日阅读数: 49
用户头像

枫林

关注

1+1 2020.08.30 加入

还未添加个人简介

评论

发布
暂无评论
Elasticsearch初步认识