一、持久化
二、複制
三、阻塞情況
四、記憶體管理
五、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結構降低小對象鍊規模。