记录一次工作中遇到的问题。

后台管理系统中管理功能将数据保存到数据库一份,同时也保存到ES中一份,然后终端POS从ES中取数据。

这时候问题来了,通过管理功能删除数据,本来应该是同时删除数据库以及ES中的数据,然而,实际情况是数据库中的数据已被删除,ES中的数据还在,等1-2分钟之后ES中数据才消失。这导致终端POS不能显示最新的数据。

下面来看看问题的解决过程。

先来看看实体类的配置。

Es删除数据409 es删除数据超时_大数据

Es删除数据409 es删除数据超时_大数据_02

ESWindowgoods代表窗口菜单功能,ESWindowgoodsFuture代表未来菜谱功能,从document注解中的参数来看,两个索引实体类的刷新间隔是一样的。

但是实际功能操作过程中发现,窗口菜单功能删除菜品后,ES不会立即删除,未来菜谱功能删除菜品后,ES会立即删除。为什么配置一样,两个功能删除操作后的行为不一样呢?

这时候我决定看一下实际ES索引的设置到底是什么,这里我们使用elasticsearch-head插件来查看。

Es删除数据409 es删除数据超时_数据库_03

点击索引下面的信息,然后再点击索引信息,这时候就可以看到索引的初始设置以及属性信息了

Es删除数据409 es删除数据超时_大数据_04

我们可以看到windowgoodsindex索引的refresh_interval属性是-1,意思是不刷新。这样就可以解释,为什么窗口菜单删除数据后,ES中没有立即删除,而是过1-2分钟再删这个现象了。

Es删除数据409 es删除数据超时_大数据_05

 

我们再来看看windowgoodsfutureindex索引的refresh_interval属性,这个属性不存在,这种情况下该属性默认为1。这就能解释,为什么未来菜谱删除数据后,ES中可以立即删除。于是,我们要重建windowgoodsfutureindex索引,使该索引的刷新行为和windowgoodsindex保持一致。

Es删除数据409 es删除数据超时_Es删除数据409_06

我们用这个命令重建索引,由于不想删除原先索引中的数据,所以需要先把原索引数据导入到新索引中。导入完之后,我们使用新的windowgoodsfutureindex索引。这时候两个索引的刷新行为保持一致了,在功能中删除数据后,数据库已经删了,但是ES中数据还存在,过1-2分钟才删除。不过,我们的问题还是没有解决,我们要达到删除数据,数据库和ES中都被删除目的,我们现在可以再删除后去调用ES的手动刷新方法来达到这个目的。

Es删除数据409 es删除数据超时_大数据_07

好了,再次测试,执行删除操作后,数据库和ES中的数据都可以删除了。