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