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:7002 (192.168.253.22:7005)
#第三臺
192.168.253.23:7003 (192.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