ES安装和学习


Elasticsearch exception [type=circuit_breaking_exception, reason=[parent] Data too large, data for [<http_request>] would be [3971717406/3.6gb], 
which is larger than the limit of [3944244838/3.6gb], real usage: [3971716848/3.6gb], new bytes reserved: [558/558b],
 usages [request=0/0b, fielddata=41859/40.8kb, in_flight_requests=217160/212kb, accounting=2344212/2.2mb]]
 
 
 Elasticsearch 限制的内存大小是 JAVA 堆空间的大小,不包括Lucene 缓存倒排索引数据空间。加载到内存中
 
query cache    10%    是    LRU    indices.queries.cache.size
request cache    1%    是    LRU    indices.requests.cache.size
fielddata cache    无限制    是    LRU    indices.fielddata.cache.size
segment memory    无限制    是    无    不能通过参数控制
Indexing Buffer 索引缓冲区 ndices.memory.index_buffer_size: 10%


索引状态
curl -u elastic:admin123 localhost:9200/_cat/indices?v&pretty
可以看到分片 索引占用情况
节点状态
curl -s http://localhost:9200/_cat/health?v

理解为什么深度分页是有问题的,我们可以假设在一个有 4 个主分片的索引中搜索。 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点 ,协调节点对 40 个结果排序得到全部结果的前 10 个。
现在假设我们请求第 990 页--结果从 990 到 1000 。所有都以相同的方式工作除了每个分片不得不产生前1000个结果以外。 然后协调节点对全部 4000 个结果排序最后丢弃掉这些结果中的 3990 个结果。

http://li5jun.com/article/105.html  kafka读写
Kafka判断一个节点是否活着有两个条件
节点必须可以维护和ZooKeeper的连接,Zookeeper通过心跳机制检查每个节点的连接。
如果节点是个follower,他必须能及时的同步leader的写操作,延时不能太久。
ISR;Kafaka动态维护了一个同步状态的副本的集合(a set of in-sync-replicas)
Leader会追踪所有“同步中”的节点,一旦一个down掉了,或是卡住了,或是延时太久,leader就会把它移除。至于延时多久算是“太久”,是由参数replica.lag.max.messages决定的,怎样算是卡住了,怎是由参数replica.lag.time.max.ms决定的。 
Follower在收到该消息并写入其Log后,向Leader发送ACK。一旦Leader收到了ISR中的所有Replica的ACK,该消息就被认为已经commit了
ACK=1,leader收到leader replica 对一个消息的接受ack才增加offset,然后继续生产;
消息:kafka中的消息由两部分组成,分别是Messagekey和MessageContent。Messagekey可以说是消息的标题,也可以当作路由键,MessageKey可以被设置为null,即便是null也具有路由键的功能;MessageContent就是消息的内容。

怎么持久化的:日志文件允许串行附加appendLog,并且总是附加到最后一个文件。当文件达到配置指定的大小(log.segment.bytes = 1073741824 (bytes))时,就会被滚动到一个新文件中(每个文件称为一个 segment file)
每个 segment 名为该 segment 第一条消息的 offset 和 ".kafka" 组成。另外会有一个索引文件,标明了每个 segment 下包含的日志条目的 offset 范围


es写 持久化
数据首先写入内存缓存区(读不到)和Translog日志文件中
内存缓存区满了或者每隔1秒(默认1秒),refresh将内存缓存区的数据生成index segment文件并写入文件系统缓存区!!  可以被读到
!!!当Translog长度达到一定程度的时候,会触发flush操作,否则默认每隔30分钟也会定时flush  fsync强制刷到磁盘


 

一条数据大小  1k-10k
一个索引分片的最大文档数量是20亿 
一个分片的大小在10G-50G!!之间,太大的话查询时会比较慢
如果分片过少或者过多,都会降低检索的速度( 会导致打开比较多的文件,机器之间的交互也就越多 太少导致单个分片索引过大,降低整体的检索速率)

