下面介紹Redis的集羣方案。前端
Redis的replication機制容許slave從master那裏經過網絡傳輸拷貝到完整的數據備份,從而達到主從機制。爲了實現主從複製,咱們準備三個redis服務,依次命名爲master,slave1,slave2。node
爲了測試效果,咱們先修改主服務器的配置文件redis.conf的端口信息git
port 6300
複製代碼
replication相關的配置比較簡單,只須要把下面一行加到slave的配置文件中。你只須要把ip地址和端口號改一下。github
slaveof 192.168.1.1 6379
複製代碼
咱們先修改從服務器1的配置文件redis.conf的端口信息和從服務器配置。redis
port 6301
slaveof 127.0.0.1 6300
複製代碼
咱們再修改從服務器2的配置文件redis.conf的端口信息和從服務器配置。後端
port 6302
slaveof 127.0.0.1 6300
複製代碼
值得注意的是,從redis2.6版本開始,slave支持只讀模式,並且是默認的。能夠經過配置項slave-read-only來進行配置。 此外,若是master經過requirepass配置項設置了密碼,slave每次同步操做都須要驗證密碼,能夠經過在slave的配置文件中添加如下配置項服務器
masterauth <password>
複製代碼
分別啓動主服務器,從服務器,咱們來驗證下主從複製。咱們在主服務器寫入一條消息,而後再其餘從服務器查看是否成功複製了。網絡
主從機制,上面的方案中主服務器可能存在單點故障,萬一主服務器宕機,這是個麻煩事情,因此Redis提供了Redis-Sentinel,以此來實現主從切換的功能,相似與zookeeper。數據結構
Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis作master-slave的高可用方案時,假如master宕機了,Redis自己(包括它的不少客戶端)都沒有實現自動進行主備切換,而Redis-Sentinel自己也是一個獨立運行的進程,它能監控多個master-slave集羣,發現master宕機後能進行自動切換。app
它的主要功能有如下幾點
Redis Sentinel 兼容 Redis 2.4.16 或以上版本, 推薦使用 Redis 2.8.0 或以上的版本。
必須指定一個sentinel的配置文件sentinel.conf,若是不指定將沒法啓動sentinel。首先,咱們先建立一個配置文件sentinel.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6300 2
複製代碼
官方典型的配置以下
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
複製代碼
配置文件只須要配置master的信息就好啦,不用配置slave的信息,由於slave可以被自動檢測到(master節點會有關於slave的消息)。
須要注意的是,配置文件在sentinel運行期間是會被動態修改的,例如當發生主備切換時候,配置文件中的master會被修改成另一個slave。這樣,以後sentinel若是重啓時,就能夠根據這個配置來恢復其以前所監控的redis集羣的狀態。
接下來咱們將一行一行地解釋上面的配置項:
sentinel monitor mymaster 127.0.0.1 6379 2
複製代碼
這行配置指示 Sentinel 去監視一個名爲 mymaster 的主服務器, 這個主服務器的 IP 地址爲 127.0.0.1 , 端口號爲 6300, 而將這個主服務器判斷爲失效至少須要 2 個 Sentinel 贊成,只要贊成 Sentinel 的數量不達標,自動故障遷移就不會執行。
不過要注意, 不管你設置要多少個 Sentinel 贊成才能判斷一個服務器失效, 一個 Sentinel 都須要得到系統中多數(majority) Sentinel 的支持, 才能發起一次自動故障遷移, 並預留一個給定的配置紀元 (configuration Epoch ,一個配置紀元就是一個新主服務器配置的版本號)。換句話說, 在只有少數(minority) Sentinel 進程正常運做的狀況下, Sentinel 是不能執行自動故障遷移的。sentinel集羣中各個sentinel也有互相通訊,經過gossip協議。
除了第一行配置,咱們發現剩下的配置都有一個統一的格式:
sentinel <option_name> <master_name> <option_value>
複製代碼
接下來咱們根據上面格式中的option_name一個一個來解釋這些配置項:
對於 redis-sentinel 程序, 你能夠用如下命令來啓動 Sentinel 系統
redis-sentinel sentinel.conf
複製代碼
對於 redis-server 程序, 你能夠用如下命令來啓動一個運行在 Sentinel 模式下的 Redis 服務器
redis-server sentinel.conf --sentinel
複製代碼
以上兩種方式,都必須指定一個sentinel的配置文件sentinel.conf, 若是不指定將沒法啓動sentinel。sentinel默認監聽26379端口,因此運行前必須肯定該端口沒有被別的進程佔用。
此時,咱們開啓兩個Sentinel,關閉主服務器,咱們來驗證下Sentinel。發現,服務器發生切換了。
Twemproxy是由Twitter開源的Redis代理, Redis客戶端把請求發送到Twemproxy,Twemproxy根據路由規則發送到正確的Redis實例,最後Twemproxy把結果聚集返回給客戶端。
Twemproxy經過引入一個代理層,將多個Redis實例進行統一管理,使Redis客戶端只須要在Twemproxy上進行操做,而不須要關心後面有多少個Redis實例,從而實現了Redis集羣。
這麼些年來,Twenproxy做爲應用範圍最廣、穩定性最高、最久經考驗的分佈式中間件,在業界普遍使用。
可是,Twemproxy存在諸多不方便之處,最主要的是,Twemproxy沒法平滑地增長Redis實例,業務量突增,需增長Redis服務器;業務量萎縮,須要減小Redis服務器。但對Twemproxy而言,基本上都很難操做。其次,沒有友好的監控管理後臺界面,不利於運維監控。
Codis解決了Twemproxy的這兩大痛點,由豌豆莢於2014年11月開源,基於Go和C開發、現已普遍用於豌豆莢的各類Redis業務場景。
Codis 3.x 由如下組件組成:
Redis 3.0集羣採用了P2P的模式,徹底去中心化。支持多節點數據集自動分片,提供必定程度的分區可用性,部分節點掛掉或者沒法鏈接其餘節點後,服務能夠正常運行。Redis 3.0集羣採用Hash Slot方案,而不是一致性哈希。Redis把全部的Key分紅了16384個slot,每一個Redis實例負責其中一部分slot。集羣中的全部信息(節點、端口、slot等),都經過節點之間按期的數據交換而更新。
Redis客戶端在任意一個Redis實例發出請求,若是所需數據不在該實例中,經過重定向命令引導客戶端訪問所需的實例。
Redis 3.0集羣,目前支持的cluster特性
選舉過程是集羣中全部master參與,若是半數以上master節點與master節點通訊超時,認爲當前master節點掛掉。
當集羣不可用時,全部對集羣的操做作都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤。若是集羣任意master掛掉,且當前master沒有slave,集羣進入fail狀態,也能夠理解成進羣的slot映射[0-16383]不完成時進入fail狀態。若是進羣超過半數以上master掛掉,不管是否有slave集羣進入fail狀態。
如今,咱們進行集羣環境搭建。集羣環境至少須要3個主服務器節點。本次測試,使用另外3個節點做爲從服務器的節點,即3個主服務器,3個從服務器。
修改配置文件,其它的保持默認便可。
#根據實際狀況修改
port 7000
#容許redis支持集羣模式
cluster-enabled yes
#節點配置文件,由redis自動維護
cluster-config-file nodes.conf
#節點超時毫秒
cluster-node-timeout 5000
# 開啓AOF同步模式
appendonly yes
複製代碼
目前這些實例雖然都開啓了cluster模式,可是彼此還不認識對方,接下來能夠經過Redis集羣的命令行工具redis-trib.rb來完成集羣建立。 首先,下載 raw.githubusercontent.com/antirez/red…。
而後,搭建Redis 的 Ruby 支持環境。這裏,不進行擴展,參考相關文檔。
如今,接下來運行如下命令。這個命令在這裏用於建立一個新的集羣, 選項–replicas 1 表示咱們但願爲集羣中的每一個主節點建立一個從節點。
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
複製代碼