標籤:
伺服器
1. 一個命令請求從發送到完成主要包括以下步驟:
1). 用戶端將命令請求發送給伺服器
2). 伺服器讀取命令請求,並分析出命令參數
3). 命令執行器根據參數尋找命令的實現函數,然後執行實現函數並得出命令回複
4). 伺服器將命令回複返回給用戶端
2. serverCron函數預設每隔100毫秒執行一次,它的工作主要包括補救伺服器狀態資訊,處理伺服器接收的SIGTERM訊號,管理用戶端資源和資料庫狀態,檢查並執行持久化操作等等。
3. 伺服器從啟動到恩給你處理用戶端的命令請求需要執行以下步驟:
1). 初始化伺服器狀態結構。為結構中的各個屬性設定預設值。
2). 載入伺服器配置選項。
3). 初始化伺服器資料結構。包括建立共用對象,如一些常用字串("OK"等),整數1到10000的字串對象等等。
4). 還原資料庫狀態,即載入RDB或者AOF檔案。
5). 執行事件迴圈,開始接受用戶端的串連請求。
4. serverCron函數執行的主要操作:
1). 補救伺服器時間緩衝。每次擷取系統目前時間太耗資源,可以將系統時間緩衝起來。不重要的事件使用緩衝時間,重要的事件依舊擷取當前系統時間。
2). 更新LRU時鐘。伺服器時間緩衝的一種。每個Redis對象都有一個lru屬性,這個lru屬性儲存了對象最後一次被命令訪問的時間。
3). 補救伺服器每秒執行命令次數。可以通過INFO stats 命令的instantaneous_ops_per_sec域查看。
4). 補救伺服器記憶體峰值記錄。INFO memory命令的used_memory_peak和used_memory_peak_human兩個域分別以兩種格式記錄了伺服器的記憶體峰值。
5). 處理SIGTERM訊號。伺服器關閉訊號,接收到該訊號後,伺服器在關閉自身之前會進行RDB持久化操作。
6). 管理用戶端資源。關閉,重新分配輸入緩衝區等。
7). 管理資料庫資源。對伺服器中的一部分資料庫進行檢查,刪除到期鍵,對欄位進行收縮操作等。
8). 執行被延遲的BGREWRITEAOF。
9). 檢查持久化操作的運行狀態。檢查新的RDB檔案是否建立完成,檢查是否滿足AOF重寫條件等。
10). 將AOF緩衝區中的內容寫入AOF檔案
11). 關閉非同步用戶端。關閉那些輸出緩衝區大小超出限制的用戶端。
12). 增加cronloopse計數器的值。也即是serverCron函數執行的次數。
複製
1. Redis2.8以前的複製功能不能高效地處理斷線後重複製情況,但Redis2.8新添加的部分重同步功能可以解決這個問題。
2. 部分重同步通過複製位移量、複製積壓緩衝區、伺服器運行ID三個部分來實現。
3. 在複製操作剛開始的時候,從伺服器會成為主伺服器的用戶端,並通過向主伺服器發送命令請求來執行複製步驟,而在複製操作的後期,主從伺服器會互相成為對方的用戶端。
4. 主伺服器通過向從伺服器傳播命令來更新從伺服器的狀態,儲存主從伺服器一致,而從伺服器則通過向主伺服器發送命令進行心跳檢測,以及命令丟失檢測。
5. 在Redis中,使用者可以通過執行SLAVEOF命令或者設定slaveof選項,讓一個伺服器(從伺服器)去複製另一個伺服器(主伺服器)。
6. 舊版複製功能的實現:
1). 同步
a. 從伺服器向主伺服器發送SYNC命令
b. 主伺服器執行BGSAVE命令,後台產生一個RDB檔案,並使用緩衝區記錄從現在開始執行的所有寫命令
c. 主伺服器將RDB檔案發送給從伺服器,從伺服器載入RDB檔案
d. 主伺服器將緩衝區的命令發送給從伺服器
2). 命令傳播:為了讓主從伺服器一直保持一致狀態,主伺服器需要對從伺服器執行命令傳播操作:主伺服器將自己執行的寫命令,發送給從伺服器執行。
7. 舊版複製功能的缺陷: 斷線複製會重新複製主伺服器中的所有內容。
8. 新版複製功能的實現,Redis從2.8版本開始,使用PSYNC命令代替SYNC命令來執行複製時的同步操作。PSYNC命令具有完整重同步和部分重同步兩種模式:
1). 完整重同步:執行的步驟和SYNC命令的執行步驟基本一樣。
2). 部分重同步:指同步斷開後的操作。
9. 部分重同步的實現:
1). 複製位移量:主從伺服器會分別維護一個複製位移量。通過對比主從伺服器的複製位移量,程式可以很容易地知道主從伺服器是否處於一致狀態。
2). 複製積壓緩衝區 : 複製積壓緩衝區是由主伺服器維護的一個固定長度先進先出隊列,預設大小為1M。緩衝區裡面會儲存著一部分最近傳播的寫命令,並且複製積壓緩衝區會為隊列中
的每個位元組記錄相應的複製位移量。
3). 伺服器運行ID:初次串連時,主伺服器會將運行ID傳給從伺服器,從伺服器將該ID儲存起來。斷開重連時,根據此ID判斷之前是否有複製關係。
10. 正確估算和設定複製積壓緩衝區的大小非常重要。估算公式:second*write_size_per_second , second為串連平均所需時間。write_size_per_second 表示主伺服器每秒產生的
寫命令資料量。例如:每秒1M,5秒才能串連上,緩衝區大小就不能低於5M。安全起見可以設定為2倍。
11. PSYNC命令的實現:
PSYNC命令的調用方法有兩種:
1). PSYNC ? -1 : 之前沒有複製過
2). PSYNC <runid> <offset> , runid 主伺服器運行ID , offset 位移量
主伺服器回複:
1). 完整重同步
2). 部分同步
3). 識別不了PSYNC,Redis版本低於2.8
12. 複製的實現
1). 設定主伺服器的地址和連接埠:SLAVEOF <master_ip> <master_port>
2). 建立通訊端串連
3). 發送PING命令
4). 身分識別驗證
5). 傳送埠資訊,將從伺服器監聽連接埠通知給主伺服器。
6). 同步
7). 命令傳播
13. 心跳檢測,在命令傳播階段,從伺服器預設會以每秒一次的頻率,向主伺服器發送命令:REPLCONF ACK <replication_offset>
1). 檢測從伺服器的網路連接狀態
2). 輔助實現min-slaves配置選項。防止主伺服器在不安全的情況下執行寫命令。例如,我們向主伺服器提供以下設定:
min-slaves-to-write 3
min-slaves-max-lag 10
那麼在從伺服器的數量少於3個,或者三個從伺服器的延遲(lag)值都大於或等於10秒時,主伺服器將拒絕執行寫命令。
3). 檢測命令丟失。通過比較位移量,可以檢測出網路斷線時,丟失的資料。重新發送給從伺服器。
14. REPLCONF ACK命令和複製積壓緩衝區都是Redis 2.8版本新增的,所以為了保證複製時主從伺服器的資料一致性,最好使用2.8或以上版本
redis 筆記04