Java ElasticSearch面試題
- 前言
- 1、ElasticSearch是什么?
- 2. 說說你們公司ES的集群架構,索引數據大小,分片有多少 ?
- 3. ES的倒排索引是什么?
- 4. ES是如何實現 master 選舉的?
- 5. 描述一下 ES索引文檔的過程:
- 6、文檔從接收到寫入磁盤過程:
- 7、ES在部署時,有哪些優化方法?
- 8、ES中的節點(比如共 20 個),其中的 10 個選了一個 master,另外 10 個選了另一個 master,怎么辦?
- 9、詳細描述一下 ES更新和刪除文檔的過程:
- 10、在并發情況下,ES如果保證讀寫一致?
- 11、如何避免訂單重復提交?
- 12、說一下HTTP和HTTPS的區別?
- 13、什么是數字證書?
- 14、說說TCP與UDP的區別,以及各自的優缺點
- 15、你設計庫表時會考慮哪些問題?
- 16、說一下你對設計模式的理解?
- 17、cpu高或者內存高,是怎去排查的問題?
- 18、你們JVM啟動參數怎么設置的,大小怎么配置?
- 19、CMS簡介?
- 20、SPI 機制了解嗎?
- 總結
前言
最新的 Java 面試題,技術棧涉及 Java 基礎、集合、多線程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、緩存、消息隊列、Linux…等等,會持續更新。
如果對老鐵有幫助,幫忙免費點個贊,謝謝你的發財手!
1、ElasticSearch是什么?
- Elasticsearch是一個開源的分布式全文搜索引擎,它可以近乎實時的存儲、檢索數據。
2. 說說你們公司ES的集群架構,索引數據大小,分片有多少 ?
提供一組真實生產環境數據供參考:
379萬數據;每條數據字符數大概是400個英文字母;1個副本、5個分片;占用空間1.53G(也就是es-head看到的索引大小);每個節點的esdata目錄大小:2.1G;
3. ES的倒排索引是什么?
傳統的我們的檢索是通過文章,逐個遍歷找到對應關鍵詞的位置。
倒排索引,是通過分詞策略,形成了詞和文章的映射關系表,這種詞典+映射表即為倒排索引。有了倒排索引,檢索文章的時間復雜度是 o(1),極大的提高了檢索效率。
4. ES是如何實現 master 選舉的?
ES的選主是ZenDiscovery模塊負責,對所有可以成為Master的節點(node.master: true)根據 nodeId 排序,每次選舉每個節點都把自己所知道節點排一次序,然后選出第一個(第0位)節點,暫且認為它是 Master 節點。
如果對某個節點的投票數超過一半,并且該節點自己也選舉自己,那這個節點就是master,否則重新選舉。
5. 描述一下 ES索引文檔的過程:
- 1、客戶端向 Node 1 發送新建、索引或者刪除請求;
- 2、節點使用文檔id 確定文檔屬于分片 0 ,請求會被轉發到 Node 3,因為分片 0 的主分片目前被分配在 Node 3 上;
- 3、Node 3 在主分片上面執行請求,如果成功了,它將請求并行轉發到 Node 1 和 Node 2 的副本分片上;
- 4、一旦所有的副本分片都報告成功, Node 3 就向協調節點報告成功,協調節點向客戶端報告成功。
6、文檔從接收到寫入磁盤過程:
- 1、當分片所在的節點接收到來自協調節點的請求后,會將請求寫入到 MemoryBuffer,然后定時(默認是每隔 1 秒)寫入到 Filesystem Cache,這個從 MomeryBuffer 到 Filesystem Cache 的過程就叫做 refresh;
- 2、在某些情況下,存在 Momery Buffer 和 Filesystem Cache 的數據可能會丟失,ES 是通過 translog 的機制來保證數據的可靠性的。其實現機制是接收到請求后,同時也會寫入到 translog 中,當 Filesystem cache 中的數據寫入到磁盤中時,才會清除掉,這個過程叫做 flush;
- 3、在flush過程中,內存中的緩沖將被清除,內容被寫入一個新段,段的 fsync將創建一個新的提交點,并將內容刷新到磁盤,舊的translog將被刪除并開始一個新的 translog;
- 4、flush觸發的時機是定時觸發(默認30分鐘)或者translog變得太大(默認為512M)時;
(1. translog 可以理解為就是一個文件,一直追加;MemoryBuffer 應用緩存; Filesystem Cache系統緩沖區)
7、ES在部署時,有哪些優化方法?
- 1、關閉緩存swap:
原因:大多數操作系統會將內存使用到文件系統緩存,會將應用程序未用到的內存交換出去。會導致jvm的堆內存交換到磁盤上。交換會導致性能問題。會導致內存垃圾回收延長。會導致集群節點響應時間變慢,或者從集群中斷開。 - 2、堆內存設置為:Min(節點內存/2, 32GB);
- 3、設置最大文件句柄數
8、ES中的節點(比如共 20 個),其中的 10 個選了一個 master,另外 10 個選了另一個 master,怎么辦?
當集群maste候選數量不小于3個時,可以通過設置最少投票通過數量(discovery.zen.minimum_master_nodes)超過所有候選節點一半以上來解決腦裂問題;
當候選數量為兩個時,只能修改為唯一的一個 master 候選,其他作為 data節點,避免腦裂問題。
9、詳細描述一下 ES更新和刪除文檔的過程:
- 1、刪除和更新也都是寫操作,但是ES中的文檔是不可變的,因此不能被刪除或者改動以展示其變更;(原因是底層lucene的segment段文件不可更新刪除)
磁盤上的每個段都有一個相應的 .del 文件,當刪除請求發送后,文檔并沒有真 的被刪除,而是在 .del 文件中被標記為刪除。該文檔依然能匹配查詢,但是會在結果中被過濾掉。當段合并時,在.del 文件中被標記為刪除的文檔將不會被寫入新段。 - 2、在新的文檔被創建時,ES會為該文檔指定一個版本號,當執行更新時,舊版本的文檔在.del文件中被標記為刪除,新版本的文檔被索引到一個新段。
舊版本的文檔依然能匹配查詢,但是會在結果中被過濾掉。
10、在并發情況下,ES如果保證讀寫一致?
- 1、可以通過樂觀鎖使用版本號并發控制,以確保新版本不會被舊版本覆蓋,由應用層來處理具體的沖突;
- 2、對于寫操作,一致性級別支持 quorum/one/all,默認為 quorum(指定人數),即只有當大多數分片可用時才允許寫操作。但即使大多數可用,也可能存在因為網絡等原因導致寫入副本失敗,這樣該副本被認為故障,分片將會在一個不同的節點上重建;
- 3、對于讀操作,可以設置replication為 sync(默認同步),這使得操作在主分片和副本分片都完成后才會返回;如果設置 replication 為 async(異步) 時,也可以通過設置搜索請求參數_preference 為 primary 來查詢主分片,確保文檔是最新版本。
11、如何避免訂單重復提交?
- 1、前端做防重復提交,限制100ms只能請求一次;
- 2、在提交訂單頁面之前,先去后端服務獲取一個token令牌,后端服務可以令牌放在redis中,前端提交訂單后,后端會先去redis查看令牌是否存,如果存在則創建訂單成功,同時刪除該令牌,如果不存在,就拒絕請求,返回提示信息。
12、說一下HTTP和HTTPS的區別?
- 1、安全性:HTTP協議是明文傳輸數據的,因此不夠安全,容易被黑客攻擊攔截、篡改數據。而HTTPS通過SSL/TLS協議對數據進行加密傳輸,可以保證數據的安全性,防止數據被竊取和篡改;
- 2、數據傳輸方式: HTTP使用的是明文傳輸,數據包裹在請求報文和響應報文中,傳輸過程中可能會被攔截和篡改,而HTTPS通過TLS協議對數據進行加密傳輸,因此需要額外的SSL/TLS協議進行加解密操作,會比HTTP多消耗一些系統資源;
- 3、端口號:HTTP默認使用80端口進行通信,而HTTPS默認使用443端口進行通信;
- 4、數字證書:在HTTPS通信中,服務端需要提供數字證書,證書中包含了公鑰和域名等信息,客戶端通過驗證證書的有效性,可以確認自己連接的是正確的服務器。
總的來說,HTTPS相比于HTTP具有更高的安全性,適合于需要保護用戶隱私信息的場景。而HTTP則適用于一些不需要傳輸敏感數據的場景,例如一些公開的網站、博客等。
13、什么是數字證書?
- 客戶端向服務端發起身份驗證請求的一種證書,數字證書在許多相互認證設計中起著非常重要的作用,為請求者的身份提供了強有力的保證。
14、說說TCP與UDP的區別,以及各自的優缺點
- 1、連接性:TCP在通信之前必須要三次握手建立連接,而UDP是無連接的協議,通信雙方不需要建立連接就可以進行數據傳輸;
- 2、可靠性:TCP是一種可靠的協議,它可以保證數據的完整性和準確性,而UDP不能保證可靠性,數據可能會丟失;
- 3、效率:由于TCP需要建立連接、進行錯誤檢測等操作,所以效率較低,而UDP的效率較高,因為它不需要建立連接;
- 4、傳輸方式:TCP是面向字節流的協議,數據在傳輸過程中會被分成小的數據包進行傳輸,而UDP是面向數據包的協議,每個數據包都是獨立的,互不干擾;
適用場景:由于TCP具有可靠性和連接性,適合用于傳輸要求可靠的數據,例如網頁、電子郵件、文件傳輸等。而UDP適合用于傳輸實時性要求較高、數據量較小的數據,例如文本、音頻等;
15、你設計庫表時會考慮哪些問題?
字段的長度問題、創建的表的字段是否規范、風格是否和項目組統一、后續擴展問題、以及當前表的數據量級問題、后續的優化等。
16、說一下你對設計模式的理解?
設計模式是針對軟件開發中經常遇到的一些設計問題,而總結出來的一套實用的解決方案或者設計思想,提高了代碼的復用性和可擴展性。
設計模式的六大原則:
- 1.開閉原則:有開有閉原則,對擴展開放,但是對修改關閉;
- 2.里氏代換原則:子類可以擴展父類的功能,但不能改變原有父類的功能;
- 3.依賴倒轉原則:依賴依于接口或者抽象類而不賴于實現類;
- 4.接口隔離原則:使用多個相互隔離的接口開發,比使用單個接口要好;
- 5.迪米特法則:最少知道原則,盡量降低類與類之間的耦合;
- 6.合成復用原則:通過將已有對象作為新對象的成員屬性,新對象可以調用已有對象的功能,從而達到復用。
17、cpu高或者內存高,是怎去排查的問題?
原因:可能是業務代碼死循環、GC頻繁、線程阻塞等;
- 1.執行top命令,查看CPU占用過高的進程(按M可以排序);
- 2.根據pid找到對應cpu占用最多的Java線程:top -Hp 4861;
- 3.將10進制線程id轉換為16進制:
- 4.通過jstack 命令找到對應問題現場堆棧信息:jstack 4851|grep 12fd -C 10
查看線程運行狀態和定位問題代碼行數;如果有死鎖會出現deadlock關鍵字;
如果線程阻塞,會出現BLOCKED關鍵字; - 5.查看進程GC情況:jstat -GCutil <進程號> <統計間隔毫秒> <統計次數>
查看某進程GC持續變化情況,如果發現返回中FGC很大且一直增大,就是FGC; - 6.出dump文件:jmap -dump:format=b,file=filename < PID >
導出某進程下內存heap到文件中,通過jdk自帶 visualvm 或者 mat 工具查看內存中程序實例個數。
18、你們JVM啟動參數怎么設置的,大小怎么配置?
java -Xms2048m -Xmx2048m -Xmn700m -Xss512K
-XX:MaxMetaspaceSize=200m -XX:MetaspaceSize=200m -XX:ParallelGCThreads=8
-XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/OutOfMemory.hprof
-jar lugu-portal-1.1.jar
可以看到堆內存為2G,新生代為700M,老年代為1348M,元數據區是200M;
UseParNewGC:新生代使用ParNew回收器,UseConcMarkSweepGC:老年代使用CMS算法;
線程棧為512k(默認1024k調小可以增加創建線程數,增加并發量);
同時打印 GC 詳細信息和打印 GC 發生時間,當發生OOM時,Dump文件到指定路徑。
19、CMS簡介?
CMS是一款基于并發、使用標記清除算法的垃圾回收算法,只針對老年代進行垃圾回收,會盡可能讓GC線程和用戶線程并發執行,以達到降低STW時間的目的。
原理是通過可達性分析算法(GC Root對象)。
- 能與CMS搭配使用的新生代垃圾收集器有Serial收集器和ParNew收集器。這2個收集器都采用標記復制算法,都會觸發STW事件,停止所有的應用線程。不同之處在于,Serial是單線程執行,ParNew是多線程執行。
- 缺點:容易產生內存碎片和浮動垃圾(在并發清除過程中,由于用戶線程也在不斷的運行,所以會產生一些垃圾對象),由于CMS支持與用戶線程并行,所以會與用戶線程進行CPU資源爭奪。
20、SPI 機制了解嗎?
spi全稱為 (Service Provider Interface),是JDK內置的一種服務提供機制,用于提升接口的可擴展性,可以降低模塊之間的解耦和相互依賴。
spi的工作原理:
- 1.服務的提供方對調用方的接口提供了一種實現, 在jar包中resource的META-INF/services目錄下創建一個接口的全限定名的文件,該文件的內容是是實現類的全限定名;
- 2.在主程序中使用java.util包中的ServiceLoader加載該接口從而獲取該實現類;
- 3.實現類要帶一個無參構造;
總結
都已經看到這里啦,趕緊收藏起來,祝您工作順心,生活愉快!