1.主從集群
集群結構:
一.單機安裝redis
1.上傳壓縮包并解壓,編譯
tar -xzf redis-6.2.4.tar.gz
cd redis-6.2.4
make && make install
2.修改redis.config的配置并啟動redis
# 綁定地址,默認是127.0.0.1,會導致只能在本地訪問。修改為0.0.0.0則可以在任意IP訪問
bind 0.0.0.0
# 保護模式,關閉保護模式
protected-mode no
# 數據庫數量,設置為1
databases 1
redis-server redis.conf
二.準備實例和配置
要在同一臺虛擬機開啟3個實例,必須準備三份不同的配置文件和目錄,配置文件所在目錄也就是工作目錄。
1.創建目錄
我們創建三個文件夾,名字分別叫7001、7002、7003:
# 進入/tmp目錄
cd /tmp
# 創建目錄
mkdir 7001 7002 7003
2.恢復原始配置
# 開啟RDB
# save ""
save 3600 1
save 300 100
save 60 10000# 關閉AOF
appendonly no
3.拷貝配置文件到每個實例目錄
# 方式一:逐個拷貝
cp redis-6.2.4/redis.conf 7001
cp redis-6.2.4/redis.conf 7002
cp redis-6.2.4/redis.conf 7003# 方式二:管道組合命令,一鍵拷貝
echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.4/redis.conf
4.修改每個實例的端口、工作目錄
修改每個文件夾內的配置文件,將端口分別修改為7001、7002、7003,將rdb文件保存位置都修改為自己所在目錄(在/tmp目錄執行下列命令):
sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/tmp\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/tmp\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/tmp\/7003\//g' 7003/redis.conf
5.修改每個實例的聲明IP????????
虛擬機本身有多個IP,為了避免將來混亂,我們需要在redis.conf文件中指定每一個實例的綁定ip信息
# 逐一執行
sed -i '1a replica-announce-ip ip' 7001/redis.conf
sed -i '1a replica-announce-ip ip' 7002/redis.conf
sed -i '1a replica-announce-ip ip' 7003/redis.conf
三.開啟主從關系
一.啟動三個redis實例
# 第1個
redis-server 7001/redis.conf
# 第2個
redis-server 7002/redis.conf
# 第3個
redis-server 7003/redis.conf
一鍵停止:
printf '%s\n' 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown
現在三個實例還沒有任何關系,要配置主從可以使用replicaof 或者slaveof(5.0以前)命令。
有臨時和永久兩種模式:
-
修改配置文件(永久生效)
-
在redis.conf中添加一行配置:
slaveof <masterip> <masterport>
-
-
使用redis-cli客戶端連接到redis服務,執行slaveof命令(重啟后失效):
slaveof <masterip> <masterport>
在5.0以后新增命令replicaof,與salveof效果一致。
二.slaveof命令連接
連接7002與7003端口,并與7001做連接
# 連接 7002
redis-cli -p 7002
# 執行slaveof
slaveof ip 7001
連接7001接口查看狀態
# 連接 7001
redis-cli -p 7001
# 查看狀態
info replication
三.測試:
可以發現,只有在7001這個master節點上可以執行寫操作,7002和7003這兩個slave節點只能執行讀操作。
四:數據同步原理(全量同步,增量同步)
master通過Replication Id與offset來判斷是否為第一次同步數據
Replication Id:簡稱replid,是數據集的標記,id一致表示是同一數據集,每一個master都有唯一的replid,slave會繼承master節點的replid。
offset:偏移量,記錄在repl_baklog中的數據增多而逐漸增大。slave完成同步時也會記錄當前同步的offset,如果slave的offset小于master的offset,說明slave數據落后master,需要更新。
因此slave做數據同步,必須向master聲明自己的replication id和offset,master才可以判斷到底需要同步那些數據。
增量同步:將repl_baklog與offset之間記錄的命令發送給slave去同步數據。