Redis學習四(運維指南).

1、上線規劃

通常 redis 的參數配置都在 redis.conf 中,在上線前根據實際環境配置好合適參數,能有效提升 redis 的可用性。redis

  • redis 的運行機器 CPU 不求核數多,但求主頻高,Cache大,由於 redis 主處理模式是單進程的。數據庫

  • 留意 redis 日誌文件的配置,對應 logfile 參數。redis.log 爲 redis 主日誌,sentinel.log 爲 sentinel 監控日誌。bash

  • 關閉 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。app

    • 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

2、常見運維操做

服務功能運維

  • 啓動 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-indexdom

  • 將 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

3、測試方法

  • 模擬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
相關文章
相關標籤/搜索