es为什么查询那么快:倒排索引lucene  https://blog.csdn.net/MusicIsMyAll/article/details/99123719  Term Dictionary是term的有序集合  Term Index索引
一个document有多个filed  分析出关键字    
关键字term对应多个documentId形成Posting List
term太多查询会很慢,对关键字term排序Term Dictionary  排序之后使用二分查找Log N  形成有序列表
不可能关键字全部读进内存,太大了,就会在形成索引Term Index
term index 是一棵 变种的trie 树(Finite State Transducers (FST) 一种有限状态转移机)  空间占用小(压缩) 查询速度快。O(len(str))的查询时间复杂度
Term(单词)->Term Dictionary(单词字典,有序)->Term Index(单词索引)->Posting List(倒排列表)
term index 存在内存中(不包含在jvm中!!!注意留内存给lucene),非结构,适合全文搜索    b+树存硬盘 io  适合结构化


es查询过程
SearchType   query and fetch 只需要share一次,一次性把document也拉取回来,占内存。  dfs query and fetch
query then fetch默认,但是不准确,因为只拉取分片的一部分!!  
DFS query then fetch拉取各个分片的词频率和文档频率在进行排名,但是性能问题,准确最高

队列是一个排序好的top N数据的列表,它的size等于from+size的和,也就是说如果你的from是10,size是10,那么这个队列的size就是20    所有share都查20然后返回总排序
search->Node(coordinating node 广播)->所有shard(主和复都可以)->term index->符合的documentid list->协调节点排序整合TopN          ->fetch(读取具体数据)->multi-get->每一个shard拉取具体数据(只是读的10条数据)

写入过程
node->share(_routing路由hash,但只能是到主分片)->luncene内存buffer-->refresh(默认1秒,刷新后文件才能看见)->segment(30分钟或者512m满,文件缓存系统)-->flush(commit,fsyne)-->磁盘disk->在把请求发给其他备份分片->成功
es建索引写入数据的过程是内存到磁盘的过程,这个过程有日志的记录,那就是translog(现在内存,默认5秒刷新到磁盘)!!!!。防止断电,数据丢失。持久化disk后,会清空记录,es6以后只是标记删除,不会删除

es查询更新过程 ES各种操作的过程 - 悦风旗下 - 博客园

#!/bin/bash

user="elastic"
passwad="admin123"

shards=9
replicas=1

#windos格式不行 需要unix格式 sed -i "s/\r//" es-create.sh
#删除所有索引_all或者*  不要随意删除  shards初始化后就不能修改了
#curl -u $user:$passwad -XDELETE http://localhost:9200/_all

#入侵防御
curl -u $user:$passwad -X PUT "localhost:9200/intrusion?pretty" -H 'Content-Type: application/json' -d'
{
   "settings": {
        "number_of_shards" :   '${shards}',
        "number_of_replicas" : '${replicas}',
        "index.translog.durability" : "async",
        "index.translog.flush_threshold_size" : "1gb",
        "index.translog.sync_interval" : "30s"
    },

date_detection 关闭时间自动识别
curl 是一个网络数据传输项目
PUT,DELET是幂等方法,而POST并不是 PUT用于更新操作,POST用于新增操作比较合适  GET获取查询某一行的数据
-H header json格式插入  -d content 
pretty是让返回的json以容易看懂的形式显示
_doc代表文档
settings分片的设置  mappings属性的设置

核心类型    字符串类型    string,text,keyword  ELasticsearch 5.X之后的字段类型不再支持string
整数类型    integer,long,short,byte double boolean date range binary array object

analyzer search_analyzer 分词可以为ik_smart ik_max_word

curl -u elastic:admin123 -X PUT "localhost:9201/testtest?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
        "number_of_shards" :   6,
        "number_of_replicas" : 0,
        "index.translog.durability" : "async",
        "index.translog.flush_threshold_size" : "1gb",
        "index.translog.sync_interval" : "30s"
    } ,
    "mappings": {
    "date_detection": false,
      "properties": {
          "happen_time": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss"
            },
            "productPlanId":{"type":"keyword"},
            "id":{"type":"keyword"},
            "parentId":{"type":"keyword"}
            }
    }
  
}'

