一、上線規劃
一般 redis 的引數配置都在 redis.conf 中,在上線前根據實際環境配置好合適引數,能有效提高 redis 的可用性,
-
redis 的運行機器 CPU 不求核數多,但求主頻高,Cache大,因為 redis 主處理模式是單行程的,
-
留意 redis 日志檔案的配置,對應 logfile 引數,redis.log 為 redis 主日志,sentinel.log 為 sentinel 監控日志,
-
關閉 THP,這個默認的 Linux 記憶體頁面大小分配策略會導致 RDB 時出現巨大的 latency 和巨大的記憶體占用,關閉方法為:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
-
一定要設定最大記憶體 maxmemory 引數,否則物理記憶體用爆了就會大量使用 Swap,寫 RDB 檔案時的速度很慢,設定的引數參考:機器記憶體 * 45% / 1.2,(1.2 為記憶體碎片)
-
maxmemory-policy 策略,則當 redis 記憶體資料達到 maxmemory 時,會根據 maxmemory-policy 配置來淘汰記憶體資料,以避免OOM,
- noeviction:不執行任何淘汰策略,當達到記憶體限制的時候客戶端執行命令會報錯,把redis當做DB時,推薦使用,
- allkeys-lru:從所有資料范圍內查找到最近最少使用的資料進行淘汰,直到有足夠的記憶體來存放新資料,
- volatile-lru:默認,從所有的最近最少訪問資料范圍內查找設定到過期時間的資料進行淘汰,如果查找不到資料,則回退到 noeviction,
- allkeys-random:從所有資料范圍內隨機選擇key進行洗掉,
- volatile-random:從設定了過期時間的資料范圍內隨機選擇key進行洗掉,
- volatile-ttl:從設定了過期時間的資料范圍內優先選擇設定了TTL的key進行洗掉,
-
持久化配置,在配置上有三種選擇:不持久化,RDB,RDB + AOF(默認),另外,如果為主從復制關系,建議主服務器關閉持久化,
# RDB 持久化配置
save 900 1 #在900秒(15分鐘)之后,如果至少有 1 個key發生變化,則 dump 記憶體快照,
save 300 10 #在300秒(5分鐘)之后,如果至少有 10 個key發生變化,則 dump 記憶體快照,
save 60 10000 #在60秒(1分鐘)之后,如果至少有 10000 個key發生變化,則 dump 記憶體快照,
# AOF 持久化配置
appendfsync always #每次有資料修改發生時都會寫入AOF檔案,
appendfsync everysec #每秒鐘同步一次,該策略為AOF的預設策略,
appendfsync no #從不同步,高效但是資料不會被持久化,
- redis 使用的是單行程(除持久化時),所以在配置時,一個實體只會用到一個CPU,那么如何指定 redis 使用的 CPU 呢?
#顯示行程運行的CPU (15361 為 redis-server 的行程號),顯示結果的 f 實際上是二進制4個低位均為 1 的 bitmask,每一個 1 對應于 1 個CPU,表示該行程在 4 個CPU上運行
[root@localhost redis] taskset -p 15361
pid 15361's current affinity mask: f
#指定行程運行在某個特定的CPU上,該命令的 3 表示 CPU 將只會運行在第 4 個CPU上(從0開始計數)
[root@localhost redis] taskset -pc 3 15361
pid 15361's current affinity list: 0-3
pid 15361's new affinity list: 3
二、常見運維操作
服務功能運維
- 啟動 redis:redis-server redis.conf
- 啟動 redis-sentinel:redis-sentinel sentinel.conf
- 停止 redis,注意 kill -9 關閉可能會丟失資料:redis-cli shutdown
- 驗證密碼(或在連接的時候指定密碼):auth password(/usr/bin/redis-cli -a 123456)
- 查看配置:config get *
- 修改配置:
# 臨時配置
127.0.0.1:6379> config set requirepass 123456
OK
# 永久配置,將目前服務器的引數配置寫入 redis.conf
127.0.0.1:6379> config rewrite
OK
# 永久配置也可通過直接修改 redis.conf 的方式
-
選擇資料庫(默認連接的資料庫是0,默認資料庫數量是16個):select db-index
-
將 key 從當前資料庫移動到指定資料庫:move key db-index
-
清空當前資料庫,生產上禁止使用:flushdb
-
清空所有資料庫,生產上禁止使用:flushall
-
RDB 持久化命令:
- BGSAVE:后臺子行程進行RDB持久化
- SAVE:主行程進行RDB,生產環境千萬別用,服務器將無法回應任何操作
- LASTSAVE: 回傳上一次成功SAVE的Unix時間
-
AOF 持久化命令:BGREWRITEAOF
-
設定 crontab 定時備份持久化資料:cp /var/lib/redis/dump.rdb /somewhere/safe/dump.$(date +%Y%m%d%H%M).rdb
-
執行 lua 腳本:redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3
-
發送原始的 redis protocl 格式資料到服務器端執行: echo -en '*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n' | redis-cli -a 123456 --pipe
服務性能運維
- 查看連接的客戶端:client list
- 探測服務是否可用(回傳 pong 說明正常):ping
- 探測服務延遲,千兆網卡一般延遲在 0.16ms 左右:
[root@localhost redis]# redis-cli --latency
min: 0, max: 5, avg: 0.24 (1874 samples)
-
查看統計資訊:info
- total_connections_received:redis 連接數
- latest_fork_usec:上次匯出 rdb 快照,持久化花費時長(微秒), 用來檢查是否有人使用了 SAVE 命令
- used_memory: 由 redis 分配器分配的記憶體總量,以位元組(byte) 為單位
- used_memory_rss:回傳 redis 已分配的記憶體總量(俗稱常駐集大小),包含了 used_memory 和記憶體碎片
- mem_fragmentation_ratio:used_memory_rss / used_memory 的值,1.N為佳,如果此值過大,說明 redis 的記憶體的碎片化嚴重,可以匯出再匯入一次(重啟)
-
統計命令執行所耗費的毫秒數(每個命令的總時間和平均時間):INFO commandstats

