1、主從同步/複製前端
經過持久化功能,Redis保證了即便在服務器重啓的狀況下也不會丟失(或少許丟失)數據,由於持久化會把內存中數據保存到硬盤上,重啓會從硬盤上加載數據。 可是因爲數據是存儲在一臺服務器上的,若是這臺服務器出現硬盤故障等問題,也會致使數據丟失。node
爲了不單點故障,一般的作法是將數據庫複製多個副本以部署在不一樣的服務器上,這樣即便有一臺服務器出現故障,其餘服務器依然能夠繼續提供服務。爲此, Redis 提供了複製(replication)功能,能夠實現當一臺數據庫中的數據更新後,自動將更新的數據同步到其餘數據庫上。redis
在複製的概念中,數據庫分爲兩類,一類是主數據庫(master),另外一類是從數據庫(slave)。主數據庫能夠進行讀寫操做,當寫操做致使數據變化時會自動將數據同步給從數據庫。而從數據庫通常是隻讀的,並接受主數據庫同步過來的數據。一個主數據庫能夠擁有多個從數據庫,而一個從數據庫只能擁有一個主數據庫。算法
主從數據庫的配置:數據庫
主數據庫不用配置,從數據庫的配置文件(redis.conf)中能夠加載主數據庫的信息,也能夠在啓動時,使用 redis-server --port 6380 --slaveof 127.0.0.1 6379 命令指明主數據庫的 IP 和端口。從數據庫通常是隻讀,能夠改成可寫,但寫入的數據很容易被主同步沒,因此仍是隻讀就能夠。也能夠在運行時使用 slaveof ip port 命令,中止原來的主,切換成剛剛設置的主 slaveof no one會把本身變成主。服務器
主從複製原理:網絡
優勢:分佈式
缺點:工具
2、哨兵模式測試
第一種主從同步/複製的模式,當主服務器宕機後,須要手動把一臺從服務器切換爲主服務器,這就須要人工干預,費事費力,還會形成一段時間內服務不可用。這不是一種推薦的方式,更多時候,咱們優先考慮哨兵模式。
哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,做爲進程,它會獨立運行。其原理是哨兵經過發送命令,等待Redis服務器響應,從而監控運行的多個Redis實例。
哨兵模式的做用:
然而一個哨兵進程對Redis服務器進行監控,也可能會出現問題,爲此,咱們可使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就造成了多哨兵模式。
故障切換的過程:
假設主服務器宕機,哨兵1先檢測到這個結果,系統並不會立刻進行 failover 過程,僅僅是哨兵1主觀的認爲主服務器不可用,這個現象成爲主觀下線。當後面的哨兵也檢測到主服務器不可用,而且數量達到必定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行 failover 操做。切換成功後,就會經過發佈訂閱模式,讓各個哨兵把本身監控的從服務器實現切換主機,這個過程稱爲客觀下線。這樣對於客戶端而言,一切都是透明的。
哨兵模式的配置:
配置一主二從和三個哨兵的 Redis 服務器來演示這個過程
主從服務器配置
# 使得Redis服務器能夠跨網絡訪問 bind 0.0.0.0 # 設置密碼 requirepass "123456" # 如下有關slaveof的配置只是配置從服務器,主服務器不須要配置 # 指定主服務器 slaveof 192.168.11.128 6379 # 主服務器密碼 masterauth 123456
哨兵配置
# 禁止保護模式 protected-mode no # 配置監聽的主服務器,這裏sentinel monitor表明監控,mymaster表明服務器的名稱,能夠自定義,192.168.11.128表明監控的主服務器,6379表明端口,2表明只有兩個或兩個以上的哨兵認爲主服務器不可用的時候,纔會進行failover操做。 sentinel monitor mymaster 192.168.11.128 6379 2 # sentinel author-pass定義服務的密碼,mymaster是服務名稱,123456是Redis服務器密碼 # sentinel auth-pass <master-name> <password> sentinel auth-pass mymaster 123456
配置3個哨兵,每一個哨兵的配置都是同樣的。在Redis安裝目錄下有一個sentinel.conf文件,copy一份進行修改
啓動
注意啓動的順序。首先是主機(192.168.11.128)的 Redis 服務進程,而後啓動從機的 Redis 服務進程,最後啓動3個哨兵的服務進程。
哨兵模式的工做方式:
優勢:
缺點:
3、Cluster 集羣
Redis 的哨兵模式基本已經能夠實現高可用,讀寫分離 ,可是在這種模式下每臺 Redis 服務器都存儲相同的數據,很浪費內存,因此在redis3.0上加入了 Cluster 集羣模式,實現了 Redis 的分佈式存儲,也就是說每臺 Redis 節點上存儲不一樣的內容。
集羣的配置
根據官方推薦,集羣部署至少要 3 臺以上的master節點,最好使用 3 主 3 從六個節點的模式。在測試環境中,只能在一臺機器上面開啓6個服務實例來模擬。
一、修改配置文件
將 redis.conf 的配置文件複製6份(文件名最好加上端口後綴),而後開始修改配置文件中的參數
#開啓redis的集羣模式 cluster-enabled yes #配置集羣模式下的配置文件 cluster-config-file nodes-6379.conf #集羣內節點之間支持最長響應時間 cluster-node-timeout 15000
二、修改完畢以後啓動 6 個 Redis 服務
三、快速部署集羣
6個 Redis 服務啓動成功以後,藉助 redis-tri.rb 工具能夠快速的部署集羣,若是本機沒有該命令行須要自行安裝,只須要執行/redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 就能夠成功建立集羣。
建立集羣可能會出現的錯誤
#這是因爲建立集羣中的某一個服務中曾經插入過數據,而且已經產生了持久化文件,此時須要flushall命令清空全部數據 [ERR] Node 127.0.0.1:6380 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0 #這是因爲以前建立集羣遺留的配置文件致使的問題,使用命令cluster reset便可 redis-4.1.0/lib/redis/client.rb:124:in `call': ERR Slot 935 is already busy
集羣的部署會在後續的文章中進行詳細的說明和測試,這裏就不詳細說明了
集羣的特色
全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
節點的fail是經過集羣中超過半數的節點檢測失效時才生效。
客戶端與 Redis 節點直連,不須要中間代理層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可。
集羣的工做方式
在 Redis 的每個節點上,都有這麼兩個東西,一個是插槽(slot),它的的取值範圍是:0-16383。還有一個就是cluster,能夠理解爲是一個集羣管理的插件。當咱們的存取的 Key到達的時候,Redis 會根據 crc16的算法得出一個結果,而後把結果對 16384 求餘數,這樣每一個 key 都會對應一個編號在 0-16383 之間的哈希槽,經過這個值,去找到對應的插槽所對應的節點,而後直接自動跳轉到這個對應的節點上進行存取操做。
爲了保證高可用,redis-cluster集羣引入了主從模式,一個主節點對應一個或者多個從節點,當主節點宕機的時候,就會啓用從節點。當其它主節點ping一個主節點A時,若是半數以上的主節點與A通訊超時,那麼認爲主節點A宕機了。若是主節點A和它的從節點A1都宕機了,那麼該集羣就沒法再提供服務了。