redis自學(47)服務端最佳化

蓝海的bug本發表於2024-06-21

持久化配置

Redis的持久化雖然可以保證資料安全,但也會帶來很多額外的開銷,因此持久化請遵循下列建議:

① 用來做快取的redis例項儘量不要開啟持久化功能

② 建議關閉RDB持久化功能,使用AOF持久化(RDB的資料安全性一直是有問題的,兩次RDB的時間比較長,又不能頻繁的RDB,因為耗時久而且需要大量的磁碟IO,對效能的影響大)

③ 利用指令碼定期在slave節點做RDB,實現資料備份

④ 設定合理的rewrite的閾值,避免頻繁的bgrewrite

⑤ 配置no-appendfsync-on-rewrite=yes,禁止在rewrite期間做aof,避免因AOF引起的阻塞(有可能導致資料的丟失)

部署有關建議:

① Redis例項的物理機要預留足夠記憶體,應對forkrewrite

② 單個redis例項記憶體上限不要太大,例如4G8G。可以加快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 利用了redisconfig set命令動態修改redis配置

l 使用了root賬號許可權啟動redis

為了避免這樣的漏洞,這裡給出一些建議:

① Redis一定要設定密碼,而且要複雜

② 禁止線上使用下面命令:keysflushallflushdbconfig 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, tcmalloclibc

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且不能設定。輸出緩衝區可以設定。

客戶端資訊:

相關文章