1. 程式人生 > >redis 運維優化相關

redis 運維優化相關

優化慢日誌

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優點
  1. RDB 在重啟儲存了大資料集的例項時比 AOF 要快(因為RDB是一個快照,AOF是很多指令合計)
  2. RDB 持久化時只需要父程序fock(但是fock的時候也會阻塞主程序)一個子程序,不影響父程序效能
  3. 可以複製RDB檔案進行redis資料替換
RDB缺點
  1. RDB設定每隔多長時間多少個鍵值發生改變才進行快照替換(資料可能會丟失一部分)
  2. RDB是全量複製,如果資料集比較大時,fork的過程非常耗時也很吃機器效能。
AOF優點
  1. AOF最多隻會丟失一秒資料,資料完整性高
  2. AOF是一個追加檔案,在斷電時也沒有損壞問題,即使檔案末尾寫到一半,使用redis-check-aof 也可以很快修復
  3. AOF裡面是一個一個的操作指令,很容易理解和解析,如果執行了誤操作,可以開啟aof日誌檔案刪除對應的那行,然後重啟恢復資料
AOF缺點
  1. 相同資料集的資料aof檔案要遠大於rdb檔案,恢復速度慢於rdb(即使有AOF重寫機制)
  2. 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
  1. 不做CPU繫結
  2. 不和CPU密集型應用一起部署。單機多部署,防止進行同時aof和rdb重寫
    記憶體
  3. fork 記憶體開銷,理論上,fork記憶體消耗等於父程序,但是linux 中有顯示覆制(copy-on-write)父子程序可以共享共同的實體記憶體頁,當父程序有寫請求時,會建立一個副本(這個時候才會消耗記憶體)子程序可以共享父程序實體記憶體快照。-----當重寫的時候,父程序有大量寫入時,子程序記憶體開銷比較大。
  4. linux 2.6.38核心中增加THP特性,支援大的記憶體頁分配。為了增加frok速度。
    echo never > /sys/kernel/mm/transparent_hugepage/enable
  • 硬碟消耗
  1. 不要和高負載服務部署在一起:儲存服務,訊息佇列
  2. no-appendfsync-on-rewirte =yes (aof重寫期間,不進行aof追加)
  3. 使用SSD
  4. 單機多部署使用分盤 cgroup限制硬碟資源的分配

線上禁止使用的命令

 keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)

Tip

  • 如果配置了主從沒有使用redis-sentinel,主庫掛掉重啟時,不能直接重啟主庫,否則會覆蓋掉從庫的aof檔案

不重啟修改配置資訊

redis-cli config set appendonly yes
有些配置必須重啟才可~  比如bind