好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

es批量写入php es批量写入Java

很多站长朋友们都不太清楚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的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did254078
更新时间:2023-09-13   阅读:18次

上一篇: php技术方案交流 php技术资讯

下一篇:php超链接问题 php 超链接

最新资料更新

  • 1.php翻译sdk php翻译成中文是什么意思
  • 2.php客户信息管理 php用户管理
  • 3.php网页滚动代码 php 如何做滑动加载
  • 4.php合并特殊字符 php合并单元格的代码
  • 5.无法下载file.php 无法下载filedownload
  • 6.iisphpma的简单介绍
  • 7.php匹配尖括号 括号匹配python代码
  • 8.怎么改变php版本 php版本可以随便更换吗
  • 9.php+引用swf php引用其他文件内的函数
  • 10.php编程实验总结 php简单实训项目
  • 11.php变量获取图片 php调用图片
  • 12.php暂停方法 php 停止执行
  • 13.phpmp3播放 php播放器本地视频
  • 14.hbuilder写php hbuilder写PHP
  • 15.php多继承的作用 php继承关键字
  • 16.php函数rand PHP函数的参数传递包括
  • 17.php中国什么意思 php叫什么
  • 18.包含peintphp的词条
  • 19.php缓存框架 php 缓存
  • 20.php有关线程问题 php多线程

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]