Java ElasticSearch面試題

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.實現類要帶一個無參構造;

總結

都已經看到這里啦,趕緊收藏起來,祝您工作順心,生活愉快!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/710714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Centos系統(Linux)掛載硬盤/數據盤詳細操作和開機自動掛載的兩種方式

前提&#xff1a;已經做好磁盤陣列&#xff0c;將磁盤劃分好 磁盤初始化操作步驟&#xff08;如果已經可以正常掛載可跳過)&#xff1a; 使用fdisk -l命令查看多出來的大容量的磁盤名稱&#xff08;如果多塊磁盤&#xff0c;查看需要掛載的磁盤名稱&#xff09;&#xff0c;一…

embedding的原理和結構

embedding(向量化)是一個將數據轉化為向量矩陣的過程&#xff0c;作用是&#xff1a;將高維稀疏向量轉化為稠密向量&#xff0c;從而方便下游模型處理 簡單的概念大家應該都知道了&#xff0c;以LLM為例 輸入&#xff1a;文字 模型&#xff1a;embedding 輸出&#xff1a;向量…

c++高精度乘法的原理及c++代碼講解

高精度乘法的原理主要是利用數學中乘法的基本原理&#xff0c;將大整數拆分成各個位數的相乘&#xff0c;然后累加得到最終結果。其過程如下&#xff1a; 將兩個大整數相乘&#xff0c;從低位開始逐位相乘&#xff0c;得到部分乘積&#xff1b;將每一位的部分乘積相加&#xf…

【Emgu CV教程】7.8、圖像銳化(增強)之同態濾波

文章目錄 一、同態濾波大體原理二、代碼三、效果舉例 一、同態濾波大體原理 之前介紹的幾個銳化、增強方法&#xff0c;包括更早之前介紹的圖像模糊方法&#xff0c;都是基于空間域進行處理&#xff0c;也就是直接對目標點周邊像素值進行各種數學運算。而這篇文章提到的同態濾…

學習計算機的好處

之前寫了那么多計算機知識&#xff0c;卻沒有一篇寫我學計算機的初衷。 掌握計算機技術不僅可以提高我們的就業能力和競爭力&#xff0c;同時有助于我們更好地認識世界&#xff0c;提高工作效率和解決問題的能力&#xff0c;更好地利用科技創造更美好的未來。 因此&#xff0c…

pyvisa庫實現儀器控制

python控制儀器實現自動化常用pyvisa庫&#xff0c;基本控制可大致分為創建儀器控制對象、寫入控制指令、讀取儀表信息和查詢儀表狀態&#xff0c;下面進行基本的講解。 pyvisa庫創建儀表控制對象 import tkinter.messagebox import pyvisaclass InstrumentControl:inst Non…

喜迎喬遷,開啟新章 ▏易我科技新辦公區喬遷慶典隆重舉行

2024年1月18日&#xff0c;易我科技新辦公區喬遷慶典在熱烈而喜慶的氛圍中隆重舉行。新辦公區的投入使用&#xff0c;標志著易我科技將以嶄新姿態邁向新的發展階段。 ▲ 易我科技新辦公區 隨著公司業務的不斷發展和壯大&#xff0c;為了更好地適應公司發展的需要&#xff0c;…

2024-02-29(Flink)

1.Flink原理&#xff08;角色分工&#xff09; 2.Flink執行流程 on yarn版&#xff1a; 3.相關概念 1&#xff09;DataFlow&#xff1a;Flink程序在執行的時候會被映射成一個數據流模型&#xff1b; 2&#xff09;Operator&#xff1a;數據流模型中的每一個操作被稱作Operat…

Spring Boot 高級實踐探索:深度解讀與實戰演練

隨著開發者對Spring Boot框架的基礎運用日漸嫻熟&#xff0c;邁向更深層次的技術探究和應用場景拓展顯得尤為重要。本文將帶領讀者深入研究Spring Boot的若干核心進階特性&#xff0c;并結合實際項目案例&#xff0c;涵蓋自動化測試策略的深化應用、高級配置管理機制的巧妙運用…

