天天看點

一文掌握Redis叢集實用運維工具redis-tool

一文掌握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​

​子指令可以彙總叢集各節點的主要名額資訊,并按照主從關系進行級聯展示:

  1. 基本資訊:
  • 節點狀态:可用于判斷節點基本狀态
  • ​OK​

    ​:節點正常運作中
  • ​FAIL​

    ​:節點連接配接失敗
  • ​LOAD​

    ​:節點正在進行資料加載
  • ​NOAUTH​

    ​:節點密碼認證失敗(需指定正确的通路密碼)
  • 節點角色:如果節點角色變更,可能是發生過故障切換,需要通過服務日志進一步核查
  • ​master​

    ​:主節點
  • ​slave​

    ​:從節點
  • 節點版本:對于Redis叢集,版本号應該 >=​

    ​3.0.0​

  • 運作時長:節點已經運作的時長(機關:s),可用于判斷節點是否發生重新開機
  1. 存儲資訊:
  • 鍵值數:節點中存在的鍵值數
  • 使用記憶體:節點使用的記憶體量,建議不要超過10G,如果過高應該擴大叢集規模
  1. 負載資訊:
  • 用戶端數:節點目前接入的用戶端連接配接數
  • %CPU:節點目前的CPU使用率百分比,通常不應該超過70%
  • OPS:節點目前每秒處理的指令請求量
  • RTT:節點目前請求響應時延(機關:us),通常不應該超過1000
  1. 彙總資訊

    按主節點和叢集次元,彙總節點數、鍵值數、記憶體使用量、用戶端連接配接數、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:

  1. 實時監控統計節點每秒處理的指令,并記錄指令詳情至檔案中[172.16.18.81-6380.mon]
  2. 基于監控的指令詳情檔案進行熱點KEY通路分析,發現熱點通路鍵
key1      
熱點key的存在通常需要從業務使用側進行優化,主要的處理政策:
  • 将每次業務通路的key進行拆分,避免總是通路同一個key
  • 對需要頻繁通路的key進行本地緩存,本地緩存資料可以通過定時政策進行更新
  • 優化業務流程處理邏輯,減少無效的互動通路次數
TOP指令跟蹤

場景介紹:當Redis叢集整體負載比較高,或者需要配合業務應用檢查指令執行是否符合預期時,都需要我們對Redis叢集的指令執行情況進行統計檢查,并發現無效或高消耗的指令調用。

使用​

​moni​

​子指令能夠滾動展示周期内TOP10指令執行次數、平均處理耗時、CPU使用率、建立用戶端連接配接數、網絡出入流量等資訊;當存在大量非應用直接調用的指令時(例如​

​PING​

​、​

​CLUSTER​

​),或者某個指令執行次數或平均處理耗時不符合預期,都可以作為下一步排查的方向。

  1. 每秒滾動展示叢集TOP10指令
  2. 每3秒滾動展示叢集TOP10指令及平均處理耗時(
*      

數值,對應的即為平均處理耗時,機關:us)

KEY字首統計

場景介紹:當我們隻是需要掌握Redis中存儲的各類業務鍵值數量比例,以便提供給業務使用側評估是否合理,是否存在大量無效鍵值可以清理;基于rdb檔案可以進行深入分析,得到更多詳細的内容,但是在節點資料量很大時,資料分析将占用更多的主機資源,耗時也更長。

使用​

​keys​

​子指令可以快速的抽取一定數量的KEY名稱,對KEY按字首統計鍵值數和占比資訊後按字首層級進行展示,其中第一層級會采用背景高亮,而鍵值占比達到一定門檻值時會進行字型高亮區分:

配置參數管理

場景介紹:因為叢集中會存在很多Redis節點,當我們要檢視、修改某個運作參數,或者需要檢查各節點配置差異時,就會因為操作繁雜,而增大操作出錯的風險。

使用​

​config​

​子指令可以友善的檢查各節點的配置差異,以及按角色來統一查詢/修改指定配置參數。

檢查節點配置差異

當未指定參數進行查詢或修改時,預設會檢查叢集中各節點的配置差異,并且按各參數值數量(​

​UNIQ​

​)升序展示,其中存在不同值的參數行會高亮顯示:

  • CONFIG_NAME:參數名
  • UNIQ:不同參數值數量,1表示各節點的參數值相同
  • DIFF_VALUES:參數值詳情,不同參數值以逗号(​

    ​,​

    ​)間隔
查詢/修改指定參數
  1. 查詢叢集各節點的slowlog-log-slower-than參數值
  2. 修改叢集主節點的slowlog-log-slower-than參數值為1000

繼續閱讀