標籤:
RDB 持久化
1. RDB檔案用於儲存和還原Redis伺服器所有資料庫中的所有索引值對資料。
2. SAVE命令由伺服器處理序直接執行儲存操作,所以該命令會阻塞伺服器。
3. BGSAVE令由子進程執行儲存操作,所以該命令不會阻塞伺服器。
4. 伺服器狀態中會儲存所有用save選項設定的儲存條件,當任意一個儲存條件被滿足時,伺服器就自動執行BGSAVE命令。
5. RDB檔案是一個經過壓縮的二進位檔案,由多個部分組成。
6. 對於不同類型的索引值對,RDB檔案會使用不同的方式來儲存它們。
7. Redis是記憶體資料庫,它將自己的資料庫狀態儲存在記憶體裡面。RDB持久化功能可以將Redis在記憶體中的資料庫狀態儲存到磁碟裡面,避免資料意外丟失。
8. Redis沒有專門用於載入RDB檔案的命令,只要Redis伺服器在啟動時檢測到RDB檔案,它就會自動載入RDB檔案。
9. 通常情況下,AOF檔案的更新頻率比RDB檔案的更新頻率高,所以如果伺服器開啟了AOF持久化功能,那麼伺服器就會優先使用AOF檔案來還原資料庫狀態。只有在AOF持久化功能
處於關閉狀態時,伺服器才會使用RDB檔案來還原資料庫狀態。
10. 在執行BGSAVE命令期間,新的SAVE,BGSAVE 命令會被拒絕執行,BGREWRITEAOF命令會被順延強制。如果在執行BGREWRITEAOF,那麼BGSAVE命令會被拒絕。
11. 伺服器在載入RDB檔案期間,會一直處於阻塞狀態,知道載入工作完成為止。
12. 用於可以通過save選項設定多個儲存條件,但只要其中任意一個條件被滿足,伺服器就會執行BGSAVE命令。舉個例子,如果我們向伺服器提供一下配置:
save 900 1 // 伺服器在900秒以內,對資料庫進行至少1次修改時,執行BGSAVE命令save 300 10 // 伺服器在300秒以內,對資料庫進行至少10次修改時,執行BGSAVE命令save 60 10000 // 伺服器在60秒以內,對資料庫進行至少10000次修改
修改頻率低時,保證修改會被儲存。修改頻率高時,及時儲存。
13. Redis的伺服器周期性操作函數serverCron預設每隔100毫秒就會執行一次,該函數用以對正在執行的伺服器進行維護,它的其中一項工作就是檢查save選項所設定的儲存條件
是否以滿足,如果滿足的話,就執行BGSAVE命令。
14. RDB檔案由 "REDIS"字串,db_version(資料庫版本),databases(資料庫內容),EOF(結束標誌),check_sum(校正和,判斷檔案是否完整)
15. Redis本身帶有RDB檔案檢索工具redis-check-dump,網上也能找到很多處理RDB檔案的工具。
AOF持久化
1. AOF檔案通過儲存所有修改資料庫的寫命令請求來記錄伺服器的資料庫狀態。
2. AOF檔案中的所有命令都以Redis命令請求協議的格式儲存。
3. 命令請求會先儲存到AOF緩衝區裡面,之後再定期寫入並同步到AOF檔案。
4. appendfsync選項的不同值對AOF持久化功能的安全性以及Redis伺服器的效能有很大影響。
5. 伺服器只要載入並重新執行儲存在AOF檔案中的命令,就可以還原資料庫本來的狀態。
6. AOF重寫可以產生一個新的AOF檔案,這個新的AOF檔案和原有的AOF文案所儲存的資料庫狀態一樣,但體積更小。
7. AOF重寫是一個有歧義的名字,該功能是通過讀取資料庫中的索引值對來實現的,程式無需對現有的AOF檔案進行任何讀入、分析或者寫入操作。
8. 在執行BGREWRITEAOF命令時,Redis伺服器會維護一個AOF重寫緩衝區,該緩衝區會在子進程建立新AOF檔案期間,記錄伺服器執行的所有寫命令。當子進程完成建立新AOF檔案的工作以後,
伺服器將會重寫緩衝區中的所有內容追加到新AOF檔案末尾,使得新舊兩個AOF檔案所儲存的資料庫狀態一直。最後,伺服器用新的AOF檔案替換就就的AOF檔案,以此來完成AOF檔案重寫操作。
9. RDB持久化通過儲存資料庫中的索引值對來記錄資料庫狀態不同,AOF持久化是通過儲存Redis伺服器所執行的寫命令來記錄資料庫狀態。
10. 伺服器在啟動時,可以通過載入和執行AOF檔案中的儲存命令來還原伺服器關閉之前的資料庫狀態。
11. AOF持久化功能的實現可以分為命令追加、檔案寫入、檔案同步三個步驟。
12. appendfysync 選項的值,預設值為everysec :
always : 將aof_buf緩衝區中的所有內容寫入並同步到AOF檔案。
everysec : 將aof_buf緩衝區中的所有內容寫入到AOF檔案,如果上次同步AOF檔案的時間距離現在超過了一秒鐘,那麼在此對AOF檔案進行同步,並且這個同步操作是由一個線程專門負責執行的。
no : 將aof_buf緩衝區中的所有內容寫入到AOF檔案,但並不對AOF檔案進行同步,何時同步由作業系統來決定。
13. Redis讀取AOF檔案還原資料庫狀態的詳細步驟如下:
1). 建立一個不帶網路連接的偽用戶端。
2). 從AOF檔案中分析並讀取出一條寫命令。
3). 使用偽用戶端執行被讀出的寫命令。
4). 一直執行步驟2和步驟3,知道AOF檔案中的所有命令都被處理完畢。
14. Redis 將AOF重寫放入到子進程中執行,這樣做可以同時達到兩個目的:
1). 子進程進行AOF重寫期間,伺服器處理序(父進程)可以繼續處理命令請求
2). 子進程帶有伺服器處理序的資料副本,使用子進程而不是線程,可以在避免使用所的情況下,保證資料的安全性。
15. 在整個AOF後台重寫過程中,只有訊號處理函數執行時會對伺服器處理序(父進程)造成阻塞。
事件
1. Redis伺服器是一個事件驅動程式,伺服器處理的事件分為時間事件(定時事件)和檔案事件(與用戶端互動)兩類。
2. 檔案事件處理器是基於Reactor模式實現的網路通訊程式。檔案事件處理器會同時監聽多個通訊端。保持了Redis內部單線程設計的簡單性。
3. 檔案事件是對通訊端操作的抽象:每次通訊端變成可應答(acceptable)、可寫入(writable)或者可讀(readable)時,相應的檔案事件就會產生。
4. 檔案事件分為AE_READABLE事件(讀事件)和AE_WRITABLE事件(寫事件)兩類。
5. 時間事件分為定時事件和周期性事件:定時事件只在指定的時間到達一次,而周期性事件則每隔一段時間到達一次。
6. 伺服器在一般情況下只執行serverCron函數一個時間事件,並且這個事件是周期性事件。
7. 檔案事件和時間事件之間是合作關係,伺服器會輪流處理這兩種事件,並且處理時間的過程也不會進行搶佔。
8. 因為時間事件在檔案事件之後執行,並且事件之間不會出現搶佔,所以時間事件的實際處理時間,通常會比時間事件設定的到達時間稍晚一些。
9. 時間事件應用執行個體:serverCron函數,主要包括以下工作:
1). 補救伺服器的各類統計資訊,比如時間,記憶體佔用,資料庫佔用情況等。
2). 清理資料庫中的索引值對。
3). 關閉和清理串連失效的用戶端。
4). 嘗試進行AOF和RDB持久化操作
5). 如果伺服器是主伺服器,那麼對從伺服器進行定期同步。
6). 如果處於叢集模式,對叢集進行定期同步和串連測試。
10. Redis伺服器以周期性事件的方式來運行serverCron函數,在服務運行期間,每隔一段時間,serverCron就會執行一次,直到伺服器關閉為止。
11. 從Redis2.8開始,使用者可以通過修改hz選項來調整serverCron的每秒執行次數。2.6版本中預設規定serverCron每秒執行10次。
12. Redis在遍曆時間事件鏈表的時候,會取出最快執行的事件,以此來避免每次輪詢。
13. Redis為檔案事件編寫了多個處理器,這些事件處理器分別用於實現不用的網路通訊需求。
14. 伺服器將所有時間事件放在一個無序鏈表中,每當時間事件執行器運行時,他就遍曆整個鏈表,尋找所有已到達的時間事件,並調用相應的事件處理器。
用戶端:
1. 伺服器狀態結構使用clients鏈表串連起多個用戶端狀態,新添加的客戶單狀態會被放到鏈表的末尾。
2. 用戶端狀態的flags屬性使用不同標誌來表示用戶端的角色,以及用戶端當前所處的狀態。
3. 輸入緩衝區記錄了用戶端發送的命令請求,這個緩衝區的大小不能超過1G。
4. 命令參數和參數個數會被記錄在用戶端狀態的argv和argc屬性裡面,而cmd屬性則記錄了用戶端要執行命令的實現函數。
5. 用戶端由固定大小緩衝區和可變大小緩衝區兩種緩衝區可用,其中固定大小緩衝區的最大大小為16KB,而可變大小緩衝區的最大大小不能超過伺服器設定的硬性限制。
6. 輸入緩衝區限制有兩種,如果輸出緩衝區的大小超過了伺服器設定的硬性限制,那麼用戶端會被立即關閉;除此之外,如果用戶端在一定時間內,一直超過伺服器設定的
軟性限制,那麼用戶端也會被關閉。
7. 當一個用戶端通過網路連接上伺服器時,伺服器會為這個用戶端建立相應的用戶端狀態。網路連接關閉、發送了不合協議格式的命令請求、成為CLIENT KILL命令的目標、
空轉時間逾時、輸出緩衝區的大小超出限制,以上這些原因就會造成用戶端被關閉。
8. 處理Lua指令碼的偽用戶端在伺服器初始化時建立,這個用戶端會一直存在,直到伺服器關閉。
9. 載入AOF檔案時使用的偽用戶端在載入工作開始時動態建立,載入工作完畢之後關閉。
10. 在預設情況下,一個串連到伺服器的用戶端是沒有名字的。使用CLIENT setname命令可以為用戶端設定一個名字,讓用戶端身份變得更清晰。
11. PUBSUB命令和SCRIPTLOAD命令沒有修改資料庫,但修改了伺服器狀態,所以需要強制將這個命令寫入到AOF檔案中。另外,為了讓主伺服器和從伺服器都可以正確地載入SCRIPT LOAD命令
指定的指令碼,伺服器需要使用REDIS_FORCE_REPL標誌,強制將SCRIPT LOAD命令複製給所有從伺服器。
12. 可以使用client-output-buffer-limit選項可以為普通用戶端、從伺服器端用戶端、執行發布與訂閱功能的用戶端分別設定不同的軟性限制和硬性限制。格式為:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
13. Redis伺服器使用單線程單進程的方式來處理命令請求,並與多個用戶端進行網路通訊。
14. 在主從伺服器進行複製操作時,主伺服器會成為從伺服器的用戶端,而從伺服器也會成為主伺服器的用戶端。
15. 用戶端authenticated屬性用於記錄用戶端是否通過了身分識別驗證。僅在伺服器啟用了身分識別驗證功能時使用。
redis 筆記03