一、下載
由於redis官方並不支持windows操作系統,所以官網上是下不到的,需要到gitlab上下載,下載地址如下:
https://github.com/MicrosoftArchive/redis/releases
二、解壓安裝
將下載后的zip文件解壓到本地磁盤,注意解壓到的目錄不能有中文和特殊字符,否則會出現很多奇葩的問題。解壓后的目錄如下:
三、HA配置
我們采用一主(master)二從(slave)三sentinel的架構模式來做演示
master ip:127.0.0.1 port:6379
slave1 ip:127.0.0.1 port:6380
slave2 ip:127.0.0.1 port:6381
四、新建和修改配置文件
1、修改redis.conf配置文件
由於我們采用的是一主二從三sentinel的模式,所以我們需要6個配置文件,拷貝2份redis.windows.conf配置文件,分別命名為redis.windows6380.conf和redis.windows6381.conf,其中修改redis.windows.conf配置文件的如下幾個參數:
port 6379
bind 127.0.0.1
redis.windows6380.conf如下:
port 6380
bind 127.0.0.1
slaveof 127.0.0.1 6379 // 設置master服務器為6379
redis.windows6381.conf如下:
port 6381
bind 127.0.0.1
slaveof 127.0.0.1 6379 // 設置master服務器為6379
2、創建並修改sentinel.conf
該模式使用了3sentinel,所以我們需要復制3份sentinel.conf配置文件,並分別命名為sentinel26479.conf和sentinel26579.conf,其中修改sentinel.conf配置文件中的如下幾個參數:
/**
1. port :當前Sentinel服務運行的端口
2.sentinel monitor mymaster 127.0.0.1 6379 2:Sentinel去監視一個名為mymaster的主redis實例,這個主實例的IP地址為本機地址127.0.0.1,端口號為6379,而將這個主實例判斷為失效至少需要2個 Sentinel進程的同意,只要同意Sentinel的數量不達標,自動failover就不會執行
3.sentinel down-after-milliseconds mymaster 5000:指定了Sentinel認為Redis實例已經失效所需的毫秒數。當 實例超過該時間沒有返回PING,或者直接返回錯誤,那么Sentinel將這個實例標記為主觀下線。只有一個 Sentinel進程將實例標記為主觀下線並不一定會引起實例的自動故障遷移:只有在足夠數量的Sentinel都將一個實例標記為主觀下線之后,實例才會被標記為客觀下線,這時自動故障遷移才會執行
4.sentinel parallel-syncs mymaster 1:指定了在執行故障轉移時,最多可以有多少個從Redis實例在同步新的主實例,在從Redis實例較多的情況下這個數字越小,同步的時間越長,完成故障轉移所需的時間就越長
5.sentinel failover-timeout mymaster 15000:如果在該時間(ms)內未能完成failover操作,則認為該failover失敗
**/
sentinel.conf內容:
port 26379
sentinel myid 88a3f92f656984fd84c183b6b183d5d264ddc485
sentinel monitor mymaster 127.0.0.1 6381 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel26479.conf內容:
port 26479
sentinel myid 6c4798231532356aacf132f1aa952f022f41012e
sentinel monitor mymaster 127.0.0.1 6381 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel26579.conf內容:
port 26579
sentinel myid fad25e089080be8dddadd3f20e44f888b1f8d48a
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
3、安裝服務,需要重新設置名稱。然后去服務中,開啟“redis6380”(此時就可以連接6380的庫了)
redis-server --service-install redis.windows.conf --service-name redis6379
redis-server --service-install redis.windows6380.conf --service-name redis6380
redis-server --service-install redis.windows6381.conf --service-name redis6381
五、啟動服務器
1、分別啟動master,slave1,slave2
啟動命令分別如下:
redis-server.exe redis.windows.conf
redis-server.exe redis.windows6380.conf
redis-server.exe redis.windows6381.conf
2、分別啟動sentinel1,sentinel2,sentinel3
啟動命令分別如下:
redis-server.exe sentinel.conf --sentinel
redis-server.exe sentinel26479.conf --sentinel
redis-server.exe sentinel26579.conf --sentinel
服務啟動成功后,界面顯示如下:
3、查看redis服務器狀態
4、查看sentinel的狀態
六、redis主從自動failover測試
1、停止master服務器
2、查看剩余服務器的狀態
從上圖中可以看出來,master的服務器端口從6379變成了6380,也就是說redis自動的實現了主從切換,我們可以在查看下sentinel的狀態,如下:
我們發現sentinel監控到127.0.0.1:6379已經無法ping通了,切換master服務器為127.0.0.1:6381
七、下面來研究下slave服務器和master服務器間是如何建立起主從同步機制的。
1、Slave服務啟動,主動連接Master,並發送SYNC命令,請求初始化同步
2、Master收到SYNC后,執行BGSAVE命令生成RDB文件,並緩存該時間段內的寫命令
3、Master完成RDB文件后,將其發送給所有Slave服務器
4、Slave服務器接收到RDB文件后,刪除內存中舊的緩存數據,並裝載RDB文件
5、Master在發送完RDB后,即刻向所有Slave服務器發送緩存中的寫命令
6、至此初始化完成,后續進行增量同步
八、Redis Slaveof 命令
Redis Slaveof 命令可以將當前服務器轉變為指定服務器的從屬服務器(slave server)。
如果當前服務器已經是某個主服務器(master server)的從屬服務器,那么執行 slaveof host port 將使當前服務器停止對舊主服務器的同步,丟棄舊數據集,轉而開始對新主服務器進行同步。
另外,對一個從屬服務器執行命令 slaveof no one 將使得這個從屬服務器關閉復制功能,並從從屬服務器轉變回主服務器,原來同步所得的數據集不會被丟棄。
利用『 slaveof no one 不會丟棄同步所得數據集 』這個特性,可以在主服務器失敗的時候,將從屬服務器用作新的主服務器,從而實現無間斷運行