redis 運維優化相關
阿新 • • 發佈:2019-01-22
優化慢日誌
127.0.0.1:6379> slowlog get (n 獲取條數,預設為10條)
監控慢日誌,修改配置檔案redis.conf:
slowlog-log-slower-than 10000 #單位微秒
slowlog-max-len 選項指定伺服器最多儲存多少條慢查詢日誌
發現bigkey
命令
redis-cli --bigkeys
採用scan 方式,分析bigkey以及每種欄位型別平均使用記憶體情況
檢視redis使用情況 redis info 命令相關
檢視當前使用情況: redis-cli info [memory | replication|...] 一.檢視記憶體 redis-cli info memory used_memory_human:192.54M #redis使用的記憶體,包括swap分割槽 used_memory_rss_human:256.61M #實體記憶體總量(俗稱常駐集大小)一般used_memory_rss的值只應當比used_memory的值稍微高一點,如果差距很大,說明有記憶體碎片 used_memory_peak_human:227.46M #r記憶體消耗峰值 ?? total_system_memory_human:31.36G #系統記憶體 used_memory_lua_human:37.00K #lua指令碼引擎使用的記憶體總量 maxmemory_human:0B #Redis能夠使用的最大記憶體上限(0表示沒有限制),以位元組為單位 maxmemory_policy:noeviction #redis記憶體回收策略[noeviction、allkeys-lru、volatile-lru、allkeys-random、volatile-random、volatile-ttl] mem_fragmentation_ratio:1.33 #記憶體碎片的比率(過大的話需要重新匯入) 主要觀察兩個指標: 1. used_memory_rss 和 used_memory 或 mem_fragmentation_ratio used_memory_rss > used_memory 說明有記憶體碎片,過大的話需要重新匯入 used_memory_rss < used_memory 說明記憶體不夠用,要加機器記憶體或者修改最大記憶體的值了 記憶體碎片產生原因: 額外碎片的產生是由於Redis釋放了記憶體塊,但記憶體分配器並沒有返回記憶體給作業系統,這個記憶體分配器是在編譯時指定的,可以是libc、jemalloc或者tcmalloc。會導致,實際佔用內寸高的問題 解決辦法:重啟Redis伺服器~? 二.檢視客戶端連線情況 redis-cli info clients # Clients connected_clients:313 #客戶端連線的數量(來自從機的連線除外) client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 #由於阻塞呼叫(BLPOP、BRPOP、BRPOPLPUSH)而等待的客戶端的數量。 三、檢視Redis伺服器狀態 redis-cli info Stats total_connections_received:56 #啟動來Redis伺服器接受的連線總數 total_commands_processed:52393 #處理的命令總數 instantaneous_ops_per_sec:6 #每秒鐘處理的命令數量 total_net_input_bytes:1862414 #通過網路接收的資料總量,以位元組為單位。 total_net_output_bytes:750529 #通過網路傳送的資料總量,以位元組為單位。 instantaneous_input_kbps:0.25 #每秒接受資料速率 instantaneous_output_kbps:0.07 #每秒傳送資料速率 rejected_connections:0 #由於maxclients限制而拒絕的連線數量 #主從相關 sync_full:0 #主機和從機進行完全同步的次數 sync_partial_ok:0 sync_partial_err:0 expired_keys:1 #過期鍵總數 evicted_keys:0 #由於maxmemory限制,而被回收記憶體的鍵的總數。 keyspace_hits:35919 #在主字典中成功查詢到鍵的次數。 keyspace_misses:567 #在主字典中未能成功查詢到鍵的次數。??? pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:894 migrate_cached_sockets:0 slave_expires_tracked_keys:0 active_defrag_hits:0 active_defrag_misses:0 active_defrag_key_hits:0 active_defrag_key_misses:0 四、檢視命令使用情況 redis-cli info commandstats 命令 ----呼叫次數----命令消耗的CPU時間總量-----每次執行命令消耗CPU時間的平均值(微秒) cmdstat_get:calls=1042987138,usec=3100245183,usec_per_call=2.97 cmdstat_set:calls=8405476,usec=51001447,usec_per_call=6.07 cmdstat_setex:calls=27187256,usec=339466461,usec_per_call=12.49 cmdstat_del:calls=1953523,usec=10125078,usec_per_call=5.18 cmdstat_exists:calls=4083927,usec=12597033,usec_per_call=3.08 cmdstat_incr:calls=26561,usec=181897,usec_per_call=6.85 ... 五、檢視redis 各個庫使用情況 :redis-cli info keyspace 資料庫編號--------鍵數量--------過期key數量--------鍵平均生寸時間 db0:keys=10438,expires=0,avg_ttl=0 db1:keys=23,expires=3,avg_ttl=202262388 db5:keys=4,expires=0,avg_ttl=0 db6:keys=1,expires=1,avg_ttl=814949 六、檢視實時redis使用情況 redis-cli monitor (這個命令線上禁止使用!很消耗效能)
redis AOF VS RDB
RDB(Redis DataBase)和AOF(Append Only File)
簡單的說:RDB 是某個時間節點redis資料的快照,AOF是類似mysql binglog日誌,將redis執行的指令儲存下來。兩種都是為redis資料備份方式。兩者不衝突,可以同時開啟~也可以只保留一個(aof 預設沒有開啟)
RDB優點
- RDB 在重啟儲存了大資料集的例項時比 AOF 要快(因為RDB是一個快照,AOF是很多指令合計)
- RDB 持久化時只需要父程序fock(但是fock的時候也會阻塞主程序)一個子程序,不影響父程序效能
- 可以複製RDB檔案進行redis資料替換
RDB缺點
- RDB設定每隔多長時間多少個鍵值發生改變才進行快照替換(資料可能會丟失一部分)
- RDB是全量複製,如果資料集比較大時,fork的過程非常耗時也很吃機器效能。
AOF優點
- AOF最多隻會丟失一秒資料,資料完整性高
- AOF是一個追加檔案,在斷電時也沒有損壞問題,即使檔案末尾寫到一半,使用redis-check-aof 也可以很快修復
- AOF裡面是一個一個的操作指令,很容易理解和解析,如果執行了誤操作,可以開啟aof日誌檔案刪除對應的那行,然後重啟恢復資料
AOF缺點
- 相同資料集的資料aof檔案要遠大於rdb檔案,恢復速度慢於rdb(即使有AOF重寫機制)
- aof執行效率低於rdb
AOF和RDB如何開啟以及相關配置引數
AOF
- aof 3種策略 always,every second,no (由系統決定什麼時候追加)
- 原生aof 和aof 重寫(bgrewriteaof 類似生成rdb 檔案)(將過期的,多次設定的key 壓縮成小檔案)節約硬碟,加快恢復速度
AOF 配置引數
appendonly yes(預設關著的)
appedfilename
appendfsync everysec
dir
no-appndfsyc-on-rewrite yes(aof 每秒備份,和重寫之間可能會有衝突,並且耗效能,一般選擇yes 可能會丟失部分資料)
aof 重寫配置引數
aoto-aof-rewrite-min-size 檔案重寫需要尺寸
aoto-aof-rewrite-percentage 檔案增長率
RDB(redis 預設持久化方式)
RDB配置檔案
rdbcompression yes #是否啟用壓縮,優點減少磁碟儲存空間,消耗CPU資源
dbfilename dump.rdb # rdb檔名
dir ./ # rdb檔案儲存路徑
save 900 1 # 15分鐘內至少有一個鍵被更改
save 300 10 # 5分鐘內至少有10個鍵被更改
save 60 10000 # 1分鐘內至少有10000個鍵被更改
手動執行備份
- AOF 可以使用BGREWRITEAOF命令來重寫AOF檔案
- RDB 可以使用SAVE和BGSAVE 來進行備份
AOF 和 RDB 如何選擇
- 如果允許資料丟失一部分而且資料可以從資料庫補齊,建議只在Slave上持久化RDB檔案,而且只要15分鐘備份一次就夠了,只保留save 900 1這條規則
- AOF ~~~明天再研究、、AOF rewrite的最後將rewrite過程中產生的新資料寫到新檔案造成的阻塞幾乎是不可避免的。只要硬碟許可,應該儘量減少AOF rewrite的頻率,AOF重寫的基礎大小預設值64M太小了,可以設到5G以上。預設超過原大小100%大小時重寫可以改到適當的數值。
- 採用 主從結構,掛了也可以實現高可用……
進行資料備份子程序開銷
- CPU
- 不做CPU繫結
- 不和CPU密集型應用一起部署。單機多部署,防止進行同時aof和rdb重寫
記憶體 - fork 記憶體開銷,理論上,fork記憶體消耗等於父程序,但是linux 中有顯示覆制(copy-on-write)父子程序可以共享共同的實體記憶體頁,當父程序有寫請求時,會建立一個副本(這個時候才會消耗記憶體)子程序可以共享父程序實體記憶體快照。-----當重寫的時候,父程序有大量寫入時,子程序記憶體開銷比較大。
- linux 2.6.38核心中增加THP特性,支援大的記憶體頁分配。為了增加frok速度。
echo never > /sys/kernel/mm/transparent_hugepage/enable
- 硬碟消耗
- 不要和高負載服務部署在一起:儲存服務,訊息佇列
- no-appendfsync-on-rewirte =yes (aof重寫期間,不進行aof追加)
- 使用SSD
- 單機多部署使用分盤 cgroup限制硬碟資源的分配
線上禁止使用的命令
keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)
Tip
- 如果配置了主從沒有使用redis-sentinel,主庫掛掉重啟時,不能直接重啟主庫,否則會覆蓋掉從庫的aof檔案
不重啟修改配置資訊
redis-cli config set appendonly yes
有些配置必須重啟才可~ 比如bind