搭建和測試 Redis 主備和集群


 

本文章只是自我學習用,不適宜轉載。

 

1. Redis主備集群

1.1 搭建步驟

機器:海航雲虛機(2核4GB內存),使用 Centos 7.2 64bit 操作系統,IP 分別是 192.168.100.5(主) 和 192.168.100.6(備)。

Redis 版本:3.2.3

1.1.1 在主備節點上,做如下安裝

sudo yum update
sudo yum install epel-release
sudo yum update
sudo yum install redis
sudo systemctl start redis
sudo systemctl enable redis #配置redis在啟動機器時自動啟動

驗證是否安裝正確:

1.1.2 配置主備節點

主節點上,修改 /etc/redis.conf,設置 bind 127.0.0.1 192.168.100.5,然后運行 sudo systemctl restart redis 來重啟redis。

主節點上,修改 /etc/redis.conf,設置 slaveof 192.168.100.5 6379,然后運行 sudo systemctl restart redis 來重啟redis。

確認是否設置成功:

  • 在 master 上設置一個key/value:

  • 在 salve 上試着查看:

  • 不成功。檢查 slave 上的 master 日志:

  • 檢查網絡連接,都沒有問題。檢查 master 節點,看看 redis 是否在網卡 192.168.100.5 的 6379 上監聽,發現沒有。再檢查 redis.conf,發現有兩行 bind,好吧。修改后,在 slave 上能取到 'a' 的value。
  • 查看兩者之間的復制狀態。在 master 上:

  • 在 slave 上,能看到自身的 role 和 master 的信息,以及 replication 的信息等

1.1.3 測試benchmark

在 master 上,運行:

不清楚這些絕對值意味着什么,但是和 https://redis.io/topics/benchmarks 上的下面結果差不多:

1.1.4 將備升主

在備升主之前,在備上無法寫:

將備升主:

此時它就可寫了:

1.1.5 設置過期時間

https://redis.io/commands/expire

1.1.6 持久化

https://redis.io/topics/persistence

(1)關於持久化的幾個問題:

  • RDB 模式:Redis 在指定的時間間隔上對數據集做快照。RDB 對日常備份和災備都非常方便,而且對性能沒有太大的影響。通常定時,比如每5分鍾來做快照,但是使用它還是會丟數據。
  • AOF:Redis 服務器端將它收到的所有寫操作以追加寫方式寫入到日志文件中,以便在服務器重啟時重新執行。AOF有較強的靈活性,比如每秒刷新,每次寫就刷新等;但是,AOF 文件通常比 RDB 文件大。根據不同的寫入模式,AOF 通常會比 RDB 慢。
  • 默認開啟 RDB,關閉 AOF。用戶可以將兩者都關閉,或者將兩者都開啟。官方不建議單獨使用 AOF。如果對數據丟失有一定的容忍度,比如五分鍾,則可以使用 RDB;否則,建議兩者同時使用。

(2)測試 RDB:

文件的默認路徑是 /var/lib/redis/dump.rbd.

默認配置:

save 900 1 #15分鍾內如有一個1個key變化
save 300 10 #5分鍾內,如果有10個key變化
save 60 10000 #1分鍾內如果有10000個key變化

寫入10個key后,備份寫入:

在日志中能看到完整檢測和寫入過程:

 

(3)測試 AOF

AOF 默認被關閉,通過修改配置文件中的 appendonly yes 來將其打開。相關配置包括:

  • appendfsync everysec  #每隔一秒sync
  • appendfilename "appendonly.aof"  #AOF文件名

寫入兩個key/value,然后看到 aof 文件被修改了,其內容是文本格式:

2. Redis Cluster 

Redis 從 3.0.5 版本開始推出了 Redis cluster 版本。

2.1 安裝

主要參考文檔:https://redis.io/topics/cluster-tutorial

(1)創建配置文件 redis.conf

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

(2)創建留個目錄,每個目錄運行一個 redis 進程,代表一個 redis 節點。共6個節點,3主3備。

mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005

(3)將 redis.conf 拷貝到 7000 ~ 7005 目錄中,修改其中的 port 值為各目錄name,並且將 redis-server 文件拷貝到每個目錄中。

(4)進入每個目錄,啟動進程

../redis-server ./redis.conf &

結果如下:

[cloud-user@redis-slave ~]$ ps -ef | grep redis
cloud-u+ 23828     1  0 17:05 ?        00:00:04 ./redis-server *:7000 [cluster]
cloud-u+ 23831     1  0 17:05 ?        00:00:04 ./redis-server *:7001 [cluster]
cloud-u+ 23834     1  0 17:05 ?        00:00:04 ./redis-server *:7002 [cluster]
cloud-u+ 23837     1  0 17:06 ?        00:00:04 ./redis-server *:7003 [cluster]
cloud-u+ 23840     1  0 17:06 ?        00:00:04 ./redis-server *:7004 [cluster]
cloud-u+ 23843     1  0 17:06 ?        00:00:05 ./redis-server *:7005 [cluster]

(5)下載 redis 源碼,比如 http://download.redis.io/releases/redis-3.2.3.tar.gz,解壓,從 src 目錄找到 redis-trib.rb 文件,拷貝到工作目錄。注意redis-trib.rb版本必須和你使用的redis的版本相同,否則會出現兼容性問題。其github 源代碼 在這里

(6)安裝 ruby 和 rubygems

sudo yum install ruby
sudo yum install rubygems
sudo gem install redi

(7)運行下面的命令,創建 cluster:

sudo ruby redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

(8)檢查cluster 狀態,OK

可以看到,6個節點,分為3個master,3個slave。每個master分了5461個slots,共計 16384 slots。

(9)基本操作

2.2 集群操作

2.2.1 將 7000 (master) 殺掉

此時,7003 由 slave 變為 master,它沒有 slave。原來在 7000 上的數據改到了 7003 上:

啟動 7000,它變為了 7003 的 slave:

2.2.2 增加主節點

(1)按照同樣方法,啟動 7006 redis 進程

(2)運行 sudo ruby redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000 命令,將它加入集群

(3)此時,它作為孤立的 master node,上面卻沒有分配 slots

(4)執行 reshard 操作

sudo ruby redis-trib-3.2.3.rb reshard 127.0.0.1:7000

結果:

會看到從其他的 master 上有移動一些 slots 到 7006 上。

2.2.3 增加從節點

(1)增加 7007

(2)運行 

sudo ruby redis-trib.rb add-node --slave --master-id 98c93f338eaada7ced83e0e02360721c6f2187e2 127.0.0.1:7007 127.0.0.1:7000

結果:

能看到 7006 和 7007 之間的主備關系:

 

2.2.4 移除主節點

運行:

udo ruby redis-trib.rb del-node 127.0.0.1:7000 98c93f338eaada7ced83e0e02360721c6f2187e2

結果:

看來要先做resharding:

結果:

  • 7007 成了 7001 的 slave
  • 7006 被直接刪除了

2.2.5 移除從節點

直接刪除,不需要提前做 resharding:

 

參考鏈接:

https://redis.io/presentation/Redis_Cluster.pdf

https://www.zybuluo.com/phper/note/195558

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM