Redis學習四(運維指南).

来源:https://www.cnblogs.com/jmcui/archive/2019/10/27/11730196.html
-Advertisement-
Play Games

一、上線規劃 一般 redis 的參數配置都在 redis.conf 中,在上線前根據實際環境配置好合適參數,能有效提高 redis 的可用性。 redis 的運行機器 CPU 不求核數多,但求主頻高,Cache大,因為 redis 主處理模式是單進程的。 留意 redis 日誌文件的配置,對應 l ...


一、上線規劃

一般 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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 磁碟存儲 liunx 存儲方式 一切皆文件 設備類型: 1. 塊設備: block liunx 表現為b開頭文件,可以隨機讀寫,存在緩存,存取單位是“塊”如:磁碟 2. 字元設備: char 不存在緩存,存取單位是“字元”,如:鍵盤 設備文件: 關聯至一個設備驅動程式,進而能夠跟與之對應硬體設備進行 ...
  • [TOC] 1. 埠號 在同一臺主機或設備上,可能有多個進程同時在使用TCP或UDP協議,埠號的作用就是區分這些不同的進程,即每個進程使用各自不同的埠號。 對於TCP協議和UDP協議,埠號都是用unsigned short類型表示,即埠號的範圍為0 65535,這65536個埠號被分為3 ...
  • 一.centos的安裝 centos分為桌面版本和命令版本;在這裡我使用的是命令版本,因為這個版本比較小,推薦使用電腦配置不高的使用centos命令版本。 這裡選擇安裝程式光碟映像文件,文件就是centos7的iso文件。 虛擬機的名稱和位置自行設置; 虛擬機的記憶體根據自己電腦的配置設置,我這裡設置 ...
  • Linux操作系統 linux系統的主要構成: 1、硬體交互層:系統的底層,為內核層提供基礎,由管理外圍設備的軟體構成(外設包括終端控制器和存儲設備控制器) 2、內核層:系統核心,包括進程管理和文件子系統 3、系統介面層:實現操作系統命令,視窗系統和系統函數的調用功能,為應用層提供命令介面,圖形介面 ...
  • Linux常用命令 Linux常用的目錄操作命令 pwd 命令查看用戶的當前目錄 cd 改變當前路徑 cd 絕對路徑或者相對路徑 cd ~ 切換到當前用戶的宿主目錄 cd - 切換到上一次所在的目錄 cd .. 上一級目錄 ls 命令顯示文件或目錄信息 mkdir 創建目錄 -p 創建嵌套的多級目錄 ...
  • 一、單端、全差分、偽差分 此部分轉載https://www.cnblogs.com/alifpga/p/7976531.html 單端信號: 單端信號(single-end)是相對於差分信號而言的,單端輸入指信號有一個參考端和一個信號端構成,參考端一般為地端。 差分信號: 差分(Differenti ...
  • COUNT全表記錄 在MySQL中,相同的SQL不同的存儲引擎執行計劃不同: 現有測試表TB101: 對於沒有WHERE條件的COUNT(*)/COUNT(1)/COUNT(ID)/COUNT(C1)的執行計劃為: 對於沒有WHERE條件的COUNT(C2)的執行計劃為: 可以發現,對於MyISAM ...
  • Redis持久化 RDB快照 在預設情況下,Redis將記憶體資料庫快照保存到dump.rdb的二進位文件中。 可以對Redis進行設置,讓它在“N秒內數據集至少有N個改動”, 這一條件被滿足時,自動保存一次數據集。比如說:讓Redis滿足“60秒內至少有1000個鍵被改動”這一個條件時,自動保存一次 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...