一家做运动鞋的网站好,公司官网如何制作,百度开户公司,谷歌网站地图生成器首先要理解es的存储结构#xff1a;
一个index的数据#xff0c;分散在多个shard(分片)#xff0c;一个分片又有很多segment(段)#xff0c;es是数据不可变模型#xff0c;更新数据只是新增一个版本。 es是怎么写数据的#xff1f;
每次写的时候#xff0c;首先会写到…首先要理解es的存储结构
一个index的数据分散在多个shard(分片)一个分片又有很多segment(段)es是数据不可变模型更新数据只是新增一个版本。 es是怎么写数据的
每次写的时候首先会写到es的内存(每个分片的内存)这时写的数据是不可搜索的然后每个分片默认每秒钟会从内存里读写入的数据然后新建一个段将数据写到段里(这个操作在es里就叫refresh)只有写到段里数据才是可搜索的。也就是只有refresh了数据才能被搜索到refresh的间隔默认是一秒理论上es可以保证写入的数据一秒后是可以被搜索到的所以说es是近实时搜索。 将数据写到段里的时候是如何保证磁盘io效率的
我们知道磁盘io 要通过fsync系统调用他的代价是很高的那es是如何保证高效的写入效率呢在es内存和磁盘文件之间的文件系统缓存es是先将新段写入文件系统缓存万一这时程度挂了呢数据还没有持久化呢怎么保证数据的一致性这一步就快了很多了稍后在将数据刷到磁盘新段一旦写入文件系统缓存就可以被打开和读取了这样es就实现了新段还没有提交完(es中有提交点的概念)就可以进行查询了。 如何保证持久化
其实各类数据库都基本上是一种思路同时将数据写入log万一挂了从log里往回补数据这里es的日志叫做translogtranslog被提交的过程就叫做flush。
这里有的小伙伴可能会疑惑写log不也是往写磁盘吗难道就快了因为这类写都是顺序io非随机io不用寻址的效率堪比内存。 段的优化
每秒钟都会refresh产生新的段这么多是不是会影响查询效率答案是毋庸置疑的那怎么办es还有一个段合并的机制会定时的将小段合成大段。