1. 程式人生 > >Redis學習筆記(5)—— Redis的持久化方案&Redis的叢集搭建

Redis學習筆記(5)—— Redis的持久化方案&Redis的叢集搭建

一、Redis的持久化方案

  Redis的高效能是由於其將所有資料都儲存在了記憶體中,為了使Redis在重啟之後仍能保證資料不丟失,需要將資料從記憶體中同步到硬碟中,這一過程就是持久化。

       Redis支援兩種方式的持久化,一種是RDB方式,一種是AOF方式。可以單獨使用其中一種或將二者結合使用。

  • RDB方式:快照形式,定期把記憶體中當前時刻的資料儲存到磁碟。Redis預設支援的持久化方案。

    在redis.conf配置檔案中配置:

    

    Redis啟動後會讀取RDB快照檔案,將資料從硬碟載入到記憶體。根據資料量大小與結構和伺服器效能不同,這個時間也不同。通常將記錄一千萬個字串型別鍵、大小為1GB的快照檔案載入到記憶體中需要花費20~30秒鐘。

    問題總結:

    通過RDB方式實現持久化,一旦Redis異常退出,就會丟失最後一次快照以後更改的所有資料。這就需要開發者根據具體的應用場合,通過組合設定自動快照條件的方式來將可能發生的資料損失控制在能夠接受的範圍。如果資料很重要以至於無法承受任何損失,則可以考慮使用AOF方式進行持久化。

  • AOF方式:把所有對redis資料庫操作的命令,增刪改操作的命令。儲存到檔案中。資料庫恢復時把所有的命令執行一遍即可。

        預設情況下Redis沒有開啟AOF(append only file)方式的持久化,可以通過appendonly引數開啟:

    

    開啟AOF持久化後每執行一條會更改Redis中的資料的命令,Redis就會將該命令寫入硬碟中的AOF檔案。AOF檔案的儲存位置和RDB檔案的位置相同,都是通過dir引數設定的,預設的檔名是appendonly.aof,可以通過appendfilename引數修改:appendfilename appendonly.aof

  對比:

  RDB:可以設定間隔多長時間儲存一次(redis不用任何配置預設的持久化方案)

    優點:讓redis的資料存取速度變快

    缺點:伺服器斷電時會丟失部分資料(資料的完整性得不到保障)
  AOF:可以設定實時儲存

    優點:持久化良好,能夠保障資料的完整性

    缺點:大大降低了redis系統的存取速度

二、Redis叢集的搭建

2.1 redis-cluster架構圖

  

  redis-cluster投票:容錯

   

  架構細節:

  (1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

  (2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

  (3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可

  (4)redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value

Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,
然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點

 

  

2.2 Redis叢集的搭建

  Redis叢集中至少應該有三個節點。要保證叢集的高可用,需要每個節點有一個備份機。Redis叢集至少需要6臺伺服器。

  搭建偽分散式。可以使用一臺虛擬機器執行6個redis例項。需要修改redis的埠號7001-7006

2.2.1 叢集搭建環境

  1. 使用ruby指令碼搭建叢集。需要ruby的執行環境。安裝ruby:
    yum install ruby
    yum install rubygems 
  2. 安裝ruby指令碼執行使用的包。下載redis-3.0.0.gem,並上傳到Linux系統中,然後執行命令:
    gem install redis-3.0.0.gem 

     

 2.2.2 搭建步驟

  需要6個redis例項。執行在不同的埠7001-7006

  第一步:建立6個redis例項(redis/bin就是一個例項)

    • 建立一個資料夾(redis-cluster),裡面裝著6個redis例項
    • 將redis/bin(redis.conf放在bin目錄下作為後端啟動的配置檔案)複製6份到redis-cluster資料夾中,並命名redis01-redis06
      cp redis/bin/ redis-cluster/redis01 -r

 

      

 

  第二步:修改6個redis節點的redis.conf,將埠號分別改為7001-7006,還需要把配置檔案中的cluster-enabled yes前的註釋去掉

    

    

  第三步:將redis原始檔src目錄下的redis-trib.rb檔案複製到redis-cluster資料夾中

    

  第四步:編寫叢集啟動和停止指令碼,放在redis-cluster目錄下

    • 啟動指令碼start-all.sh(使用vim start-all.sh命令建立檔案並直接進入編輯狀態)
      cd redis01
      ./redis-server redis.conf
      cd ..
      cd redis02
      ./redis-server redis.conf
      cd ..
      cd redis03
      ./redis-server redis.conf
      cd ..
      cd redis04
      ./redis-server redis.conf
      cd ..
      cd redis05
      ./redis-server redis.conf
      cd ..
      cd redis06
      ./redis-server redis.conf
      cd ..

      注意:新建的start-all.sh預設沒有執行許可權(x為可執行)

        

        賦予使用者可執行的許可權(chmod u+x start-all.sh)

        

    • 停止指令碼stop-all.sh

      ./redis01/redis-cli -p 7001 shutdown
      ./redis02/redis-cli -p 7002 shutdown
      ./redis03/redis-cli -p 7003 shutdown
      ./redis04/redis-cli -p 7004 shutdown
      ./redis05/redis-cli -p 7005 shutdown
      ./redis06/redis-cli -p 7006 shutdown

       

    第五步:執行start-all.sh指令碼,啟動每個redis例項

      

    第六步:使用ruby指令碼搭建叢集

./redis-trib.rb create --replicas 1 192.168.25.129:7001 192.168.25.129:7002 192.168.25.129:7003 192.168.25.129:7004 192.168.25.129:7005 192.168.25.129:7006