㈠ spring boot動態修改es的連接地址
在項目啟動後,使用修改配置文件+restart()連接/連接池對象的方法解決。
使用讀寫鎖,給restart()、setUrl()等代碼塊加寫鎖,給資料庫操作方法加讀鎖。這樣就可以在修改資料庫連接信息時,先獲取寫鎖,保證資料庫操作方法不能執行。而在不修改連接時,資料庫操作方法之間獲取的是讀鎖,不會影響線程彼此之間的操作。
㈡ 求大神解答安卓手機es管理器加密原理
因為文件已經被加密,你需要解密才行
㈢ ES - 並發沖突問題
ES基於自身樂觀鎖進行並發控制
ES基於Document中的version欄位進行並發控制,初始創建version為1
每次需要帶上version進行更新,該步驟需要多次,特別是在多線程環境下
基於external version進行並發控制
ES提供了一個插件,可以不用它提供的version,可以基於自己維護的一個版本號進行控制, 詳細語法
這里需要關注兩點
1.ES提供的version需要與ES中的version一摸一樣的時候才可以進行修改
2.external version提供的version比ES中的version大的時候才可以進行修改
partial update 部分修改
釋義:每次傳遞需要發生修改的Field,不需要將全量的document傳遞過去
語法如下
Partial Update內部原理和傳統PUT方式內部原理是一樣的,會將老的Document標記為deleted,然後創建一個新的Document。
Partial Update相較於全量替換的優點如下
1.所有的查詢,修改和寫入操作,都發生在ES中的一個shard 內部,避免了網路數據傳輸開銷(減少兩次網路請求),大大的提升了性能
2.減少了查詢和修改的時間間隔,可以減少並發沖突的情況
Partial Update的並發控制
Retry策略,語法如下
上面語法的意思是重新拿到版本號進行更新,最多重試五次
㈣ Oracle資料庫鎖的常用類型有哪些
Oracle資料庫的鎖類型
根據保護的對象不同,Oracle資料庫鎖可以分為以下幾大類:DML鎖(data locks,數據鎖),用於保護數據的完整性;DDL鎖(dictionary locks,字典鎖),用於保護資料庫對象的結構,如表、索引等的結構定義;內部鎖和閂(internal locks and latches),保護資料庫的內部結構。
DML鎖的目的在於保證並發情況下的數據完整性,本文主要討論DML鎖。在Oracle資料庫中,DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱為表級鎖,TX鎖稱為事務鎖或行級鎖。
當Oracle執行DML語句時,系統自動在所要操作的表上申請TM類型的鎖。當TM鎖獲得後,系統再自動申請TX類型的鎖,並將實際鎖定的數據行的鎖標志位進行置位。這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標志,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。TM鎖包括了SS、SX、S、X等多種模式,在資料庫中用0-6來表示。不同的sql操作產生不同類型的TM鎖。如表1所示。
在數據行上只有X鎖(排他鎖)。在 Oracle資料庫中,當一個事務首次發起一個DML語句時就獲得一個TX鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行DML語句時,第一個會話在該條記錄上加鎖,其他的會話處於等待狀態。當第一個會話提交後,TX鎖被釋放,其他會話才可以加鎖。
當Oracle資料庫發生TX鎖等待時,如果不及時處理常常會引起Oracle資料庫掛起,或導致死鎖的發生,產生ORA-60的錯誤。這些現象都會對實際應用產生極大的危害,如長時間未響應,大量事務失敗等。
TX鎖等待的分析
在介紹了有關地Oracle資料庫鎖的種類後,下面討論如何有效地監控和解決鎖等待現象,及在產生死鎖時如何定位死鎖的原因。
監控鎖的相關視圖 數據字典是Oracle資料庫的重要組成部分,用戶可以通過查詢數據字典視圖來獲得資料庫的信息。和鎖相關的數據字典視圖如表2所示。
TX鎖等待的監控和解決在日常工作中,如果發現在執行某條SQL時資料庫長時間沒有響應,很可能是產生了TX鎖等待的現象。為解決這個問題,首先應該找出持鎖的事務,然後再進行相關的處理,如提交事務或強行中斷事務。
死鎖的監控和解決在資料庫中,當兩個或多個會話請求同一個資源時會產生死鎖的現象。死鎖的常見類型是行級鎖死鎖和頁級鎖死鎖,Oracle資料庫中一般使用行級鎖。下面主要討論行級鎖的死鎖現象。
當Oracle檢測到死鎖產生時,中斷並回滾死鎖相關語句的執行,報ORA-00060的錯誤並記錄在資料庫的日誌文件alertSID.log中。同時在user_mp_dest下產生了一個跟蹤文件,詳細描述死鎖的相關信息。
在日常工作中,如果發現在日誌文件中記錄了ora-00060的錯誤信息,則表明產生了死鎖。這時需要找到對應的跟蹤文件,根據跟蹤文件的信息定位產生的原因。
如果查詢結果表明,死鎖是由於bitmap索引引起的,將IND_T_PRODUCT_HIS_STATE索引改為normal索引後,即可解決死鎖的問題。
表1 Oracle的TM鎖類型
鎖模式 鎖描述 解釋 SQL操作
0 none
1 NULL 空 Select
2 SS(Row-S) 行級共享鎖,其他對象只能查詢這些數據行 Select for update、Lock for update、Lock row share
3 SX(Row-X) 行級排它鎖,在提交前不允許做DML操作 Insert、Update、Delete、Lock row share
4 S(Share) 共享鎖 Create index、Lock share
5 SSX(S/Row-X) 共享行級排它鎖 Lock share row exclusive
6 X(Exclusive) 排它鎖 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive
表2 數據字典視圖說明
視圖名 描述 主要欄位說明
v$session 查詢會話的信息和鎖的信息。 sid,serial#:表示會話信息。
program:表示會話的應用程序信息。
row_wait_obj#:表示等待的對象。
和dba_objects中的object_id相對應。
v$session_wait 查詢等待的會話信息。 sid:表示持有鎖的會話信息。
Seconds_in_wait:表示等待持續的時間信息
Event:表示會話等待的事件。
v$lock 列出系統中的所有的鎖。 Sid:表示持有鎖的會話信息。
Type:表示鎖的類型。值包括TM和TX等。
ID1:表示鎖的對象標識。
lmode,request:表示會話等待的鎖模式的信
息。用數字0-6表示,和表1相對應。
dba_locks 對v$lock的格式化視圖。 Session_id:和v$lock中的Sid對應。
Lock_type:和v$lock中的type對應。
Lock_ID1: 和v$lock中的ID1對應。
Mode_held,mode_requested:和v$lock中
的lmode,request相對應。
v$locked_object 只包含DML的鎖信息,包括回滾段和會話信息。 Xisn,xidslot,xidsqn:表示回滾段信息。和
v$transaction相關聯。
Object_id:表示被鎖對象標識。
Session_id:表示持有鎖的會話信息。
Locked_mode:表示會話等待的鎖模式的信
息,和v$lock中的lmode一致。
col owner for a12
col object_name for a16
select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id;
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
如果有長期出現的一列,可能是沒有釋放的鎖。我們可以用下面SQL語句殺掉長期沒有釋放非正常的鎖:
alter system kill session 'sid,serial# ';
如果出現了鎖的問題, 某個DML操作可能等待很久沒有反應。
當你採用的是直接連接資料庫的方式,也不要用OS系統命令 $kill process_num 或者 $kill -9 process_num來終止用戶連接,因為一個用戶進程可能產生一個以上的鎖, 殺OS進程並不能徹底清除鎖的問題
Oracle鎖表(死鎖) 2011-05-03 17:46:41| 分類: Java技術 | 標簽: |字型大小大中小 訂閱 .
資料庫與操作系統一樣,是一個多用戶使用的共享資源。 當多個用戶並發地存取數據時,在資料庫中就會發生多個事務同時存取同一數據地情況。 若對並發操作不加控制就可能會讀取和存儲不正確地數據,破壞資料庫地一致性。 加鎖時實現資料庫並發控制地一個非常重要地技術。 在實際應用中經常會遇到地與鎖相關地異常情況,當兩個事務需要一組有沖突的鎖,而不能將事務繼續下去的話,就會出現死鎖,嚴重影響應用的正常執行。
在資料庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(即S鎖)。當數據對象被加上排它鎖時,其他的事務不能不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。資料庫利用這兩種基本的鎖類型來對資料庫的事務進行並發控制。
死鎖的第一種情況:
一個用戶A訪問表A(鎖住了表A),然後又訪問表B; 另一個用戶B訪問表B(鎖住了表B),然後企圖訪問表A;這時用戶A由於用戶B已經鎖住表B,它必須等待用戶B釋放表B才能繼續,同樣用戶B要等用戶A釋放表A才能繼續,這就死鎖產生了。
解決方法:
這種死鎖比較常見,是由於程序的BUG產生的,除了調整程序的邏輯沒有其它的辦法。仔細分析程序的邏輯,對於資料庫的多表操作時,盡量按照同樣的順序進行處理,盡量避免同時鎖定兩個資源,如操作A和B兩張表時,總是按先A後B的順序處理,必須同時鎖定兩個資源時,要保證在任何時刻都應該按照相同的順序來鎖定資源。
死鎖的第二種情況
用戶A查詢一條記錄,然後修改該條記錄;這時用戶B修改該條記錄,這時用戶A的事務里鎖的性質由查詢的共享鎖企圖上升到獨占鎖,而用戶B里的獨占鎖由於A有共享鎖存在必須等A釋放掉共享鎖,而A由於B的獨占鎖而無法上升到獨占鎖也就不可能釋放共享鎖,於是出現了死鎖。這種死鎖比較隱蔽,但在稍大點的項目種經常發生,如在某項目中,頁面上的按鈕點擊後,沒有使按鈕立刻失效,使得用戶會多次快速點擊同一按鈕,這樣同一段代碼對資料庫同一條記錄進行多次操作,很容易就出現這種死鎖的情況。
解決方法:
1、對於按鈕等控制項,點擊後使其立刻失效,不讓用戶重復點擊,避免對同時對同一條記錄操作。
2、使用樂觀鎖進行控制。樂觀鎖大多是基於數據版本(version)記錄機制實現。即為數據增加一個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫增加一個「version」欄位來實現。讀取處數據時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交的數據的版本數據與資料庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大於資料庫表當前版本號,則予以更新,否則認為是過期數據。樂觀鎖機制避免了長事務中的資料庫加鎖開銷(用戶A和用戶B操作過程中,都沒有對資料庫加鎖),大大提升了大並發量下的系統整體性表現。 Hibernate在其數據訪問引擎中內置了樂觀鎖實現。需要注意的是,由於樂觀鎖機制是我們的系統中實現,來自外部系統的用戶更新操作不受我們系統的控制,因此可能會造成臟數據被更新到資料庫中。
3、使用悲觀鎖進行控制。悲觀鎖大多數情況下依靠資料庫的鎖機制實現,如Oracle的select.......for update語句,以保證操作最大程度的獨占性。但隨之而來的就是資料庫性能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。如一個金融系統,當某個操作員讀取用戶的數據,並在讀出的用戶數據的基礎上進行修改時(如更改用戶帳戶余額),如果採用悲觀鎖機制,也就意味整個操作過程中(從操作員讀出數據、開始修改直至提交修改結果的全過程,甚至還包括操作員中途去煮咖啡的時間),資料庫記錄始終處於加鎖狀態,可以想見,如果面對成百上千個並發,這樣的情況將導致災難性的結果。所以,採用悲觀鎖進行控制時一定要考慮清楚。
死鎖的第三種情況
如果在事務種執行了一條不滿足條件的update語句,則執行全表掃描,把行級鎖上升為表級鎖,多個這樣的事務執行之後,就很容易發生死鎖和阻塞。類似的情況還有當表種的數據量非常龐大而索引建的過少或不合適的時候,使得經常發生全表掃描,最終應用系統會越來越慢,最終發生阻塞或死鎖。
解決方法:
SQL語句中不要使用太復雜的關聯多表的查詢;使用「執行計劃」對SQL語句進行 分析,對於有全表掃描的SQL語句,建立相應的索引進行優化。
***查詢死鎖表以及解鎖表***
通過select * from v$locked_object
可以獲得被鎖的對象的object_id及產生鎖的會話sid,通過查詢結果中的object_id,可以查詢到具體被鎖的對象。
鎖有以下幾種模式:
0:none
1:null 空
2:Row-S 行共享(RS / S鎖):共享表鎖
3:Row-X 行專用(RX / X鎖):用於行的修改
4:Share 共享鎖(S):阻止其他DML操作
5:S/Row-X 共享行專用(SRX):阻止其他事務操作
6:exclusive 專用(X):獨立訪問使用
數字越大鎖級別越高, 影響的操作越多。
一般的查詢語句如select ... from ... ;是小於2的鎖, 有時會在v$locked_object出現。
select ... from ... for update; 是2的鎖。
當對話使用for update子串打開一個游標時,
所有返回集中的數據行都將處於行級(Row-X)獨占式鎖定,
其他對象只能查詢這些數據行,不能進行update、delete或select...for update操作。
insert / update / delete ... ; 是3的鎖。
沒有commit之前插入同樣的一條記錄會沒有反應,
因為後一個3的鎖會一直等待上一個3的鎖, 我們必須釋放掉上一個才能繼續工作。
創建索引的時候也會產生3,4級別的鎖。
locked_mode為2,3,4不影響DML(insert,delete,update,select)操作,
但DDL(alter,drop等)操作會提示ora-00054錯誤。
有主外鍵約束時 update / delete ... ; 可能會產生4,5的鎖。
DDL語句時是6的鎖。
以DBA角色, 查看當前資料庫里鎖的情況可以用如下SQL語句:
select object_id,session_id,locked_mode from v$locked_object;
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
如果有長期出現的一列,可能是沒有釋放的鎖。
我們可以用下面SQL語句殺掉長期沒有釋放非正常的鎖:
㈤ 用es文件瀏覽器加密的文件密碼忘了,怎麼解鎖
只能不斷地輸入密碼,直到輸入正確,不然解不開的
加密過程如下所示:
1、點擊左上方的「本地」圖標。
2、久按要加密的文件,點擊下方「更多」圖標。
3、點擊「加密」按鈕即可。
㈥ 怎麼理解資料庫的鎖 一般鎖分別哪幾種
資料庫是一個多用戶使用的共享資源。當多個用戶並發地存取數據時,在資料庫中就會產生多個事務同時存取同一數據的情況。若對並發操作不加控制就可能會讀取和存儲不正確的數據,破壞資料庫的一致性。
加鎖是實現資料庫並發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。
在資料庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。資料庫利用這兩種基本的鎖類型來對資料庫的事務進行並發控制。
(6)es資料庫鎖擴展閱讀:
排它鎖和共享鎖的不同之處:
1、共享鎖(S鎖):如果事務T對數據A加上共享鎖後,則其他事務只能對A再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀數據,不能修改數據。
排他鎖(X鎖):如果事務T對數據A加上排他鎖後,則其他事務不能再對A加任任何類型的封鎖。獲准排他鎖的事務既能讀數據,又能修改數據。
2、共享鎖下其它用戶可以並發讀取,查詢數據。但不能修改,增加,刪除數據,資源共享。
3、共享鎖又稱為讀鎖(Share lock,簡記為S鎖),若事務T對數據對象A加上S鎖,則其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。
㈦ es索引有哪幾種常見狀態的
ES新手入門學習的時候,經常會和MySQL做對比,一個索引可以理解為一個資料庫,分片就可以理解為一張表被分割了shards_numbers - 1次,文檔類型為type類型,在高版本中在逐漸被剔除。
ES官方也給出了答案:作者不希望不同類型的相同欄位在同一個Lucene中。
索引的狀態有:紅色、黃色、綠色和黑色四種(ES插件可以看出來)。
green:健康狀態,代表所有的主分片和副本分片都可用;
yellow:所有的主分片可用,部分副本分片不可用;
red:部分主分片不可用;
black:索引處於關閉狀態,不對外進行交互,一般磁碟空間不足時ES會自動設置。
ES是一款近實時的搜索引擎,而非實時的搜索引擎。ES每秒產生一個新分段,新段先寫入文件系統緩存(對讀取可見),稍後再執行刷盤操作。由於新段不會立即刷盤,這個過程如果出現意外情況,存在數據丟失的風險,通常做法是記錄事務日誌。
分片的目的不只是為了分割巨大的索引,還可以並發讀。一個索引包含多個分片,一個分片是一個Lucene索引,一個Lucene索引又由很多分段組成,每一個分段都是一個倒排索引。
段合並:ES會選擇大小相似的段進行合並,ES每次refersh都會生成一個Lucene段,每次查詢都會輪流檢查每一個段,查詢完對結果進行合並,段越多,搜索也就越慢。由於分段的不變性(訪問不需要加鎖),更新刪除操作本質是標記刪除,在段合並的過程中,標記刪除的數據並不會寫入到新段中,這樣就達到了刪除的目的。寫操作先寫Lucene段,再寫translog,如果先寫translog,寫入Lucene段失敗,則還需要對translog進行回滾處理。
ES的只讀和刪除設置,是對索引和磁碟的一種保護機制,當然也可以手動設置索引的只讀和刪除,以下是ES自動觸發的:
索引的別名操作,比如要對一個月的所有索引(每天創建一個索引)進行處理,就可以為索引創建別名,一個索引可以有多個別名,一個別名也可以指向多個索引。
資料庫
文章轉載自李宇濤L,如果涉嫌侵權,請發送郵件至:[email protected]進行舉報,並提供相關證據,一經查實,墨天輪將立刻刪除相關內容。
相關閱讀
202
㈧ oracle--對鎖機制的理解-
1 引言—資料庫鎖的基本概念
為了確保並發用戶在存取同一資料庫對象時的正確性(即無丟失修改、可重復讀、不讀「臟」數據),資料庫中引入了鎖機制。基本的鎖類型有兩種:排它鎖(Exclusive locks記為X鎖)和共享鎖(Share locks記為S鎖)。
排它鎖:若事務T對數據D加X鎖,則其它任何事務都不能再對D加任何類型的鎖,直至T釋放D上的X鎖;一般要求在修改數據前要向該數據加排它鎖,所以排它鎖又稱為寫鎖。
共享鎖:若事務T對數據D加S鎖,則其它事務只能對D加S鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取數據前要向該數據加共享鎖,所以共享鎖又稱為讀鎖。
2 Oracle 多粒度封鎖機制介紹
根據保護對象的不同,Oracle資料庫鎖可以分為以下幾大類:
(1) DML lock(data locks,數據鎖):用於保護數據的完整性;
(2) DDL lock(dictionary locks,字典鎖):用於保護資料庫對象的結構(例如表、視圖、索引的結構定義);
(3) internal locks 和l a t c h es(內部鎖與閂):保護內部資料庫結構;
(4) distributed locks(分布式鎖):用於OPS(並行伺服器)中;
(5) PCM locks(並行高速緩存管理鎖):用於OPS(並行伺服器)中。
本文主要討論DML(也可稱為data locks,數據鎖)鎖。從封鎖粒度(封鎖對象的大小)的角度看,Oracle DML鎖共有兩個層次,即行級鎖和表級鎖。
2.1 Oracle的TX鎖(行級鎖、事務鎖)
許多對Oracle不太了解的技術人員可能會以為每一個TX鎖代表一條被封鎖的數據行,其實不然。TX的本義是Transaction(事務),當一個事務第一次執行數據更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操作)時,該鎖才被釋放。所以,一個TX鎖,可以對應多個被該事務鎖定的數據行。
在Oracle的每行數據上,都有一個標志位來表示該行數據是否被鎖定。Oracle不象其它一些DBMS(資料庫管理系統)那樣,建立一個鏈表來維護每一行被加鎖的數據,這樣就大大減小了行級鎖的維護開銷,也在很大程度上避免了其它資料庫系統使用行級封鎖時經常發生的鎖數量不夠的情況。數據行上的鎖標志一旦被置位,就表明該行數據被加X鎖,Oracle在數據行上沒有S鎖。
2.2 TM鎖(表級鎖)
2.2.1 意向鎖的引出
表是由行組成的,當我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務要在一個表上加S鎖,如果表中的一行已被另外的事務加了X鎖,那麼該鎖的申請也應被阻塞。如果表中的數據很多,逐行檢查鎖標志的開銷將很大,系統的性能將會受到影響。為了解決這個問題,可以在表級引入新的鎖類型來表示其所屬行的加鎖情況,這就引出了「意向鎖」的概念。
意向鎖的含義是如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對表中的任一行加鎖時,必須先對它所在的表加意向鎖,然後再對該行加鎖。這樣一來,事務對表加鎖時,就不再需要檢查表中每行記錄的鎖標志位了,系統效率得以大大提高。
2.2.2 意向鎖的類型
由兩種基本的鎖類型(S鎖、X鎖),可以自然地派生出兩種意向鎖:
意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對一個資料庫對象加S鎖,首先要對其上級結點加IS鎖,表示它的後裔結點擬(意向)加S鎖;
意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對一個資料庫對象加X鎖,首先要對其上級結點加IX鎖,表示它的後裔結點擬(意向)加X鎖。
另外,基本的鎖類型(S、X)與意向鎖類型(IS、IX)之間還可以組合出新的鎖類型,理論上可以組合出4種,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強度得到提高(即:S+IS=S,X+IS=X,X+IX=X,這里的「=」指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度。
這樣我們又可以引入一種新的鎖的類型
共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIX鎖) :如果對一個資料庫對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。
這樣資料庫對象上所加的鎖類型就可能有5種:即S、X、IS、IX、SIX。
具有意向鎖的多粒度封鎖方法中任意事務T要對一個資料庫對象加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統的並發度,減少了加鎖和解鎖的開銷。
㈨ 【ES】ElasticSearch 深入分片
@[toc]
分片是 Elasticsearch 在集群中分發數據的關鍵。
把分片想像成數據的容器。文檔存儲在分片中,然後分片分配到集群中的節點上。當集群擴容或縮小,Elasticsearch 將會自動在節點間遷移分片,以使集群保持平衡。
一個分片(shard)是一個最小級別「工作單元(worker unit)」,它只是保存了索引中所有數據的一部分。
這類似於 MySql 的分庫分表,只不過 Mysql 分庫分表需要藉助第三方組件而 ES 內部自身實現了此功能。
分片可以是 主分片(primary shard) 或者是 復制分片(replica shard) 。
在集群中唯一一個空節點上創建一個叫做 blogs 的索引。默認情況下,一個索引被分配 5 個主分片,下面只分配 3 個主分片和一個復制分片(每個主分片都有一個復制分片):
在一個多分片的索引中寫入數據時,通過路由來確定具體寫入哪一個分片中,大致路由過程如下:
routing 是一個可變值,默認是文檔的 _id ,也可以設置成一個自定義的值。routing 通過 hash 函數生成一個數字,然後這個數字再除以 number_of_primary_shards (主分片的數量)後得到余數 。這個在 0 到 number_of_primary_shards 之間的余數,就是所尋求的文檔所在分片的位置。
這解釋了為什麼要在創建索引的時候就確定好主分片的數量並且永遠不會改變這個數量: 因為如果數量變化了,那麼所有之前路由的值都會無效,文檔也再也找不到了 。
索引中的每個文檔屬於一個單獨的主分片,所以 主分片的數量決定了索引最多能存儲多少數據 (實際的數量取決於數據、硬體和應用場景)。
復制分片只是主分片的一個副本,它可以 防止硬體故障導致的數據丟失,同時可以提供讀請求,比如搜索或者從別的 shard 取迴文檔 。
每個主分片都有一個或多個副本分片,當主分片異常時,副本可以提供數據的查詢等操作。主分片和對應的副本分片是不會在同一個節點上的,所以副本分片數的最大值是 n -1(其中 n 為節點數)。
當索引創建完成的時候,主分片的數量就固定了,但是復制分片的數量可以隨時調整,根據需求擴大或者縮小規模。如把復制分片的數量從原來的 1 增加到 2 :
分片本身就是一個完整的搜索引擎,它可以使用單一節點的所有資源。 主分片或者復制分片都可以處理讀請求——搜索或文檔檢索,所以數據的冗餘越多,能處理的搜索吞吐量就越大。
對文檔的新建、索引和刪除請求都是寫操作,必須在主分片上面完成之後才能被復制到相關的副本分片,ES 為了提高寫入的能力這個過程是並發寫的,同時為了解決並發寫的過程中數據沖突的問題,ES 通過樂觀鎖的方式控制,每個文檔都有一個 _version (版本)號,當文檔被修改時版本號遞增。一旦所有的副本分片都報告寫成功才會向協調節點報告成功,協調節點向客戶端報告成功。
ES 集群中每個節點通過路由都知道集群中的文檔的存放位置,所以每個節點都有處理讀寫請求的能力。
在一個寫請求被發送到某個節點後,該節點即為協調節點,協調節點會根據路由公式計算出需要寫到哪個分片上,再將請求轉發到該分片的主分片節點上。假設 shard = hash(routing) % 4 = 0 ,則過程大致如下:
寫入磁碟的倒排索引是不可變的,優勢主要表現在:
當然,不可變的索引有它的缺點:
在全文檢索的早些時候,會為整個文檔集合建立一個大索引,並且寫入磁碟。只有新的索引准備好了,它就會替代舊的索引,最近的修改才可以被檢索。這無疑是低效的。
因為索引的不可變性帶來的好處,那如何在保持不可變同時更新倒排索引?
答案是,使用多個索引。 不是重寫整個倒排索引,而是增加額外的索引反映最近的變化。 每個倒排索引都可以按順序查詢,從最老的開始,最後把結果聚合。
這就引入了 段 (segment) :
分片下的索引文件被拆分為多個子文件,每個子文件叫作 段 , 每一個段本身都是一個倒排索引,並且段具有不變性,一旦索引的數據被寫入硬碟,就不可再修改。
段被 寫入到磁碟 後會生成一個 提交點 ,提交點是一個用來記錄所有提交後段信息的文件。一個段一旦擁有了提交點,就說明這個段只有讀的許可權,失去了寫的許可權。相反,當段在內存中時,就只有寫的許可權,而不具備讀數據的許可權,意味著不能被檢索。
在 Lucene 中的索引(Lucene 索引是 ES 中的分片,ES 中的索引是分片的集合)指的是段的集合,再加上提交點(commit point),如下圖:
在底層採用了分段的存儲模式,使它在讀寫時幾乎完全避免了鎖的出現,大大提升了讀寫性能。
索引文件分段存儲並且不可修改 ,那麼新增、更新和刪除如何處理呢?
ES 是怎麼做到 近實時 全文搜索?
磁碟是瓶頸。提交一個新的段到磁碟需要 fsync 操作,確保段被物理地寫入磁碟,即時電源失效也不會丟失數據。但是 fsync 是昂貴的,嚴重影響性能,當寫數據量大的時候會造成 ES 停頓卡死,查詢也無法做到快速響應。
所以 fsync 不能在每個文檔被索引的時就觸發,需要一種更輕量級的方式使新的文檔可以被搜索,這意味移除 fsync 。
為了提升寫的性能,ES 沒有每新增一條數據就增加一個段到磁碟上,而是採用 延遲寫 的策略。
每當有新增的數據時,就將其先寫入到內存中,在內存和磁碟之間是文件系統緩存,當達到默認的時間(1秒鍾)或者內存的數據達到一定量時,會觸發一次刷新(Refresh),將內存中的數據生成到一個新的段上並緩存到文件緩存系統 上,稍後再被刷新到磁碟中並生成提交點 。
這里的內存使用的是ES的JVM內存,而文件緩存系統使用的是操作系統的內存。新的數據會繼續的被寫入內存,但內存中的數據並不是以段的形式存儲的,因此不能提供檢索功能。由內存刷新到文件緩存系統的時候會生成了新的段,並將段打開以供搜索使用,而不需要等到被刷新到磁碟。
在 Elasticsearch 中,這種寫入和打開一個新段的輕量的過程叫做 refresh (即內存刷新到文件緩存系統)。默認情況下每個分片會每秒自動刷新一次。 這就是為什麼說 Elasticsearch 是近實時的搜索了:文檔的改動不會立即被搜索,但是會在一秒內可見。
也可以手動觸發 refresh。 POST /_refresh 刷新所有索引, POST /index/_refresh 刷新指定的索引:
沒用 fsync 同步文件系統緩存到磁碟,不能確保電源失效,甚至正常退出應用後,數據的安全。為了 ES 的可靠性,需要確保變更持久化到磁碟。
雖然通過定時 Refresh 獲得近實時的搜索,但是 Refresh 只是將數據挪到文件緩存系統,文件緩存系統也是內存空間,屬於操作系統的內存,只要是內存都存在斷電或異常情況下丟失數據的危險。
為了避免丟失數據,Elasticsearch添加了 事務日誌(Translog) ,事務日誌記錄了所有還沒有持久化到磁碟的數據。
有了事務日誌,過程現在如下:
事務日誌記錄了沒有 flush 到硬碟的所有操作。當故障重啟後,ES 會用最近一次提交點從硬碟恢復所有已知的段,並且從日誌里恢復所有的操作。
在 ES 中,進行一次提交並刪除事務日誌的操作叫做 flush 。分片每 30 分鍾,或事務日誌過大會進行一次 flush 操作。 flush API 也可用來進行一次手動 flush , POST/ _flush 針對所有索引有效, POST /index/_flush 則指定的索引:
通常很少需要手動 flush ,通常自動的就夠了。
總體的流程大致如下:
由於自動刷新流程每秒會創建一個新的段 ,這樣會導致短時間內的段數量暴增。而段數目太多會帶來較大的麻煩。每一個段都會消耗文件句柄、內存和 cpu 運行周期。更重要的是,每個搜索請求都必須輪流檢查每個段然後合並查詢結果,所以段越多,搜索也就越慢。
ES 通過後台合並段解決這個問題。小段被合並成大段,再合並成更大的段。這時舊的文檔從文件系統刪除的時候,舊的段不會再復制到更大的新段中。合並的過程中不會中斷索引和搜索。
段合並在進行索引和搜索時會自動進行,合並進程選擇一小部分大小相似的段,並且在後台將它們合並到更大的段中,這些段既可以是未提交的也可以是已提交的。
合並結束後老的段會被刪除,新的段被 flush 到磁碟,同時寫入一個包含新段且排除舊的和較小的段的新提交點,新的段被打開可以用來搜索。
1. 全文搜索引擎Elasticsearch,這篇文章給講透了
2.ElasticSearch 權威指南》
㈩ 用es文件瀏覽器加密的文件密碼忘了,怎麼解鎖
用es文件瀏覽器加密的文件密碼忘了,如果忘記密碼只能不斷進行嘗試,找回密碼。沒有其他的方法能夠解鎖。
文件加密忘記密碼的話,工作人員也沒有辦法解開。如果可以隨意找到密碼,這就成了功能漏洞。目前只能不斷嘗試去解開密碼。沒有其他的路徑來找回密碼。
如果更改了編碼還是顯示亂碼,建議在電腦端下載ftp客戶端來訪問。
注意ES的加密是一次性的,一旦解密後就失效了。選項「下次加密使用這個密碼」,是針對同一文件來說的,並且退出軟體後就會失效。