很多站长朋友们都不太清楚es批量写入php,今天小编就来给大家整理es批量写入php,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 ES数据存储可靠性和写入流程 2、 es写入数据的工作原理是什么? 3、 ES 批量操作bulk 4、 ES深度分页与批量操作 5、 php 连接es 单例类 --- 2022-03-04 ES数据存储可靠性和写入流程1、数据存储可靠性保证原理
1.1 translog机制
当一个文档写入Lucence后是存储在内存中的,即使执行了refresh操作仍然是在文件系统缓存中,如果此时服务器宕机,那么这部分数据将会丢失
当进行文档写操作时会先将文档写入Lucene,然后写入一份到translog,写入translog是落盘的
tips:如果对可靠性要求不是很高,也可以设置异步落盘,可以提高性能,由配置index.translog.durability和index.translog.sync_interval控制
tips:translog是追加写入,因此性能比较好
先写入Lucene再写入translog。原因是写入Lucene可能会失败,为了减少写入失败回滚的复杂度,因此先写入Lucene
1.2 flush操作
refresh_interval定时触发 或当translog达到index.translog.flush_threshold_size(默认512mb),ES会触发一次flush操作:先执行refresh操作将buffer中的数据生成segment,然后调用lucene的commit方法将所有内存中的segment fsync到磁盘,最后会清空translog中的数据(6.x版本为了实现sequenceIDs,不删除translog) 。
1.3 merge操作
refresh操作会产生大量的小segment,因此产生的每个文件都会消耗文件句柄,内存,CPU 使用等各种资源。更重要的是每个查询请求都要顺序检查每个segment; segment越多检索会越慢.
ES会运行一个检测任务,在后台把近似大小的segment合并成一个新的大segment,并删除旧segment
1.4、多副本机制
ES有多副本机制(默认是1个副本),一个分片的主副分片不能分片在同一个节点上,进一步保证数据的可靠性。
2、ES写索引的流程
es写入数据的工作原理是什么?1)客户端任意选择一个node发送请求过去,这个node就是coordinating node(协调节点)
2)coordinating node,对该数据经过hash后,判断该数据属于哪个shard进程,找到有该shard的primary shard的node,然后对document进行路由,将请求转发给对应的node(有primary shard的结点)
3)具体接收的primary shard处理请求,然后将数据同步到replica node
4)coordinating node,如果发现primary node和所有replica node都搞定之后,就返回响应结果给客户端
写数据底层原理
1)先写入buffer, 在buffer里的时候数据是搜索不到 的;同时将数据写入 translog日志文件 (防止宕机buffer数据丢失)
2)如果 buffer快满了 , 或者到一定时间 ,就会将buffer数据refresh到一个 新的segment file中 ,但是此时数据不是直接进入segment file的磁盘文件的,而是先进入os cache的。这个过程就是refresh。
默认每隔1秒钟,es将buffer中的数据写入一个 新的segment file,每秒钟会产生一个新的磁盘文件 segment file ,这个segment file中就存储最近1秒内buffer中写入的数据
但是如果buffer里面此时 没有数据 ,那当然 不会执行refresh操作,不会创建文件 ,如果buffer里面有数据,默认1秒钟执行一次refresh操作,刷入一个新的segment file中;
操作系统里面,磁盘文件其实都有一个东西,叫做os cache,操作系统缓存,就是说 数据写入磁盘文件之前,会先进入os cache,先进入操作系统级别的一个内存缓存中去,再进入磁盘
只要buffer中的数据被refresh操作,刷入os cache中,就代表这个数据就可以被搜索到了 , 只要数据被输入os cache中,buffer就会被清空了,因为不需要保留buffer了,数据在translog里面已经持久化到磁盘去一份了
3)只要数据进入os cache,此时就可以让这个segment file的数据对外提供搜索了
4)重复1~3步骤,新的数据不断进入buffer和translog,不断将buffer数据写入一个又一个新的segment file中去(数据写入到segment file里后就建立好了倒排索引),每次refresh完buffer清空,translog保留。随着这个过程推进,translog会变得越来越大。 当translog达到一定长度的时候,就会触发 translog 的commit操作。
buffer中的数据,倒是好,每隔1秒就被刷到os cache中去,然后这个buffer就被清空了。所以说这个buffer的数据始终是可以保持住不会填满es进程的内存的。
每次一条数据写入buffer,同时会写入一条日志到translog日志文件中去,所以这个translog日志文件是不断变大的,当translog日志文件大到一定程度的时候,就会执行commit操作。
5) commit操作 发生第一步,就是 将buffer中现有数据refresh到os cache中去,清空buffer
6)将一个 commit point写入 磁盘文件 , 里面标识着这个commit point对应的所有segment file
7)强行将os cache中目前所有的数据都fsync到磁盘文件中去
commit操作:1、写commit point;2、将os cache数据fsync强刷到磁盘上去;3、清空translog日志文件
8) 将现有的translog清空,然后再次重启启用一个translog,此时commit操作完成。
默认每隔30分钟 会自动执行一次commit,但是如果 translog过大,也会触发commit。
整个 commit的过程,叫做flush操作 。我们可以手动执行flush操作,就是 将所有os cache数据刷到磁盘文件中去。
不叫做commit操作,flush操作。 es中的flush操作,就对应着tanslog commit的全过程 。我们也可以通过es api,手动执行flush操作,手动将os cache中的数据fsync强刷到磁盘上去,记录一个commit point,清空translog日志文件。
9) translog其实也是先写入os cache的,默认每隔5秒刷一次到磁盘中去
所以默认情况下, 可能有5秒的数据会仅仅停留在buffer或者translog文件的os cache中,如果此时机器挂了,会丢失5秒钟的数据。但是这样性能比较好,最多丢5秒的数据。也可以将translog设置成每次写操作必须是直接fsync到磁盘,但是性能会差很多。
10)如果是删除操作,commit的时候会生成一个.del文件(磁盘),里面将某个doc标识为deleted状态,那么搜索的时候根据.del文件就知道这个doc被删除了
11)如果是 更新操作,就是将原来的doc标识为deleted状态,然后新写入一条数据
12)buffer每次refresh一次,就会产生一个segment file,所以默认情况下是1秒钟一个segment file, segment file会越来越多,此时会定期执行merge
13) 每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为deleted的doc给物理删除掉,然后将新的segment file写入磁盘,这里会写一个commit point,标识所有新的segment file,然后打开segment file供搜索使用,同时删除旧的segment file。
ES 批量操作bulk主要介绍批量操作bulk,使用postman进行请求,接口请求的前缀地址统一为elasticsearch 部署IP地址+端口号(例如 。
bulk操作和以往的普通请求格式有区别。指令一般都在一行,用换行符隔开,不是标准的JSON格式,这点需要注意。
action 必须是以下选项之一:
metadata 中需要指定要操作的文档的 _index 、 _type 和 _id ,同时 _index 、 _type 也可在url中指定
官方地址:
ES深度分页与批量操作一、分页查询
1.普通分页查询
2.深度分页
其实就是搜索的深浅度,比如第一页、第二页、第二十页等等,是浅分页。第一万页,第两万页等就是很深了
我们在获取第9999条到10009条数据的时候,其实每个分片都会拿到10009条数据,然后集合在一起,总共是30027条数据,针对这些数据再做排序处理,最后获得十条数据。
如此一来,搜索的太深,就会造成性能问题,会耗费内存和占用cpu。而且es为了性能,也不支持超过一万条数据以上的分页查询。解决深度分页问题,就是应该避免深度分页的操作(限制分页页数)。比如最多提供100页的展示等。
3.scroll滚动搜索
滚动搜索可以先查询出一些数据,然后再紧接着以此往下查询。在第一次查询的时候会有一个滚动id,相当于一个锚标记,随后再次滚动搜索需要上次的标记。每次搜索都是基于一个历史的数据快照,在查询期间,如果有数据变更,所有的内容不会变化
4.批量查询mget
未命中的结果也会返回json显示是否有值。
POST /_doc/_mget
{
"ids":[
"1008",
"1007",
"555"
]
}
php 连接es 单例类 --- 2022-03-04需求:
最近在做一个将数据存入mysql的同时,将数据也存入es中,(因数据量太大没法批量导入)
总不能每次存入es的时候就创建es实例 连接一次es吧,所以封装个单例模式是很有必要的,可以减少不必要的开销。
封装实例:
调用的地方:
首先你要引入这个实例
调用:
至于调用之后怎么存入es中可以看我其他文章:PHP中使用ElasticSearch(一)
关于es批量写入php的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于es批量写入php es批量写入Java的详细内容...