一文掌握Redis叢集實用運維工具redis-tool
關于redis-tool工具
Redis作為nosql記憶體資料庫,因為豐富的資料類型、可持久化,以及出色的性能在許多公司中都得到了廣泛的應用。随着業務量的增長,單機Redis無論資料容量還是通路性能都逐漸滿足不了實際需求,Redis cluster叢集因為良好的可擴充性,以及故障自動切換能力,被越來越多的公司作為分布式緩存産品的解決方案,但随之而來的運維複雜度也越來越高。
我在cnaaa購買了雲伺服器。
redis-tool 基于原生的redis-cli用戶端工具來進行Redis叢集的監控、配置、問題分析等運維管理,能夠極大降低Redis cluster叢集的運維成本。同時作為腳本化工具,下載下傳即可用,即使對于Redis初學者,也能夠快速掌握叢集的運作狀況,完成叢集配置管理、性能問題排查,具備Redis叢集的基本運維能力。
工具可以做什麼?
redis-tool工具主要面向日常運維管理中的常見工作,提升運維效率,簡化操作複雜度:
- 叢集監控:能夠擷取叢集節點的鍵值數、記憶體使用量、每秒請求量、CPU使用率、請求響應時延等格式化資訊,并給出異常告警提示
- 配置管理:可以按節點屬性來統一查詢或修改指定的運作參數,并且支援對叢集各節點的運作參數進行差異對比
- 問題分析:具備慢指令日志查詢、熱點key分析、TOP指令跟蹤、KEY字首統計等問題分析能力
如何使用工具?
redis-tool工具使用shell腳本實作,下載下傳到具有redis-cli工具的主機上即可使用(通常可部署到redis服務主機上)。
# 1. 從github下載下傳redis-tool工具
# 方法一:使用git下載下傳
$ git clone https://github.com/iwhalecloud-platform/redis-tool.git
# 進入下載下傳目錄
$ cd redis-tool
# 方法二:使用wget下載下傳
$ wget https://github.com/iwhalecloud-platform/redis-tool/archive/refs/heads/main.zip
# 解壓工具包&修改目錄名
$ unzip main.zip && mv redis-tool-main redis-tool
# 進入下載下傳目錄
$ cd redis-tool
# 2. 設定REDIS_HOME環境變量為redis-cli工具所在目錄(如果PATH環境變量中包含該目錄,則該步可省略)
$ echo "export REDIS_HOME=/path/to/redis-cli/" >> ~/.bashrc
$ source ~/.bashrc
# 3. 使用幫助:不帶參數執行工具可以看到使用幫助
$ ./redis-tool
Usage: redis-tool [OPTIONS] [command]
OPTIONS:
-h <IP>: Redis叢集中某個節點IP (預設值: 127.0.0.1).
-p <port>: Redis叢集中某個節點端口 (預設值: 6379).
-i <nodefile>: Redis叢集節點資訊檔案(适配codis等基于PROXY建構的叢集模式).
檔案格式(每行一個分片):<slots1> <MasterAddr> [SlaveAddr] [SlaveAddr]
-a <password>: Redis通路密碼,也可使用'REDISCLI_AUTH'環境變量來傳入.
-c <count>: 1. TOP10指令統計滾動展示次數(預設無限次, 'moni'使用).
2. 從Redis節點中擷取的慢指令記錄數(預設值: 100, 'slowlog'使用).
3. 從Redis節點中随機擷取的KEY名稱數量(預設值: 100000, 'keys'使用).
-d <delay>: TOP10指令統計滾動展示等待間隔(機關: 秒, 預設值: 3, 'moni'使用).
-t <time>: 實時指令監控跟蹤運作時長(機關: 秒, 預設值: 10, 'trace'使用).
-s: 隻處理指定Redis節點('moni' & 'slowlog'使用).
-l: TOP10指令統計滾動展示包含指令執行平均處理耗時('moni'使用).
-f <file>: 1. 基于監控的指令詳情檔案進行指令監控跟蹤處理('trace'使用).
2. 基于指定的KEY名稱清單檔案進行字首統計('keys'使用).
-L <level>: 按KEY字首統計層級(預設值: 3, 'keys'使用).
-H: 基于監控的指令詳情檔案進行熱點KEY通路分析('trace'使用).
-C: 基于監控的指令詳情檔案按用戶端IP進行指令統計('trace'使用).
-r: 按裸輸據形式輸出叢集節點監控名額,便于存儲或上報至第三方監控系統 ('nodes'使用).
-k <key>: 要查詢或修改的Redis運作參數名('config'使用).
-v <value>: 要修改的Redis運作參數值('config'使用).
-M: 隻通路叢集中主節點的運作參數 ('config'使用).
-S: 隻通路叢集中從節點的運作參數 ('config'使用).
-w: Redis節點運作參數修改後需要重寫配置檔案('config'使用).
command:
nodes: 叢集節點狀态監控 (預設執行)
keys: 按KEY字首層級進行統計分析
moni: TOP10指令周期性滾動統計
trace: 實時指令監控跟蹤 & 熱點KEY通路分析
slowlog: 叢集慢指令日志查詢
config: 查詢/修改叢集運作參數 & 叢集運作參數差異檢查
什麼時候使用?
Redis叢集監控
場景介紹:日常運維中最常做的就是檢查叢集的運作狀态、負載情況,作為排查業務通路慢、連接配接失敗等問題的基本手段。雖然Redis本身提供的監控指令包含豐富的資訊,但對于普通人員來說,掌握這些内容的門檻太高,而要整合叢集所有節點的資訊就更為繁瑣。
使用
nodes
子指令可以彙總叢集各節點的主要名額資訊,并按照主從關系進行級聯展示:
- 基本資訊:
- 節點狀态:可用于判斷節點基本狀态
-
:節點正常運作中OK
-
:節點連接配接失敗FAIL
-
:節點正在進行資料加載LOAD
-
:節點密碼認證失敗(需指定正确的通路密碼)NOAUTH
- 節點角色:如果節點角色變更,可能是發生過故障切換,需要通過服務日志進一步核查
-
:主節點master
-
:從節點slave
- 節點版本:對于Redis叢集,版本号應該 >=
3.0.0
- 運作時長:節點已經運作的時長(機關:s),可用于判斷節點是否發生重新開機
- 存儲資訊:
- 鍵值數:節點中存在的鍵值數
- 使用記憶體:節點使用的記憶體量,建議不要超過10G,如果過高應該擴大叢集規模
- 負載資訊:
- 用戶端數:節點目前接入的用戶端連接配接數
- %CPU:節點目前的CPU使用率百分比,通常不應該超過70%
- OPS:節點目前每秒處理的指令請求量
- RTT:節點目前請求響應時延(機關:us),通常不應該超過1000
-
彙總資訊
:
按主節點和叢集次元,彙總節點數、鍵值數、記憶體使用量、用戶端連接配接數、OPS、%CPU等名額資訊
- 主節點分布均勻,能夠更好的發揮Redis性能,而且也有利于故障切換時的主從選舉,是以對于主節點分布不均勻時,會給出告警資訊
- 工具支援
參數,用于将叢集節點名額以裸輸據輸出,友善進行名額檔案存儲,或上報至第三方監控平台
-r
問題排查分析
慢指令分析
場景介紹:當用戶端通路Redis存在時延過大時(上百毫秒),通常我們需要分析是否存在慢指令日志;Redis本身提供的日志資訊未進行格式化,不利于檢視;對于Redis叢集來說,因為存在很多節點,進一步增大了慢指令日志分析難度。
使用
slowlog
子指令可以彙總叢集各節點的慢指令日志,按日志生成時間進行排序展示格式化後的指令詳情:
- 日志按時間順序展示,目前頁面展示最新的日志資訊
- 對于存在慢指令日志的日期會進行日志數量彙總
- 工具支援
參數,來指定查詢節點最新的慢指令記錄數(預設值:
-c <count>
)
100
慢指令日志主要原因:
- 大key通路:key值包含的元素數太大時對Redis服務性能影響較大,建議優化業務邏輯,進行大key拆分或使用替代指令(例如使用
代替HSCAN
)HGETALL
- 複雜指令:
、KEYS
、FLUSHDB
等,生産環境通常禁止使用HGETALL
- 主機記憶體不足:當主機因為記憶體不足,而使用了磁盤交換區時,對于Redis服務性能影響很大,需要進行記憶體使用限制或主機資源擴容
- 主機CPU繁忙:主機CPU配置較低,或者部署了其他高CPU占用軟體,生産環境建議Redis主機獨占部署
- CPU使用限制:通過cgroup限制了Redis程序的CPU使用率,導緻通路性能下降,生産環境不建議進行限制
熱點key分析
場景介紹:當業務應用性能出現瓶頸,而Redis叢集整體通路量遠未達到預期時,可能是因為熱點key通路導緻的性能問題,需要進行問題排查分析;redis-cli自帶的熱點key查找受限于服務版本、服務配置,以及查詢的是整個運作周期内的熱點key,問題定位的性能和準确性都難以達到期望效果。
當通過Redis叢集監控發現某個Redis節點的
%CPU
或
OPS
名額相對于其他節點高很多時,通常是因為存在熱點key通路,此時可以使用
trace
子指令實時監控該節點的指令請求,并分析KEY的通路請求占比,進而發現熱點key:
- 實時監控統計節點每秒處理的指令,并記錄指令詳情至檔案中[172.16.18.81-6380.mon]
- 基于監控的指令詳情檔案進行熱點KEY通路分析,發現熱點通路鍵
key1
熱點key的存在通常需要從業務使用側進行優化,主要的處理政策:
- 将每次業務通路的key進行拆分,避免總是通路同一個key
- 對需要頻繁通路的key進行本地緩存,本地緩存資料可以通過定時政策進行更新
- 優化業務流程處理邏輯,減少無效的互動通路次數
TOP指令跟蹤
場景介紹:當Redis叢集整體負載比較高,或者需要配合業務應用檢查指令執行是否符合預期時,都需要我們對Redis叢集的指令執行情況進行統計檢查,并發現無效或高消耗的指令調用。
使用
moni
子指令能夠滾動展示周期内TOP10指令執行次數、平均處理耗時、CPU使用率、建立用戶端連接配接數、網絡出入流量等資訊;當存在大量非應用直接調用的指令時(例如
PING
、
CLUSTER
),或者某個指令執行次數或平均處理耗時不符合預期,都可以作為下一步排查的方向。
- 每秒滾動展示叢集TOP10指令
- 每3秒滾動展示叢集TOP10指令及平均處理耗時(
*
數值,對應的即為平均處理耗時,機關:us)
KEY字首統計
場景介紹:當我們隻是需要掌握Redis中存儲的各類業務鍵值數量比例,以便提供給業務使用側評估是否合理,是否存在大量無效鍵值可以清理;基于rdb檔案可以進行深入分析,得到更多詳細的内容,但是在節點資料量很大時,資料分析将占用更多的主機資源,耗時也更長。
使用
keys
子指令可以快速的抽取一定數量的KEY名稱,對KEY按字首統計鍵值數和占比資訊後按字首層級進行展示,其中第一層級會采用背景高亮,而鍵值占比達到一定門檻值時會進行字型高亮區分:
配置參數管理
場景介紹:因為叢集中會存在很多Redis節點,當我們要檢視、修改某個運作參數,或者需要檢查各節點配置差異時,就會因為操作繁雜,而增大操作出錯的風險。
使用
config
子指令可以友善的檢查各節點的配置差異,以及按角色來統一查詢/修改指定配置參數。
檢查節點配置差異
當未指定參數進行查詢或修改時,預設會檢查叢集中各節點的配置差異,并且按各參數值數量(
UNIQ
)升序展示,其中存在不同值的參數行會高亮顯示:
- CONFIG_NAME:參數名
- UNIQ:不同參數值數量,1表示各節點的參數值相同
- DIFF_VALUES:參數值詳情,不同參數值以逗号(
)間隔,
查詢/修改指定參數
- 查詢叢集各節點的slowlog-log-slower-than參數值
- 修改叢集主節點的slowlog-log-slower-than參數值為1000