Redis 之四:Redis 事務和樂觀鎖

事務特點 Redis 事務可以一次執行多個命令&#xff0c; 并且帶有以下三個重要的保證&#xff1a; 批量操作在發送 EXEC 命令前被放入隊列緩存。 收到 EXEC 命令后進入事務執行&#xff0c;事務中任意命令執行失敗&#xff0c;其余的命令依然被執行。不具備原子性。 在事務執…

通訊錄——C語言實現

頭文件Contact.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #pragma once #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30//表示一個人的信息 //struct…

npm使用國內淘寶鏡像的方法整理

命令配置安裝&#xff1a; 淘寶鏡像&#xff1a; npm config set registry https://registry.npm.taobao.org/ 官方鏡像&#xff1a; npm config set registry https://registry.npmjs.org 通過cnpm安裝&#xff1a; npm install -g cnpm --registryhttps://registry.npm.…

PTA L2-003 月餅 (附坑點說明)

月餅是中國人在中秋佳節時吃的一種傳統食品&#xff0c;不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量、總售價、以及市場的最大需求量&#xff0c;請你計算可以獲得的最大收益是多少。 注意&#xff1a;銷售時允許取出一部分庫存。樣例給出的情形是這樣的&#…

如何在Java中反轉字符串?

目錄 1. 使用StringBuilder的reverse方法&#xff1a; 2. 使用for循環和字符數組&#xff1a; 3. 使用遞歸&#xff1a; 4. 使用Java 8的Stream API&#xff1a; More Java中&#xff0c;反轉字符串可以通過多種方式實現。以下是一些常見的方法&#xff1a; 1. Java中使用…

【Python】PyGameUI控件

哈里前段時間寫了一個windows平板上自娛自樂&#xff08;春節和家人一起玩&#xff09;基于pygame的大富翁游戲。 pygame沒有按鈕之類的UI控件&#xff0c;寫起來不怎么順手。就自己寫一個簡單的框架。 倉庫地址 哈里PygameUi: pygame ui封裝自用 (gitee.com) 使用示例 示…

上海亞商投顧:滬指終結月線6連陰 北向資金凈買入超160億

上海亞商投顧前言&#xff1a;無懼大盤漲跌&#xff0c;解密龍虎榜資金&#xff0c;跟蹤一線游資和機構資金動向&#xff0c;識別短期熱點和強勢個股。 一.市場情緒 三大指數昨日低開高走&#xff0c;滬指重新站上3000點&#xff0c;深成指、創業板指大漲超3%。半導體產業鏈全…

實時聊天系統PHP

實時聊天系統可以讓用戶在網站上實時交流&#xff0c;這對社交平臺、在線客服等網站非常有幫助。以下是一個簡單的基于 PHP 和 WebSocket 的實時聊天系統示例&#xff1a; 1. 首先創建一個 HTML 文件 index.html 來顯示聊天界面和發送消息的表單&#xff1a; html <!DOCTYP…

【C#】 List.Sort 方法

【C#】 List.Sort 方法 在C#中&#xff0c;List.Sort()不僅為系統自帶的變量(int, float, double …)類型的集合提供默認排序&#xff0c;還提供了自定義的排序方法。 List自帶排序 List<int> list new List<int>(); list.Add(5); list.Add(3); list.Add(4); l…

探索那些能喚起情感共鳴的壁紙

1、方小童在線工具集 網址&#xff1a; 方小童 該網站是一款在線工具集合的網站&#xff0c;目前包含PDF文件在線轉換、隨機生成美女圖片、精美壁紙、電子書搜索等功能&#xff0c;喜歡的可以趕緊去試試&#xff01;

Python:關于數據服務中的Web API的設計

搭建類似joinquant、tushare類似的私有數據服務應用&#xff0c;有以下一些點需要注意&#xff1a; 需要說明的是&#xff0c;這里討論的是web api前后端&#xff0c;當然還有其它方案&#xff0c;thrift&#xff0c;grpc等。因為要考慮到一魚兩吃&#xff0c;本文只探討web ap…