Neil Zhu,簡(jiǎn)書(shū)ID Not_GOD,University AI 創(chuàng)始人 & Chief Scientist,致力于推進(jìn)世界人工智能化進(jìn)程。制定并實(shí)施 UAI 中長(zhǎng)期增長(zhǎng)戰(zhàn)略和目標(biāo),帶領(lǐng)團(tuán)隊(duì)快速成長(zhǎng)為人工智能領(lǐng)域最專(zhuān)業(yè)的力量。
作為行業(yè)領(lǐng)導(dǎo)者,他和UAI一起在2014年創(chuàng)建了TASA(中國(guó)最早的人工智能社團(tuán)), DL Center(深度學(xué)習(xí)知識(shí)中心全球價(jià)值網(wǎng)絡(luò)),AI growth(行業(yè)智庫(kù)培訓(xùn))等,為中國(guó)的人工智能人才建設(shè)輸送了大量的血液和養(yǎng)分。此外,他還參與或者舉辦過(guò)各類(lèi)國(guó)際性的人工智能峰會(huì)和活動(dòng),產(chǎn)生了巨大的影響力,書(shū)寫(xiě)了60萬(wàn)字的人工智能精品技術(shù)內(nèi)容,生產(chǎn)翻譯了全球第一本深度學(xué)習(xí)入門(mén)書(shū)《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》,生產(chǎn)的內(nèi)容被大量的專(zhuān)業(yè)垂直公眾號(hào)和媒體轉(zhuǎn)載與連載。曾經(jīng)受邀為國(guó)內(nèi)頂尖大學(xué)制定人工智能學(xué)習(xí)規(guī)劃和教授人工智能前沿課程,均受學(xué)生和老師好評(píng)。
Elasticsearch refresh vs. flush
問(wèn):
若一個(gè)新的文檔索引進(jìn)ES索引,則它在索引操作執(zhí)行后約1s可以搜索到。然而我們可以直接調(diào)用_flush
或者_refresh
對(duì)索引進(jìn)行操作。那么這兩者有什么區(qū)別呢——看起來(lái)這兩個(gè)操作的結(jié)果都類(lèi)似,文檔都是立即可以被搜索的?
答:
我們?cè)敿?xì)解釋一下這兩種操作:
refresh
操作有效地對(duì)Lucene index reader調(diào)用了reopen,使得在數(shù)據(jù)的那個(gè)時(shí)間快照進(jìn)行了更新。這是Lucene擁有的近實(shí)時(shí)搜索api的特性。
ES refresh
讓文檔可以搜索到,但是不保證這些信息被寫(xiě)入disk進(jìn)入一個(gè)永久的存儲(chǔ)狀態(tài),因?yàn)樗](méi)有調(diào)用fsync
,這就不能保證持久性了。讓你數(shù)據(jù)獲得持久性的是Lucene commit,這個(gè)操作代價(jià)比較大。
當(dāng)你可以每秒都調(diào)用lucene reopen時(shí),你不能這樣使用lucene的commit。
借助lucene你可以盡可能頻繁地調(diào)用reopen以使新的文檔可以被搜索到,但是你仍然需要調(diào)用commit來(lái)確保數(shù)據(jù)寫(xiě)入disk并且fsynced,這樣會(huì)安全。
ES通過(guò)增加了一個(gè)在每個(gè)shard(一個(gè)lucene的索引)上的事務(wù)解決這個(gè)問(wèn)題,還未被commit的寫(xiě)操作會(huì)被存起來(lái)。事務(wù)log被fsynced,已經(jīng)安全了,所以你每時(shí)每刻都獲得了持久性,甚至對(duì)于那些沒(méi)有被commit的文檔,都是這樣。因?yàn)?code>refresh每秒自動(dòng)地發(fā)生,所以你可以近實(shí)時(shí)地搜索文檔,并且如果有不好的事件發(fā)生,事務(wù)log可以被替代從而恢復(fù)那些丟失的文檔。事務(wù)log的優(yōu)越性是它可以被用來(lái)做其他的事情,例如提供實(shí)時(shí)的get_by_id
。
elasticsearch flush
高效地觸發(fā)lucene commit,并同時(shí)清空事務(wù)log,因?yàn)橐坏?shù)據(jù)在lucene層面提交,持久性將會(huì)由lucene保證。Flush
同樣是一個(gè)api,也可以進(jìn)行微調(diào),雖然通常沒(méi)有必要這樣。Flush
自動(dòng)發(fā)生取決于事務(wù)log增加了多少操作、它們有多大、最后一次flush何時(shí)發(fā)生。