redis 筆記04

來源:互聯網
上載者:User

標籤:

伺服器

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.