-
統計 redis 資料存盤中比較大的key(用 scan 的方式對 redis 中的 key 進行采樣,尋找較大的 keys):redis-cli --bigkeys

-
獲取慢查詢:
# 得到慢查詢串列,默認保留 128 條(slowlog-max-len 引數)
127.0.0.1:6379> slowlog get 10
1) 1) (integer) 1 # 查詢ID
2) (integer) 1572146706 # 發生時間
3) (integer) 12239 # 運行時長,該時間不包含網路延遲(微秒)
4) 1) "save" # 原命令
2) 1) (integer) 0
2) (integer) 1569327858
3) (integer) 391725
4) 1) "GET"
2) "YUNGU_REDIS_ADMIN_ACCESS_TOKEN_5E6A833C21A87983459A985753AE5425"
# 清空慢查詢
127.0.0.1:6379> slowlog reset
OK
三、測驗方法
- 模擬oom,redis 直接退出:redis-cli debug oom
- 模擬宕機:redis-cli debug segfault
- 模擬 redis 執行緒掛起:redis-cli -p 6379 debug sleep 30
- 快速產生測驗資料:debug populate
127.0.0.1:6379> dbsize
(integer) 1410
127.0.0.1:6379> debug populate 100
OK
127.0.0.1:6379> dbsize
(integer) 1510
- 模擬 RDB 加載情形(save 當前的 rdb 檔案,并清空當前資料庫,重新加載 rdb):debug reload
- 模擬 AOF 加載情形(清空當前資料庫,重新從aof檔案里加載資料庫):debug loadaof
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/234145.html
標籤:其他
下一篇:5分鐘徹底理解Redis持久化
