文章目錄
Redis 3種集羣方式,別傻傻分不清!
redis集羣有三種方式:主從複製,哨兵,集羣(master-cluster)
爲了方便本文在Window下進行演示,在一臺機器上多開實例模擬集羣模式,配置和Linux上配置並無多大差異,純粹是爲了方面操作。
redis主從配置需要注意的幾點
首先不管哪一種的方式,版本必須一致。
存儲數據方式需要一致
1 redis 主從模式配置
前言
主從關係,簡單說是以主庫爲準,從庫內容異步複製主數據庫,從而達成主從內容基本一致的情況。
前者稱爲主節點(master),後者稱爲從節點(slave),數據的複製是單向的,只能由主節點到從節點。
數據庫分爲兩類,Master數據庫和Slave數據庫。
redis 主從模式配置
解壓redis 安裝包 然後複製兩份或者多份(這裏以windows爲例,linux基本一致 ,我這裏沒有多個服務器,所以在一臺機器上模擬多實例代替多機器主從)
一個是6380 這個是主節點,6381這是從節點
首先更改配置文件 (redis.windows.conf )
要做的事情是改端口 一個是6380 這個是主節點,6381這是從節點
-
指定新的PID文件路徑 (windows下沒有)
pidfile /var/run/redis/redis_6380.pid
- 指定新的端口號 (必須改)
port 6380
- 指定新的日誌文件路徑
logfile /var/log/redis/redis_6380.log
- 指定新的轉儲文件路徑
dbfilename dump_6380.rdb
日誌和數據庫文件可以配置也可以不配置
配置主從配置 (redis.windows.conf )
從節點 6389 配置如下
slaveof 127.0.0.1 6380
主節點ip 和 端口
masterauth admin
主節點有密碼就配置,沒有就不配置
保存啓動 測試
其他配置參數:
*slaveof *masterauth slave-serve-stale-data yes 主節點出問題時,是否使用本機數據提供服務 slave-read-only yes 從節點是 只讀的 *repl-diskless-sync no 快照先存於磁盤,再發送給從節點 no, Disk-backed, Diskless 新的從節點或某較長時間未能與主節點進行同步的從節點重新與主節點通信,需要做“full synchronization".複製代碼
複製啓動前延遲一個時間段;
repl-diskless-sync-delay 5 repl-ping-slave-period 10 *repl-timeout 60 repl-disable-tcp-nodelay no repl-backlog-size 1mb複製代碼
默認優先級
slave-priority 100
複製集羣中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉;
min-slaves-to-write 3:主節點僅允許其能夠通信的從節點數量大於等於此處的值時接受寫操作; min-slaves-max-lag 10:從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;複製代碼
2 redis 哨兵模式(一主一從兩哨兵)
前言
有了主從模式,主庫如果發生故障,從庫可以轉爲主庫,這時候我們需要對redis進行監控,此時就需要用到redis中的哨兵機制。
哨兵是建立在主從模式基礎之上
哨兵模式是redis 2.x
版本提供的,3.x
版本的時候一般我們使用 redis集羣 cluster
大概配置步驟如下圖
redis 哨兵模式
哨兵模式
這裏我們使用一個主節點(主)和一個子節點(從)
從節點使用哨兵模式進行監控主節點,如果主掛了,從庫自動升級爲主節點,等待主庫恢復了,主庫會自動變爲從庫。
但此時,如果升級爲主庫的從節點掛了,此時變爲從庫的主節點不會變爲主庫,出現這種問題,我們一般採用的是主從都進行哨兵模式配置,互相監控對方,從而達到高可用。
哨兵是用來監控主從數據庫的,當master掛掉後選擇一個salve當做master。
配置哨兵
redis 主 port6380 Sentinel(哨兵端口)26380
由於windows版本的redis沒有 Sentinel.conf
文件 所以在redis的文件中創建一個
主服務6380
哨兵監聽 從節點6381
# 當前Sentinel服務運行的端口port 26380#mastersentinel monitor master 127.0.0.1 6381 1sentinel down-after-milliseconds master 5000sentinel failover-timeout master 180000sentinel parallel-syncs master 1複製代碼
從節點6381
哨兵監聽 主服務6380
# 當前Sentinel服務運行的端口port 26381# Sentinel去監視一個名爲mymaster的主redis實例,# 這個主實例的IP地址爲本機地址127.0.0.1,端口號爲6379,# 而將這個主實例判斷爲失效至少需要2個 Sentinel進程的同意,# 只要同意Sentinel的數量不達標,自動failover就不會執行 # 這個一定設置爲 no 或者這裏不設置 需要在哨兵中關閉保護模式。# protected-mode no# 指定了Sentinel認爲Redis實例已經失效所需的毫秒數。# 當 實例超過該時間沒有返回PING,或者直接返回錯誤,那麼Sentinel將這個實例標記爲主觀下線。# 只有一個 Sentinel進程將實例標記爲主觀下線並不一定會引起實例的自動故障遷移:只有在足夠數量的Sentinel都將一個實例標記爲主觀下線之後,實例纔會被標記爲客觀下線,這時自動故障遷移纔會執行sentinel monitor mymaster 127.0.0.1 6380 1# 指定了在執行故障轉移時,最多可以有多少個從Redis實例在同步新的主實例,在從Redis實例較多的情況下這個數字越小,同步的時間越長,完成故障轉移所需的時間就越長sentinel down-after-milliseconds mymaster 5000# 如果在該時間(ms)內未能完成failover操作,則認爲該failover失敗sentinel failover-timeout mymaster 10000 複製代碼
啓動redis
redis-server.exe redis.windows.conf -h 127.0.0.1 -p 6379
啓動哨兵
redis-server.exe sentinel.conf --sentinel
停止6380 主節點,查看從節點6381 可以看到升爲主節點了
可以從6381哨兵中看到
在啓動6380 主節點 ,可以看到 6380主節點轉爲6380的從節點
可以在6380的哨兵中看到
一主一從兩哨兵的目的是
主庫掛了從升級爲主庫,原來主庫恢復了之後成爲從庫
3 Redis集羣版
準備
下載安裝redis
redis安裝成功後文件
Redis只有3.0之後的版本纔有集羣
redis的哨兵模式基本已經可以實現高可用,讀寫分離 ,但是在這種模式下每臺redis服務器都存儲相同的數據,很浪費內存,所以在redis3.0上加入了cluster模式,實現的redis的分佈式存儲,也就是說每臺redis節點上存儲不同的內容。
修改配置文件 redis.windows.conf
修改內容爲
port 7001//修改爲與當前文件夾名字一樣的端口號appendonly yes //指定是否在每次更新操作後進行日誌記錄,Redis在默認情況下是異步的把數據寫入磁盤,如果不開啓,可能會在斷電時導致一段時間內的數據丟失。yes表示:存儲方式,aof,將寫操作記錄保存到日誌中cluster-enabled yes //開啓集羣模式cluster-config-file nodes-7001.conf //保存節點配置,自動創建,自動更新(建議命名時加上端口號)cluster-node-timeout 15000 //集羣超時時間,節點超過這個時間沒反應就斷定是宕機複製代碼
然後把7001 redis文件,每樣複製一份到7002 7003 ---- 7006 一份!
Redis集羣至少需要3個master節點,所以現在總共有6個節點,就只能是1master對應1slave這種方式。
然後打開每個7001 — 7006 的redis.windows.conf文件把端口和cluster-config-file文件一下,這裏建議打開直接替換7001對應的端口(全局替換每個redis.windows.conf 文件)
然後每個節點文件下建立一個啓動bat文件
startbat.bat
title redis redis-server.exe redis.windows.conf複製代碼
如下圖所示
然後每個點擊啓動即可
下載Ruby並安裝
下載地址:dl.bintray.com/oneclick/ru…下載後雙擊安裝下一步,勾全選。
下載安裝Redis的Ruby驅動redis-xx.gem
根據你的redis版本進行下載
下載之後放到Ruby安裝目錄下
cmd打開命令框 執行命令gem install --local C:\Ruby22-x64\redis-3.2.2.gem
出現以下信息說明配置成功
安裝集羣腳本redis-trib
下載地址 raw.githubusercontent.com/antirez/red…
或者百度雲 鏈接:pan.baidu.com/s/1kOZs9f7o… 提取碼:vdhf
下載後放到redis集羣文件根目錄下
啓動集羣
首先
啓動7001 – 7006 所有的redis ( 或者啓動所有集羣節點start.bat ) 這裏無論什麼方式 只要啓動redis了就可以。
然後
開始創建集羣 打開cmd 執行構建集羣腳本 redis-trib.rb
ruby redis-trib.rb create --replicas 1 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 127.0.0.1:7006
複製代碼
replicas 1
中的1
表示佔比,表示主和從的比例數據,這裏是三主三從
,所以是1
說明各個集羣在進行
上面啓動的腳本創建集羣的時候 中途會詢問是否打印更多詳細信息,輸入yes ,然後 redis-trib 就會將這份配置應用到集羣當中,讓各個節點開始互相通訊。
中途會打印輸出很多日誌
測試
在7001 庫添加一個數據測試,然後其他庫進行查詢 數據同步過來就說明成功。
分配策略
Redis集羣數據分配策略
採用一種叫做哈希槽 (hash slot)的方式來分配數據,redis cluster 默認分配了 16384 個slot,三個節點分別承擔的slot 區間是
分配策略
Redis集羣數據分配策略
採用一種叫做哈希槽 (hash slot)的方式來分配數據,redis cluster 默認分配了 16384 個slot,三個節點分別承擔的slot 區間是
4 Redis集羣動態增加或者刪除節點
redis集羣動態增加或者刪除節點
前言
首先新增需要添加的節點,這裏添加7007 和 7008(上面已經配置了7001 - 7006端口的集羣)
修改一些配置文件信息,參考集羣配置。
然後啓動相應的節點
添加節點到集羣
127.0.0.1:7007 是新增節點
127.0.0.1:7001 是已經新增集羣節點(這裏可以隨便寫一個已知的集羣節點 ip : port
)
redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001
添加7007到集羣
查看新增節點
redis-cli -c -p 7001 cluster nodes
增加了新的節點之後,這個新的節點可以成爲主節點或者是從節點。
分配哈希槽(成爲主節點)
使用redis-trib程序,將集羣中的某些哈希槽移動到新節點裏面, 這個新節點就成爲真正的主節點了
redis-trib.rb reshard 127.0.0.1:7001
系統返回信息會提示我們要移動多少哈希槽,這裏移動200個
然後 需要指定把這些哈希槽轉移到哪個節點上
當然是轉移到新增的節點上
輸入我們剛纔新增的節點的ID
選擇選擇槽的方式
輸入 all
表示從所有的主節點中隨機轉移,湊夠200個哈希槽 然後再輸入yes
,redis集羣就開始分配哈希槽了。
輸入 done
表示把指定主節點上的槽分配給新節點.。
打印出隨機選擇的槽
輸入yesr進行分配
查看新增主節點
分配成功
添加從節點
添加7008到集羣中去
redis-trib.rb add-node 127.0.0.1:7008 127.0.0.1:7006
查看
添加7008成爲7007的從節點
登錄7008客戶端
執行分配節點
cluster replicate fccadebeb5b769bd084369e5cbe391979fb53b40
fccadebeb5b769bd084369e5cbe391979fb53b40
是 7007 節點 id
查看節點配置
刪除節點
刪除主節點
首先要把節點中的哈希槽轉移到其他節點中,執行下面的命令
redis-trib.rb reshard 127.0.0.1:7007
提示我們要移動多少哈希槽 ?
輸入數字即可
選擇接受的槽節點ID?
找一個主節點接受哈希槽即可
選擇數據源槽?
輸入需要清除的節點ID即可
最後 輸入 done
刪除分配
查看節點信息
7007已經無哈希槽
最後使用刪除節點刪除
redis-trib.rb del-node 127.0.0.1:7007 ID
ID 是7007的節點ID
查看節點信息
7007已經被成功刪除
刪除從節點
redis-trib.rb del-node 127.0.0.1:7008 ID
ID 是7008的節點ID
查看節點
7008從節點已經沒有了
關注我
長按二維碼
如果你喜歡這篇文章,喜歡,在看,轉發。