隨著項目訪問量的增加,對Redis服務器的操作也越加頻繁,雖然Redis讀寫速度都很快,但是一定程度上也會造成一定的延時,那么為了解決訪問量大的問題,通常會采取的一種方式是主從架構Master/Slave,Master 以寫為主,Slave 以讀為主。
目錄
一、主從復制原理
全同步過程如下:
增量同步過程如下:
二、主從復制配置
一主雙從
1、創建目錄(Linux)
2、復制配置文件
3、創建三個文件
4、啟動服務
5、驗證服務
6、連接服務
7、進行復制
8、配置主從
9、集群測試
主從切換
一、主從復制原理
Redis 一般是使用一個 Master 節點來進行寫操作,而若干個 Slave 節點進行讀操作,Master 和 Slave 分別代表了一個個不同的 Redis Server 實例。
另外定期的數據備份操作也是單獨選擇一個 Slave 去完成,這樣可以最大程度發揮 Redis 的性能,為的是保證數據的弱一致性和最終一致性。
另外,Master 和 Slave 的數據不是一定要即時同步的,但是在一段時間后 Master 和 Slave 的數據是趨于同步的,這就是最終一致性。
全同步過程如下:
-
Slave 發送 Sync 命令到 Master。
-
Master 啟動一個后臺進程,將 Redis 中的數據快照保存到文件中。
-
Master 將保存數據快照期間接收到的寫命令緩存起來。
-
Master 完成寫文件操作后,將該文件發送給 Slave。
-
使用新的 RDB 或 AOF 文件替換掉舊的 RDB 或 AOF 文件。
-
Master 將這期間收集的增量寫命令發送給 Slave 端。
增量同步過程如下:
-
Master 接收到用戶的操作指令,判斷是否需要傳播到 Slave。
-
將操作記錄追加到 AOF 文件。
-
將操作傳播到其他 Slave:對齊主從庫;往響應緩存寫入指令。
-
將緩存中的數據發送給 Slave。
二、主從復制配置
下面搭建一主雙從的 Redis 集群。
一主雙從
準備三臺虛擬機,配置好主機名、IP地址和Redis環境。本教程中為了演示方便,在一臺虛擬機中配置三個Redis實例。
1、創建目錄(Linux)
我們在根目錄下創建 rediscluster 目錄
mkdir /rediscluster
2、復制配置文件
把 redis.conf 復制到這個目錄中
cp /etc/redis.conf /rediscluster/redis.conf
3、創建三個文件
在rediscluster目錄下分別創建三個文件: redis-6379.conf、redis-6380.conf 和 redis-6381.conf。
vim redis-6379.conf
文件內容如下:(同樣的方式創建另外兩個文件并做相應的修改)
include /rediscluster/redis.conf
# 修改端口號
port 6379
# 修改pid文件名
pidfile "/var/run/redis_6379.pid"
# 修改持久化文件名
dbfilename "dump_6379.rdb"
dir "/rediscluster"
4、啟動服務
分別啟動三臺 Redis 服務器:
rediscluster]# redis-server redis-6379.conf
rediscluster]# redis-server redis-6380.conf
rediscluster]# redis-server redis-6381.conf
5、驗證服務
rediscluster]# ps -ef | grep redis
6、連接服務
分別使用 redis-cli 來連接這三臺服務(三個窗口):
rediscluster]# redis-cli -p 6379
rediscluster]# redis-cli -p 6380
rediscluster]# redis-cli -p 6381
?
7、進行復制
客戶端連接上后,執行如下命令:
127.0.0.1:6379> info replication
127.0.0.1:6380> info replication
127.0.0.1:6381> info replication
?從圖中可以發現,這三臺都是 master,也就是都是主服務器。
8、配置主從
假設我們希望 6379 是主服務器,而 6380 和 6381 是從服務器,則需要做如下配置。
命令格式:slaveof <ip> <port>
我們分別在 6380 和 6381 客戶端中執行如下命令:
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
注意:
-
在 redis-cli 客戶端中執行 slaveof 命令只會對當前環境生效,重啟后失效。要想永久生效,需要在 redis.conf 配置文件中添加
slaveof <masterip> <masterport>
配置。 -
在 Redis 5.0 后,新增了 replicaof 命令,作用與 slaveof 命令效果一致。
再次執行 info replication
命令查看,可以發現已經變為了從機了。
9、集群測試
我們在 6379 中添加如下數據:
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
然后在從機上查詢:
127.0.0.1:6380> get k1
1) "v1"
127.0.0.1:6381> get k1
1) "v1"
發現數據已經同步了。
注意:
如果我們在從服務器中添加數據,則會報錯。因為從服務器只能讀。
如果從機宕機了,重啟后會變為主服務器,需要重新執行
slaveof <ip> <port>
命令。如果主機宕機了,重啟后一切正常。
主從切換
當一個 master 宕機后,后面的 slave 可以立刻升為 master,其后面的 slave 不用做任何修改。
用 slaveof no one 將從機變為主機。
假設主機 6379 宕機了,我們可以在 6380 上執行如下命令來切換為主機:
127.0.0.1:6380> slaveof no one
查看 6380,已經變為主機了。