//一般需要精确查询的字段,在存储的时候都不建议分词。但是已经分词了,还想精确精确查询,使用queryStringQuery,在需要精确查询的词语外面使用双引号引起来
QueryBuilders.queryStringQuery("\"" + keyword + "\"");

number_of_shards   number_of_replicas
index的分片设置好后,主分片数量在集群中是不能进行修改的
分片太多也不好,一个lucene的索引,会消耗文件句柄已经CPU和内存资源,并且到所有的分片上去取数据
如果要取100条,如果你有2000个分片。就会从2000个分片上各取出100个数据然后进行排序给出最终的排序结果,取了2000*100条数据
ES会查询所有分片然后进行数据合并排序!!!!!

分片取决集群大小,以及想要达到的并发程度     一般根据节点数来进行分片,3个Node,N*(1.5-3) 4个节点差不多6-12个
副本取决多高数据的可用性且分散查询压力,但是会占用更多的存储空间  保障数据的高可靠性,防止数据丢失
分片数>=集群节点数  副本看数据量

分片就是,一本小说分章节卖,有上回、中回和下回
备份就是,这本小说你买了两本,丢了一本,还有一本,还能继续看

写请求是写入 primary shard,然后同步给所有的 负副本分片replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。
协调节点coordinating node 如果发现 primary node 和所有 副本replica node 都搞定之后,就返回响应结果给客户端
读请求进行哈希路由,将请求转发到对应的 node,此时会使用 round-robin随机轮询算法,在 primary shard 以及其所有 replica 中随机选择一个,让读请求负载均衡。
磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉!!

查询协调节点将搜索请求转发到所有的 shard 对应的 primary shard 或 replica shard
query phase:每个 shard 将自己的搜索结果(其实就是一些 doc id)返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。!!!!!
fetch phase:接着由协调节点根据 doc id 去各个节点上拉取实际的 document 数据,最终返回给客户端!!!!
shard = hash(document_id) % (num_of_primary_shards)  primary shard就是几个分片!!!


底层 lucene    jar 包,里面包含了封装好的各种建立倒排索引的算法代码
每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。会被分词提取关键词
倒排索引就是关键词到文档 ID 的映射  一个关键词对应多个文档id!!!!
Lucene索引是由多个段组成,段本身是一个功能齐全的倒排索引!!!  倒排词典的索引需要常驻内存,无法GC

在并发情况下,Elasticsearch如果保证读写一致?
可以通过版本号使用乐观并发控制,写操作,一致性级别支持quorum/one/all   读操作,可以设置replication为sync(默认)

对于GC方面,在使用Elasticsearch时要注意什么?
倒排词典的索引需要常驻内存,无法GC
避免返回大量结果集的搜索与聚合。确实需要大量拉取数据的场景,可以采用scan & scroll api来实现。
对集群的heap使用情况做持续的监控


Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分;
对所有可以成为master的节点(node.master: true)根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。
如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举一直到满足上述条件。
 

springboot配置

syslog.elasticsearch.username=aa   

syslog.elasticsearch.password=aa

syslog.elasticsearch.hostlist=xxx:9201xxx:9201,xxx:9201

版本问题

<properties>
    <elasticsearch.version>7.4.2</elasticsearch.version>
</properties>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.4.2</version>
</dependency>

"foobar": {
        "type" "text",
        "fields": {
            "keyword": {
                "type": "keyword",
                "ignore_above": 256
            }
        }
    }

Text vs. keyword

Text:会分词,然后进行索引
       支持模糊、精确查询
       不支持聚合

keyword:不进行分词,直接索引
       支持模糊、精确查询
       支持聚合 
text用于全文搜索的,而keyword用于关键词搜索。

ES学习
Elasticsearch分布式全文检索引擎,它可以近乎实时的存储、检索数据。本身扩展性很好,可以扩展到上百台服务器
cluster(集群)
node(节点) 
index(索引)    数据库
type(类型)      表
document(文档)  行
field(域)       列
Mapping(映射) 存储域field的相关映射信息,不同type会有不同的mapping。
shards&&Replicas(分片和副本) 数据可以分为较小的分片。每个分片放到不同的服务器上  为提高查询吞吐量或实现高可用性,可以使用分片副本  主分片(Primary shard) 副本分片(Replica shard)    

