天天看點

Redis開發與運維總結(一)

一、持久化

二、複制

三、阻塞情況

四、記憶體管理

五、Redis Cluster

     5.1、資料分布理論

     5.2、Redis資料分區

     5.3、通信流程

          5.3.1、Gossip消息

          5.3.2、節點選擇

     5.4、請求路由

          5.4.1、計算槽

          5.4.2、槽節點查找

     5.5、Smart用戶端

          5.5.1、smart用戶端原理

          5.5.2、Smart用戶端—JedisCluster

     5.6、ASK重定向

          5.6.1、用戶端ASK重定向流程

     5.7、故障發現

          5.7.1、主觀下線

          5.7.2、客觀下線

     5.8、總結

一、持久化

1) Redis提供了兩種持久化方式: RDB和AOF。

2) RDB使用一次性生成記憶體快照的方式, 産生的檔案緊湊壓縮比更高, 是以讀取RDB恢複速度更快。 由于每次生成RDB開銷較大, 無法做到實時持久化, 一般用于資料冷備和複制傳輸。

3) save指令會阻塞主線程不建議使用, bgsave指令通過fork操作建立子程序生成RDB避免阻塞。

4) AOF通過追加寫指令到檔案實作持久化, 通過appendfsync參數可以控制實時/秒級持久化。 因為需要不斷追加寫指令, 是以AOF檔案體積逐漸變大, 需要定期執行重寫操作來降低檔案體積。

5) AOF重寫可以通過auto-aof-rewrite-min-size和auto-aof-rewritepercentage參數控制自動觸發, 也可以使用bgrewriteaof指令手動觸發。

6) 子程序執行期間使用copy-on-write機制與父程序共享記憶體, 避免記憶體消耗翻倍。 AOF重寫期間還需要維護重寫緩沖區, 儲存新的寫入指令避免資料丢失。

7) 持久化阻塞主線程場景有: fork阻塞和AOF追加阻塞。 fork阻塞時間跟記憶體量和系統有關, AOF追加阻塞說明硬碟資源緊張。

8) 單機下部署多個執行個體時, 為了防止出現多個子程序執行重寫操作,建議做隔離控制, 避免CPU和IO資源競争。

二、複制

1) Redis通過複制功能實作主節點的多個副本。 從節點可靈活地通過slaveof指令建立或斷開複制流程。

2) 複制支援樹狀結構, 從節點可以複制另一個從節點, 實作一層層向下的複制流。 Redis2.8之後複制的流程分為: 全量複制和部分複制。 全量複制需要同步全部主節點的資料集, 大量消耗機器和網絡資源。 而部分複制有效減少因網絡異常等原因造成的不必要全量複制情況。 通過配置合理的複制積壓緩沖區盡量避免全量複制。

3) 主從節點之間維護心跳和偏移量檢查機制, 保證主從節點通信正常和資料一緻。

4) Redis為了保證高性能複制過程是異步的, 寫指令處理完後直接傳回給用戶端, 不等待從節點複制完成。 是以從節點資料集會有延遲情況。

5) 當使用從節點用于讀寫分離時會存在資料延遲、 過期資料、 從節點可用性等問題, 需要根據自身業務提前作出規避。

6) 在運維過程中, 主節點存在多個從節點或者一台機器上部署大量主節點的情況下, 會有複制風暴的風險。

三、阻塞情況

1) 用戶端最先感覺阻塞等Redis逾時行為, 加入日志監控報警工具可快速定位阻塞問題, 同時需要對Redis程序和機器做全面監控。

2) 阻塞的内在原因: 确認主線程是否存在阻塞, 檢查慢查詢等資訊,發現不合理使用API或資料結構的情況, 如keys、 sort、 hgetall等。 關注CPU使用率防止單核跑滿。 當硬碟IO資源緊張時, AOF追加也會阻塞主線程。

3) 阻塞的外在原因: 從CPU競争、 記憶體交換、 網絡問題等方面入手排查是否因為系統層面問題引起阻塞。

四、記憶體管理

1) Redis實際記憶體消耗主要包括: 鍵值對象、 緩沖區記憶體、 記憶體碎片。

2) 通過調整maxmemory控制Redis最大可用記憶體。 當記憶體使用超出時,根據maxmemory-policy控制記憶體回收政策。

3) 記憶體是相對寶貴的資源, 通過合理的優化可以有效地降低記憶體的使用量, 記憶體優化的思路包括:

  • 精簡鍵值對大小, 鍵值字面量精簡, 使用高效二進制序列化工具。
  • 使用對象共享池優化小整數對象。
  • 資料優先使用整數, 比字元串類型更節省空間。
  • 優化字元串使用, 避免預配置設定造成的記憶體浪費。
  • 使用ziplist壓縮編碼優化hash、 list等結構, 注重效率和空間的平衡。
  • 使用intset編碼優化整數集合。
  • 使用ziplist編碼的hash結構降低小對象鍊規模。

繼續閱讀