redis運維工具
1、Redis 集羣經常使用命令
1.集羣(cluster)
CLUSTER INFO #打印集羣的信息 CLUSTER NODES #列出集羣當前已知的全部節點(node),以及這些節點的相關信息。
2.節點(node)
CLUSTER MEET <ip> <port> #將 ip 和 port 所指定的節點添加到集羣當中,讓它成爲集羣的一份子。 CLUSTER FORGET <node_id> #從集羣中移除 node_id 指定的節點。 CLUSTER REPLICATE <node_id> #將當前節點設置爲 node_id 指定的節點的從節點。 CLUSTER SAVECONFIG #將節點的配置文件保存到硬盤裏面。
3.槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] #將一個或多個槽(slot)指派(assign)給當前節點。 CLUSTER DELSLOTS <slot> [slot ...] #移除一個或多個槽對當前節點的指派。 CLUSTER FLUSHSLOTS #移除指派給當前節點的全部槽,讓當前節點變成一個沒有指派任何槽的節點。 CLUSTER SETSLOT <slot> NODE <node_id> #將槽slot指派給node_id指定的節點,若是槽已經指派給另外一個節點,那麼先讓另外一個節點刪除該槽>,而後再進行指派。 CLUSTER SETSLOT <slot> MIGRATING <node_id> #將本節點的槽 slot 遷移到 node_id 指定的節點中。 CLUSTER SETSLOT <slot> IMPORTING <node_id> #從 node_id 指定的節點中導入槽 slot 到本節點。 CLUSTER SETSLOT <slot> STABLE #取消對槽 slot 的導入(import)或者遷移(migrate)。
4.鍵 (key)
CLUSTER KEYSLOT <key> #計算鍵 key 應該被放置在哪一個槽上。 CLUSTER COUNTKEYSINSLOT <slot> #返回槽 slot 目前包含的鍵值對數量。 CLUSTER GETKEYSINSLOT <slot> <count> #返回 count 個 slot 槽中的鍵。
2、Redis 運維工具
1.數據導入導出工具
需求背景node
剛切換到 redis集羣的時候確定會面臨數據導入的問題,因此這裏推薦使用 redis-migrate-tool 工具來導 入單節點數據到集羣裏python
官方地址: http://www.oschina.net/p/redis-migrate-toolgit
# 1.安裝工具 yum install libtool autoconf automake git bzip2 -y cd /opt/ git clone https://github.com/vipshop/redis-migrate-tool.git cd redis-migrate-tool/ autoreconf -fvi ./configure make && make install # 2.編寫配置文件 cat > 6379_to_6380.conf << EOF [source] type: single servers: - 10.0.0.51:6379 [target] type: redis cluster servers: - 10.0.0.51:6380 [common] listen: 0.0.0.0:8888 source_safe: true EOF # 3.單節點生成測試數據 redis-server /opt/redis_6379/conf/redis_6379.conf cat >input_6379.sh<<EOF #!/bin/bash for i in {1..1000} do redis-cli -c -h db01 -p 6379 set oldzhang_\${i} oldzhang_\${i} echo "set oldzhang_\${i} is ok" done EOF sh input_6379.sh # 4.運行工具遷移單節點數據到集羣 redis-migrate-tool -c 6379_to_6380.conf # 5.運行工具驗證數據是否遷移完成 redis-migrate-tool -c 6379_to_6380.conf -C redis_check # 6.數據平均 redis-cli -c -h 10.0.0.51 -p 6380 db01:6380> 337) db02:6380> 340) db03:6380> 329)
注意主從關係 若是51:6379是從庫 測試數據寫不進去 從新指向主庫github
2.RDB文件遷移到集羣
# 1.先把集羣的RDB文件都收集起來 - 在從節點上執行bgsave命令生成RDB文件 redis-cli -h 10.0.0.51 -p 6381 BGSAVE redis-cli -h 10.0.0.52 -p 6381 BGSAVE redis-cli -h 10.0.0.53 -p 6381 BGSAVE # 2.把從節點生成的RDB文件拉取過來 mkdir rdb_backup cd rdb_backup/ scp 10.0.0.51:/data/redis_6381/redis_6381.rdb db01_6381.rdb scp 10.0.0.52:/data/redis_6381/redis_6381.rdb db02_6381.rdb scp 10.0.0.53:/data/redis_6381/redis_6381.rdb db03_6381.rdb # 3.清空數據 redis-cli -c -h 10.0.0.51 -p 6380 flushall redis-cli -c -h 10.0.0.52 -p 6380 flushall redis-cli -c -h 10.0.0.53 -p 6380 flushall # 4.編寫配置文件 cat >rdb_to_cluter.conf <<EOF [source] type: rdb file servers: - /root/rdb_backup/db01_6381.rdb - /root/rdb_backup/db02_6381.rdb - /root/rdb_backup/db03_6381.rdb [target] type: redis cluster servers: - 10.0.0.51:6380 [common] listen: 0.0.0.0:8888 source_safe: true EOF # 5.使用工具導入 redis-migrate-tool -c rdb_to_cluter.conf # 6.運行工具驗證數據是否遷移完成 redis-migrate-tool -c 6379_to_6380.conf -C redis_check # 7.數據平均 redis-cli -c -h 10.0.0.51 -p 6380 db01:6380> 337) db02:6380> 340) db03:6380> 329)
3.分析鍵值大小
**需求背景 ** redis 的內存使用太大鍵值太多,不知道哪些鍵值佔用的容量比較大,並且在線分析會影響性能.redis
# 1.安裝命令: [root@db01 ~]# yum install python-pip gcc python-devel -y [root@db01 ~]# cd /opt/ [root@db01 ~]# git clone https://github.com/sripathikrishnan/redis-rdb-tools [root@db01 ~]# cd redis-rdb-tools [root@db01 ~]# pip install python-lzf [root@db01 ~]# python setup.py install # 2.生成測試數據: [root@db01 ~]# vim txt.txt 亂七八糟寫進去 [root@db01 ~]# redis-cli -h db01 -p 6379 set txt $(cat txt.txt) # 3.執行bgsave生成rdb文件 [root@db01 ~]# redis-cli -h db01 -p 6379 BGSAVE # 4.使用工具分析: [root@db01 ~]# cd /data/redis_6379/ [root@db01 /data/redis_6379]# rdb -c memory redis_6379.rdb -f redis_6379.rdb.csv [root@db01 /data/redis_6379]# ll -rw-r--r-- 1 root root 39010 Jan 3 16:46 redis_6379.rdb.csv # 5.過濾分析 [root@db01 /data/redis_6379]# awk -F"," '{print $4,$3}' redis_6379.rdb.csv |sort -r 1328 txt # 6.將結果整理彙報給領導,詢問開發這個key是否能夠刪除
一些其餘工具算法
# 使用工具將rdb轉換成json [root@db01 /data/redis_6379]# rdb --command json redis_6379.rdb -f redis_6379.rdb.json [root@db01 /data/redis_6379]# ll total 208 -rw-r--r-- 1 root root 103018 Jan 3 16:45 redis_6379.aof -rw-r--r-- 1 root root 26895 Jan 3 16:45 redis_6379.rdb -rw-r--r-- 1 root root 39010 Jan 3 16:46 redis_6379.rdb.csv -rw-r--r-- 1 root root 32852 Jan 3 16:53 redis_6379.rdb.json # 使用工具對比rdb文件差別 [root@db01 /data/redis_6379]# cd /root/rdb_backup [root@db01 ~/rdb_backup]# rdb --command diff db01_6381.rdb | sort > dump1.txt [root@db01 ~/rdb_backup]# rdb --command diff db02_6381.rdb | sort > dump2.txt [root@db01 ~/rdb_backup]# vimdiff dump1.txt dump2.txt
4.監控過時鍵
**需求背景 ** 由於開發重複提交,致使電商網站優惠捲過時時間失效 **問題分析 ** 若是一個鍵已經設置了過時時間,這時候在 set 這個鍵,過時時間就會取消json
**解決思路 ** 如何在不影響機器性能的前提下批量獲取須要監控鍵過時時間 1.Keys * 查出來匹配的鍵名。而後循環讀取 ttl 時間 2.scan * 範圍查詢鍵名。而後循環讀取 ttl 時間vim
Keys 重操做,會影響服務器性能,除非是不提供服務的從節點 Scan 負擔小,可是須要去屢次才能取完,須要寫腳本ruby
腳本內容bash
cat 01get_key.sh #!/bin/bash key_num=0 > key_name.log for line in $(cat key_list.txt) do while true do scan_num=$(redis-cli -h 10.0.0.51 -p 6380 SCAN ${key_num} match ${line}\* count 1000|awk 'NR==1{print $0}') key_name=$(redis-cli -h 10.0.0.51 -p 6380 SCAN ${key_num} match ${line}\* count 1000|awk 'NR>1{print $0}') echo ${key_name}|xargs -n 1 >> key_name.log ((key_num=scan_num)) if [ ${key_num} == 0 ] then break fi done done
3、內存管理參數
當達到內存使用限制以後redis會出發對應的控制策略
redis支持6種策略: # 1.noevicition 默認策略,不會刪除任何數據,拒絕全部寫入操做並返回客戶端錯誤信息,此時只響應讀操做 # 2.volatile-lru 根據LRU算法刪除設置了超時屬性的key,直到騰出足夠空間爲止,若是沒有可刪除的key,則退回到noevicition策略 # 3.allkeys-lru 根據LRU算法刪除key,無論數據有沒有設置超時屬性 # 4.allkeys-random 隨機刪除全部key # 5.volatile-random 隨機刪除過時key # 6.volatile-ttl 根據key的ttl,刪除最近要過時的key
# 動態配置 config set maxmemory-policy # 設置內存最大限制 config set maxmemory 2G