持久化配置
Redis的持久化雖然可以保證資料安全,但也會帶來很多額外的開銷,因此持久化請遵循下列建議:
① 用來做快取的redis例項儘量不要開啟持久化功能
② 建議關閉RDB持久化功能,使用AOF持久化(RDB的資料安全性一直是有問題的,兩次RDB的時間比較長,又不能頻繁的RDB,因為耗時久而且需要大量的磁碟IO,對效能的影響大)
③ 利用指令碼定期在slave節點做RDB,實現資料備份
④ 設定合理的rewrite的閾值,避免頻繁的bgrewrite
⑤ 配置no-appendfsync-on-rewrite=yes,禁止在rewrite期間做aof,避免因AOF引起的阻塞(有可能導致資料的丟失)
部署有關建議:
① Redis例項的物理機要預留足夠記憶體,應對fork和rewrite
② 單個redis例項記憶體上限不要太大,例如4G或8G。可以加快fork的速度、減少主從同步、資料遷移壓力
③ 不要與CPU密集型應用部署在一起
④ 不要與高硬碟負載應用一起部署。例如:資料庫、訊息佇列
慢查詢
慢查詢:在redis執行時耗時超過某個閾值的命令,稱為慢查詢。
慢查詢的閾值可以透過配置指定:
l slowlog-log-slower-than:慢查詢閾值,單位是微妙。預設是10000,建議1000
慢查詢會被放入慢查詢日誌中,日誌的長度有上限,可以透過配置指定:
l slowlog-max-len:慢查詢日誌(本質是一個佇列)的長度。預設是128,建議1000(及時發現及時處理)
檢視慢查詢日誌列表:
l slowlog len:查詢慢查詢日誌長度
l slowlog get[n]:讀取n條慢查詢日誌
l slowlog reset:清空慢查詢列表
命令及安全配置
Redis會繫結在0.0.0.0:6379,這樣將會將Redis服務暴露到公網上,而Redis如果沒有做身份認證,會出現嚴重的安全漏洞。
漏洞出現的核心的原因有以下幾點:
l Redis未設定密碼
l 利用了redis的config set命令動態修改redis配置
l 使用了root賬號許可權啟動redis
為了避免這樣的漏洞,這裡給出一些建議:
① Redis一定要設定密碼,而且要複雜
② 禁止線上使用下面命令:keys、flushall、flushdb、config set等命令。可以利用rename-command禁用。
③ Bind:限制網路卡,禁止外網網路卡訪問
④ 開啟防火牆
⑤ 不要使用root賬戶啟動redis
⑥ 儘量不使用預設的埠
記憶體安全和配置
記憶體配置
當Redis記憶體不足時,可能導致key頻繁被刪除、響應時間變長、QPS不穩定等問題。當記憶體使用率高達90%以上時就需要我們警惕,並快速定位到記憶體佔用的原因。
資料記憶體的問題
Redis提供一些命令,可以檢視到redis目前的記憶體分配狀態:
l Info memory
l Memory xxx
used_memory: Redis分配的總記憶體位元組數。
used_memory_human: 以人類可讀格式顯示的used_memory。
used_memory_rss: 從作業系統角度,Redis程序佔用的實體記憶體總量。
used_memory_peak: Redis的記憶體消耗峰值。
used_memory_peak_human: 以人類可讀格式顯示的used_memory_peak。
used_memory_lua: Lua引擎所使用的記憶體大小。
mem_fragmentation_ratio: 記憶體碎片比率,計算方式為used_memory_rss / used_memory。
mem_allocator: Redis所使用的記憶體分配器,如jemalloc, tcmalloc或libc。
active_defrag_running: 表示主動碎片整理是否正在執行。
lazyfree_pending_objects: 等待非同步釋放的物件數量。
maxmemory: 配置的最大可用記憶體。
maxmemory_human: 以人類可讀格式顯示的maxmemory。
maxmemory_policy: 當達到maxmemory時的淘汰策略。
mem_not_counted_for_evict: 不計入淘汰的記憶體量。
number_of_cached_scripts: 快取的Lua指令碼數量。
memory doctor 是 Redis 提供的一個診斷工具,用於分析 Redis 例項的記憶體使用情況並提供建議。當你執行這個命令時,它會執行一系列檢查並給出相應的報告。以下是 memory doctor 可能會檢查的幾個方面:
1. 記憶體碎片率:
檢查記憶體碎片情況,如果碎片率過高,會建議使用 MEMORY PURGE 或開啟自動記憶體碎片整理。
2. 記憶體使用量:
檢查當前記憶體使用是否接近配置的最大記憶體限制(maxmemory)。
3. 記憶體分配器:
確認使用的記憶體分配器(如 jemalloc)是否為推薦的版本。
4. 大鍵檢測:
檢查是否存在佔用大量記憶體的鍵,這些可能需要最佳化。
5. 鍵的總數:
檢查鍵的總數是否異常多,可能暗示存在鍵洩漏問題。
6. 複製積壓緩衝區:
檢查複製積壓緩衝區的大小是否合適。
7. 客戶端輸出緩衝區:
檢查客戶端輸出緩衝區是否佔用過多記憶體。
8. AOF 重寫緩衝區:
如果啟用了 AOF,檢查 AOF 重寫緩衝區的大小。
9. Lua 指令碼快取:
檢查 Lua 指令碼快取的使用情況。
10. 持久化相關:
檢查 RDB 或 AOF 持久化是否可能影響記憶體使用。
memory doctor 會根據這些檢查結果給出相應的建議,例如:
- 調整配置引數
- 最佳化資料結構
- 清理不必要的資料
- 考慮使用記憶體最佳化技術
需要注意的是,memory doctor 只是提供診斷和建議,並不會自動執行任何更改。具體的最佳化操作還需要管理員根據實際情況來執行。定期執行 memory doctor 可以幫助你及時發現和解決潛在的記憶體問題,保持 Redis 的健康執行。
MEMORY PURGE 命令是 Redis 用於記憶體最佳化的一個重要工具。它主要用於清理記憶體碎片,但並不會直接刪除任何資料。以下是 MEMORY PURGE 可以幫助清理的記憶體型別:
1. 記憶體碎片:
這是 MEMORY PURGE 的主要目標。它會嘗試整理和重新分配記憶體,減少因頻繁增刪改操作而產生的記憶體碎片。
2. 未使用的記憶體塊:
對於一些已被釋放但尚未返回給作業系統的記憶體塊,MEMORY PURGE 會嘗試將它們歸還。
3. 空閒記憶體頁:
它會嘗試將一些完全空閒的記憶體頁面返回給作業系統。
4. 內部碎片:
對於一些資料結構內部的小型碎片,MEMORY PURGE 也會嘗試進行最佳化。
需要注意的是:
- MEMORY PURGE 不會刪除任何鍵值對或者資料。
- 它主要針對的是由於記憶體分配器(如 jemalloc)的工作方式導致的記憶體碎片。
- 這個操作可能會暫時增加 CPU 使用率。
- 在某些情況下,可能無法顯著減少記憶體使用,特別是當碎片化不嚴重時。
- 這個命令在執行時可能會短暫阻塞 Redis,因此應謹慎在生產環境中使用。
使用 MEMORY PURGE 的最佳實踐:
1. 在進行此操作之前,先使用 INFO memory 命令檢查記憶體碎片率。
2. 在低峰期執行此命令。
3. 在大量刪除操作後執行,可能會有更好的效果。
4. 如果頻繁需要執行 MEMORY PURGE,考慮啟用自動記憶體碎片整理功能。
總之,MEMORY PURGE 是一個有用的工具,可以幫助最佳化 Redis 的記憶體使用,但應該謹慎使用,並結合其他記憶體管理策略一起使用。
記憶體緩衝區配置
記憶體緩衝區常見的有三種:
l 複製緩衝區:主從複製的repl_backlog_buf,如果太小可能導致頻繁的全量複製,影響效能。透過repl_backlog_size來設定,預設1mb
l AOF緩衝區:AOF刷盤之前的快取區域,AOF執行rewrite的緩衝區。無法設定容量上限
l 客戶端緩衝區:分為輸入緩衝區和輸出緩衝區,輸入緩衝區最大1G且不能設定。輸出緩衝區可以設定。
客戶端資訊: