redis 筆記04 服務器、複製

服務器數據庫

1. 一個命令請求從發送到完成主要包括如下步驟:緩存

    1). 客戶端將命令請求發送給服務器安全

    2). 服務器讀取命令請求,並分析出命令參數服務器

    3). 命令執行器根據參數查找命令的實現函數,而後執行實現函數並得出命令回覆網絡

    4). 服務器將命令回覆返回給客戶端數據結構

2. serverCron函數默認每隔100毫秒執行一次,它的工做主要包括更新服務器狀態信息,處理服務器接收的SIGTERM信號,管理客戶端資源和數據庫狀態,檢查並執行持久化操做等等。異步

3. 服務器從啓動到開始處理客戶端的命令請求須要執行如下步驟:函數

    1). 初始化服務器狀態結構。爲結構中的各個屬性設置默認值。oop

    2). 載入服務器配置選項。spa

    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或以上版本

相關文章
相關標籤/搜索