安装
tar es
vi elasticsearch.yml
cluster.name: my-test  同一个集群必须一样
node.name: node-1 节点名称必不一样
node.master: true  可以成为master
node.data: true
network.host: 10.8.4.37  真实ip  http.port: 9200 默认端口
discovery.seed_hosts 当您想要与其他主机上的节点组成群集时,你必须使用 discovery.seed_hosts 来提供群集中可以成为master
cluster.initial_master_nodes: ["node-1", "node-2"]  初始化选master

###

sysctl -w vm.max_map_count=262144 es最小内存  

永久在   /etc/sysctl.conf文件最后添加一行  vm.max_map_count=262144

vi /etc/security/limits.conf  加入
esuser hard nofile 65536
esuser soft nofile 65536

安装时一定要切换到普通用户(非root账号)!!  创建用户!!!
groupadd esgroup
useradd esuser -g esgroup  -p espassword
chown -R esuser:esgroup elasticsearch-6.3.2(赋予该目录下虽有的文件都可以操作执行的权限).
su esuser  !!!!启动用es账户
./elasticsearch -d 后台启动,可在当前终端继续操作  8以上的版本需要1.9上启动   -Xms512m -Xmx512m

web页面查看
ElasticSearch Head.zip拖入到chrome扩展程序就可以使用了
###################### 使用head等插件监控集群信息,需要打开以下配置项 ###########
# http.cors.enabled: true
# http.cors.allow-origin: "*"
# http.cors.allow-credentials: true

修改jvm.options  xms和xmx要一样大 

es7.2版本安装ik分词 - 悦风旗下 - 博客园 分词 ik  github不行用联通wifi快


linux安装jdk
wget http://download.oracle.com/otn-pub/java/jdk/9.0.1+11/jdk-9.0.1_linux-x64_bin.tar.gz   file看类型  html文件所以解压不了
tar -zxvf ./jdk-9.0.1_linux-x64_bin.tar.gz -C /usr/local
vi /etc/profile
#set java environment
JAVA_HOME=/usr/local/jdk-9.0.1/jdk-9.0.1
JRE_HOME=/usr/local/jdk-9.0.1/jdk-9.0.1/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
source /etc/profile

增删改查
PUT test/doc/2   修改或新建
{
  "name":"wangfei",
  "age":27,
  "desc":"热天还不让后人不认同"
}
GET test 查索引
GET test/doc/1 查文档信息
GET test/doc/_search  查询所有
DELETE test/doc/3 DELETE test 删除索引
POST test/doc/1/_update 修改
{  
  "doc":{
    "desc":"生活就像 茫茫海上"
  }
}
查询!!!!
GET test/doc/_search?q=name:wangfei
结构化查询  筛选
GET test/doc/_search
{
  "query":{
    "match":{
      "name":"wang"
    }
  }
}
elasticsearch在内部对文档做分词的时候,对于中文来说,就是一个字一个字分的,所以,我们搜中国,中和国都符合条件
可以用match_phrase 或者针对中文的插件
match_phrase_prefix最左  match返回所有匹配的分词
multi_match
倒叙排序
"sort": [
    {
      "age": {
        "order": "desc"
      }
    }
 ]
 分页查询   是内存分页
 "query": {
    "match_phrase_prefix": {
      "name": "wang"
    }
  },
  "from": 0,
  "size": 1
}

bool查询  must 必须满足  should (只要符合其中一个条件就返回)
#### 多条件组合查询
GET test/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "wanggfei"
          }
        },{
          "match": {
            "age": 25
          }
        }
      ]
    }
  }
}
filter(条件过滤查询,过滤条件的范围用range表示gt表示大于、lt表示小于、gte表示大于等于、lte表示小于等于)
"filter": {
        "range": {
          "age": {
            "gte": 10,
            "lt": 27
          }
        }
      }
