1. 程式人生 > >Redis的叢集與主從複製(附Redis持久化)

Redis的叢集與主從複製(附Redis持久化)

Redis持久化

1、Rdb方式

Redis預設的方式,redis通過快照來將資料持久化到磁碟中。

(1)設定持久化快照的條件:在redis.conf中修改持久化快照的條件,如下:
這裡寫圖片描述
圖表示的意思:900秒內操作1次或者300秒內操作10次或者60秒內操作10000次,將資料寫到磁碟

(2)持久化檔案儲存的目錄:在redis.conf中可以指定持久化檔案儲存的目錄
這裡寫圖片描述

(3)Rdb問題
一旦redis非法關閉,那麼會丟失最後一次持久化之後的資料。如果資料不重要,則不必要關心。如果資料不能允許丟失,那麼要使用aof方式。實際專案開發中兩種方式同時使用。

2、Aof方式

Redis預設是不使用該方式持久化的。Aof方式的持久化,是操作一次redis資料庫,則將操作的記錄儲存到aof持久化檔案中。

(1)開啟aof方式的持久化方案
將redis.conf中的appendonly改為yes,即開啟aof方式的持久化方案
這裡寫圖片描述

(2)Aof檔案儲存的名稱
Aof檔案儲存的目錄和rdb方式的一樣。
這裡寫圖片描述

(3)結論

在使用aof和rdb方式時,如果redis重啟,則資料從aof檔案載入。

Redis的主從複製

1、什麼是主從複製

持久化保證了即使redis服務重啟也不會丟失資料,因為redis服務重啟後會將硬碟上持久化的資料恢復到記憶體中,但是當redis伺服器的硬碟損壞了可能會導致資料丟失,如果通過redis的主從複製機制就可以避免這種單點故障,如下圖:
這裡寫圖片描述

說明:

(1)主redis中的資料有兩個副本(replication)即從redis1和從redis2,即使一臺redis伺服器宕機其它兩臺redis服務也可以繼續提供服務。

(2)主redis中的資料和從redis上的資料保持實時同步,當主redis寫入資料時通過主從複製機制會複製到兩個從redis服務上。

(3)只有一個主redis,可以有多個從redis。

(4)主從複製不會阻塞master,在同步資料時,master 可以繼續處理client 請求。

(5)一個redis可以即是主又是從,如下圖:
這裡寫圖片描述

2、主從複製設定

主機無需配置

從機配置

這裡在一臺機器上有兩個bin檔案,模擬兩臺機器

(1)複製出一個從機

[hadoop@mini01 redis]$ cp bin/ bin2 –r

(2)修改從機的redis.conf

語法:Slaveof masterip masterport

這裡寫圖片描述

(3)修改從機的port地址為6380(在redis.conf中修改)

這裡寫圖片描述

(4)清除從機中的持久化檔案(如果有的話)

[hadoop@mini01 bin2]$ rm -rf appendonly.aof dump.rdb

(5)啟動從機

[hadoop@mini01 bin2]$ ./redis-server redis.conf

[hadoop@mini01 bin2]$ ./redis-cli -p 6380  

注意
主機一旦發生增刪改操作,那麼從機會將資料同步到從機中。從機不能執行寫操作。(如果從機想要進行寫操作需要進行設定)

127.0.0.1:6380> set s2 222
(error) READONLY You can't write against a read only slave.

Redis叢集(重點)

1、叢集架構圖

這裡寫圖片描述

架構細節:

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

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

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

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

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

這裡寫圖片描述

2、叢集投票:容錯

這裡寫圖片描述

(1)叢集中所有master參與投票,如果半數以上master節點與其中一個master節點通訊超過(cluster-node-timeout),認為該master節點掛掉

(2)什麼時候整個叢集不可用(cluster_state:fail)?

  • 如果叢集任意master掛掉,且當前master沒有slave,則叢集進入fail狀態。也可以理解成叢集的[0-16383]slot對映不完全時進入fail狀態
  • 如果叢集超過半數以上master掛掉,無論是否有slave,叢集進入fail狀態

3、安裝ruby

叢集管理工具(redis-trib.rb)是使用ruby指令碼語言編寫的。

其他機器同操作

(1)安裝ruby

[hadoop@mini01 apps]$ sudo yum install ruby

[hadoop@mini01 apps]$ sudo yum install rubygems

(2)將以下檔案上傳到linux系統
這裡寫圖片描述
(3)安裝ruby和redis介面

[hadoop@mini01 apps]$ sudo gem install redis-3.0.0.gem

報錯解決:

#沒有許可權,用sudo或者root操作
ERROR: While executing gem … (Gem::FilePermissionError) You don’t have write 
permissions for the /Library/Ruby/Gems/2.0.0 directory. 

(4)將redis-3.0.0包下src目錄中的redis-trib.rb檔案拷貝到apps/下
這裡寫圖片描述

4、搭建叢集

叢集說明

#三臺機器,每臺機器模擬兩臺,一個主機一個從機,相當於一共6臺
#第一臺主機與從機的ip與埠(前面是主機,後面是從機)
192.168.253.21:7001 (192.168.132.21:7004)
#第二臺
192.168.253.22:7002192.168.253.22:7005#第三臺
192.168.253.23:7003192.168.253.23:7006

(1)複製機器,如果有持久化檔案則刪除

(2)設定叢集引數
這裡寫圖片描述

(3)修改埠
這裡寫圖片描述

(4)啟動機器

#每一臺機器都要啟動,最好寫一個指令碼,這裡只演示啟動一臺
./redis-server redis.conf -p 7001

(5)建立叢集

#在其中任何一臺機器中,執行以下命令
#replicas 1:表示每個主機配置一個從機,最後三個ip地址是從機ip地址,與前面三個主機的ip地址相對應
[[email protected] apps]$ ./redis-trib.rb create --replicas 1 192.168.253.21:7001 192.168.253.22:7002 192.168.253.23:7003 192.168.253.21:7004 192.168.253.22:7005  192.168.253.23:7006

#yes
Can I set the above configuration? (type 'yes' to accept): yes

5、連線叢集

(1)連線叢集命令(在其中任意機器)

#-c:指定是叢集連線
[hadoop@mini01 redis]$ ./redis-cli -h 192.168.253.21 -p 7001 –c

6、檢視叢集資訊

(1)檢視叢集資訊

192.168.253.21:7001>cluster info

(2)檢視叢集節點

192.168.253.21:7001>cluster nodes

7、jedis連線叢集

(1)設定防火牆,開放7001-7006的埠

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7002 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7003 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7004 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7005 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7006 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7007 -j ACCEPT