1. 程式人生 > >Redis學習筆記-進階

Redis學習筆記-進階

  1. Redis持久化方案
redis有rdb和aof兩種持久化方案
  • 1)rdb方式
    • 當符合一定條件時會自動將記憶體中的所有資料執行快照操作並存儲到硬碟上
    • 預設儲存在redis根目錄的dump.rdb檔案中,檔名在配置檔案中可修改
    • 檔案儲存方式是覆蓋,在進行快照的過程中不會修改RDB檔案,只有快照結束後才會將舊的檔案替換成新的,也就是說任何時候RDB檔案都是完整的。 這就使得我們可以通過定時備份RDB檔案來實現redis資料庫的備份。 RDB檔案是經過壓縮的二進位制檔案,佔用的空間會小於記憶體中的資料,更加利於傳輸。
    • redis.conf中的預設配置
      • save 900 1 ##15分鐘有1條key變化save一次
      • save 300 10 ##5分鐘有10條key變化save一次
      • save 60 10000 ##1分鐘有10000條key變化save一次
    • 手動執行save
      • save:由主程序進行快照操作,會阻塞其它請求
      • bgsave:由redis執行fork函式複製出一個子程序來進行快照操作,不阻塞
    • 優點:
      • 由於儲存的有資料快照檔案,恢復資料很方便
    • 缺點:
      • 儲存點設定過大,就會導致宕機丟失的資料過多
      • 儲存點設定過小,又會造成IO瓶頸
  • 2)aof方式
    • aof方式的持久化是通過日誌檔案的方式。
    • 預設情況下redis沒有開啟aof,可以通過引數appendonly引數開啟
    • 預設的檔名是appendonly.aof,可以通過appendfilename引數修改
    • aof持久配置:
      • appendfsync always 每次都會執行
      • appendfsync everysec 預設 每秒執行一次同步操作(推薦)
      • appendfsync no不主動進行同步,由作業系統來做,30秒一次
    • 優點:Redis會將每一個收到的寫命令都通過Write函式追加到檔案中,便於追蹤
    • 缺點:儲存的檔案比rdb要大很多
  • 3)當redis啟動時,如果rdb持久化和aof持久化都打開了,那麼會優先使用aof方式
  • 4)專案中到底該用哪個?下面是來自官方的建議:
    • 通常,如果你要想提供很高的資料保障性,那麼建議你同時使用兩種持久化方式。
    • 如果你可以接受災難帶來的幾分鐘的資料丟失,那麼你可以僅使用RDB。
    • 很多使用者僅使用了AOF,但是我們建議,既然RDB可以時不時的給資料做個完整的快照,並且提供更快的重啟,所以最好還是也使用RDB。
  1. Redis主從複製
Redis的主機Master上的key發生變化後,會同步到從機Slave上,稱為主從複製,只會從master同步到slave,不會從slave同步到master
  • 1)原理:
    • 在Slave啟動並連線到Master之後,它將主動傳送一條SYNC命令。此後Master將啟動後臺存檔程序,同時收集所有接收到的用於修改資料集的 命令,在後臺程序執行完畢後,Master將傳送整個資料庫檔案到Slave,以完成一次完全同步。而Slave伺服器在接收到資料庫檔案資料之後將其存 盤並載入到記憶體中。此後,Master繼續將所有已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些資料修改命令,從而達到最終的資料同步。
    • 如果Master和Slave之間的連結出現斷連現象,Slave可以自動重連Master,但是在連線成功之後,一次完全同步將被自動執行(該功能需要在配置檔案中配置實現:配置選項# slaveof <masterip> <masterport>,例如:slaveof 127.0.0.1 6379)。
  • 2)實現:
    • 配置slave redis的配置檔案,配置slaveof 選項連線主機即可
    • 可以使用一個Redis環境,複製多個配置檔案,配置不同的埠,實現多個Redis啟動環境
  • 3)例子:
    • 1)配置slave的連線主機
    • 2)啟動master伺服器:redis-server.exe redis.conf
    • 3)啟動slave伺服器:redis-server.exe redis.conf
    • 4)啟動master客戶端:redis-cli.exe -h IP-p PORT
    • 5)啟動slave客戶端:redis-cli.exe -h IP-p PORT
    • 6)在master客戶端中執行新增key操作:set key test
    • 7)在slave客戶端中檢視key:keys *(master新增的key會在slave中看到)
    • 8)在slave客戶端中執行新增key操作:set key test2
    • 9)在master客戶端中檢視key:keys *(slave新增的key會在master中沒有)
  1. Redis讀寫分離
Redis的讀寫分離指一臺Redis主機用來記錄更新操作,其餘多臺主機執行查詢操作,且資料可以從主機同步到從機,實現原理就是主從複製
  1. Redis主從切換
  • 避免一個redis服務宕機,導致應用宕機的情況,我們啟用sentinel(哨兵)服務,實現主從切換的功能
  • 主從切換時在主從複製的基礎上實現sentinel(sentinel是一個單獨的應用,在redis2.6版本後隨redis釋出,並且redis2.8版本中釋出的是sentinel 2,之前的版本存在bug,不建議使用)
  • 實現:
    • 1)配置sentinel.conf檔案,例:
      • port 26379 ##sentinel程序埠號
      • sentinel monitor mymaster 127.0.0.1 6000 2 ##master主機資訊,其中2代表有2臺slave提示主機宕機後,在做主從切換,原因在於網路的不確定性。
      • sentinel auth-pass mymaster 123456 ##master的使用者名稱密碼
    • 2)啟動sentinel服務
      • redis-server sentinel.conf
    • 3)檢視伺服器日誌(6000為master,6001和6002未slave):
    • 4)殺死master程序,發現主從切換現象
    • 5)切換時,會將原6001的slave變成6000的master,原6000的master變成6001埠服務的slave,同時修改對應的sentinel.conf和redis.conf檔案的配置修改
  • sentinel服務本身也不是萬能的,也會宕機,所以我們還得部署sentinel叢集,方式:
    • 多複製幾個sentinel.conf檔案
    • 啟動多個sentinel服務