bool查询总结!!!
must:与关系,相当于关系型数据库中的 and。
should:或关系,相当于关系型数据库中的 or。
must_not:非关系,相当于关系型数据库中的 not。
filter:过滤条件。
range:条件筛选范围。
gt:大于,相当于关系型数据库中的 >。
gte:大于等于,相当于关系型数据库中的 >=。
lt:小于,相当于关系型数据库中的 <。
lte:小于等于,相当于关系型数据库中的 <=。

只需要查看name和age两个属性,提高查询效率"_source": ["name","age"]
!!!!!
精确查询与模糊查询  term则不经过分词!!,它是直接去倒排索引中查找了精确的值了  match是经过analyer,会分词,注意不同类型查询会不会分词
t1类型为text,会经过分词!!!  t2类型为keyword类型,不会经过分词!!!
多个精确值(terms)
GET test/doc/_search
{
  "query": {
    "terms": {
      "age": [
        "27",
        "28"
      ]
    }
  }
}

聚合查询avg、max、min、sum  被封装在aggs中,而my_avg则是为查询结果起个别名,封装了计算出的平均值
GET zhifou/doc/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "my_max": {
      "max": {
        "field": "age"
      }
    }
  },
  "size": 0, 
  "_source": ["name","age","from"]
}

get返回 别名aliases   mappings信息:包括索引类型doc  settings设置。包括该索引的创建时间,主副分片的信息,UUID等等

字段数据类型:
文本(text)、关键字(keyword)、日期(data)、整形(long)、双精度(double)、布尔(boolean)或ip  JSON的层次结构性质的类型

index属性默认为true,如果该属性设置为false,那么,elasticsearch不会为该属性创建索引,也就是说无法当做主查询条件
number_of_shards是主分片数量(每个索引默认5个主分片),而number_of_replicas是复制分片,默认一个主分片搭配一个复制分片

默认分词器  webshell 我 是 中 国 人
ik分词器 
ik_max_word  webshell 我 是 中国人 中国 国人
ik_smart webshell 我 是 中国人

http://172.16.0.36:9200/zhouls/  _analyze  post   {"analyzer":"ik_smart","text":"webshell我是中国人"}

http://172.16.0.36:9200/zhouls/  _search   post
{
"query":{
   "query_string":{
      "query":"webshell儿子攻击"
    }
  }
}

curl -H "Content-Type: application/json" -XPOST 'http://172.16.0.36:9200/zhouls/emp?pretty' -d '{"name" : "XSS攻击"  , "age" : 28}'
curl -H "Content-Type: application/json" -XPOST 'http://172.16.0.36:9200/zhouls/emp?pretty' -d '{"name" : "Webshell攻击"  , "age" : 28}'
curl -H "Content-Type: application/json" -XPOST 'http://172.16.0.36:9200/zhouls/emp?pretty' -d '{"name" : "XSS攻击"  , "age" : 28}'
curl -H "Content-Type: application/json" -XPOST 'http://172.16.0.36:9200/zhouls/emp?pretty' -d '{"name" : "Webshell攻击"  , "age" : 28}'
curl -H "Content-Type: application/json" -XPOST 'http://172.16.0.36:9200/zhouls/emp?pretty' -d '{"name" : "CMS攻击"  , "age" : 28}'

https://www.cnblogs.com/hxlasky/p/11725339.html

#修改密码
curl -XPUT -u elastic 'http://localhost:9200/_xpack/security/user/elastic/_password' -H "Content-Type: application/json" -d '{
  "password" : "admin123"
}'

#CDH配置
cluster.initial_master_nodes: ["nssa.node1","nssa.node2","nssa.node3"]
node.master: true
node.data: true
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12


#./elasticsearch-keystore create
#设置密码
#./elasticsearch-setup-passwords interactive auto

#证书生成
./elasticsearch-certutil ca
./elasticsearch-certutil cert --ca elastic-stack-ca.p12


mv elastic-certificates.p12 config
mv elastic-stack-ca.p12 config/

chown -R elasticsearch elastic-certificates.p12  elastic-stack-ca.p12

scp root@172.16.0.231:/opt/cloudera/parcels/ELASTICSEARCH-7.4.2.elasticsearch.p0.7.4.2/config/elastic-* .
#密码
./elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

chown -R elasticsearch elasticsearch.keystore

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值