Redis的常用的集群方式主要有以下3種
1:主從復制
2:哨兵(Sentinel)
3:Cluster
一、主從
主從其實就是一般包含一個主,一個或多個從,從節點從主節點復制數據,可以實現讀寫分離,主節點做寫,從節點做讀。在配置上基本沒什么要改的。這里用Linux做演示。
//這里啟動3個docker,就讓5678當主節點吧 docker run -d -p 5678:6379 redis docker run -d -p 5679:6379 redis docker run -d -p 5677:6379 redis
啟動之后分別進入容器里面
在主節點里面添加數據。並且能夠查到
然后我們去隨便一個從節點里面去查詢,發現並不能查到,這是為什么呢?因為還沒有做數據的同步
要做數據的同步需要執行這個命令
slaveof host port
ok,這樣就能查到數據了。然后后面無論在主節點添加數據,都能在從節點查詢到。
如果想知道主節點有多少從節點的話可以使用 這個命令
info replication
主從節點的優缺點:
優點:可以實現讀寫分離,主節點的數據會自動復制到從節點,分擔主節點的壓力
缺點:當主節點宕機了,會導致部分數據未同步。也不具備容錯和回復功能,無論主節點或者從節點宕機都需要等重啟之后才能使用
二、哨兵模式
其實哨兵模式也是一種主從,只不過增加了哨兵的功能,用於監控主節點的狀態,當主節點宕機之后會進行投票重新選出主節點。
哨兵的宕機分為兩種:主觀宕機(我認為你掉線了)和客觀宕機(我們認為你掉線了),當客觀宕機了之后就會再選舉一個從節點作為主節點,而這又可以分為兩步
1:選哨兵領導
a:我發現了master下線,你們(其他哨兵)選我當哨兵領導吧
b:其他哨兵沒有選過其他人當領導,那我就是領導了
c:超過一半的其他哨兵同意,我就是領導了
d:如果有多個哨兵同時參選,等待任意時間后重新發起投票,直到選出了領頭的
2:由哨兵領導推舉主節點
選主節點要遵循以下原則
a:健康性:從節點響應的時間
b:完整性:根據從節點備份的完整性,根據數據備份偏移量
c:穩定性:啟動時間周期,心跳檢測
d:如果以上三個條件都相等,則根據節點啟動時分配的run id來分配,runid越小越有可能被選擇為主節點
然后開始吧。哨兵需要做一些配置文件。
配置文件
主節點:redis-6379.conf:
port 6379 requirepass 123456
從節點如上,端口分別是6380,6381
port 6380 slaveof 127.0.0.1 6379 masterauth 123456
port 6381 slaveof 127.0.0.1 6379 masterauth 123456
然后是哨兵:
# 其他兩個sentinel節點的端口號分別為26380、26381 port 26379 sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 3000 # 必須配置,否則啟動后sentinel節點都會是sdown(主觀宕機)狀態或者odown(客觀宕機)狀態 sentinel auth-pass mymaster 123456
然后啟動就行了。可以把哨兵模式做成這個樣子,把配置文件都放到Sentinel文件夾里面然后一鍵啟動(哈哈,剛學的)
啟動代碼:
@echo off echo Starting Sentinel: pushd %~dp0\Sentinel echo Targets: 7010-7011 @start "Redis (Sentinel-Target): 7010" /min ..\3.0.503\redis-server.exe redis-7010.conf @start "Redis (Sentinel-Target): 7011" /min ..\3.0.503\redis-server.exe redis-7011.conf echo Monitors: 26379-26381 @start "Redis (Sentinel): 26379" /min ..\3.0.503\redis-server.exe sentinel-26379.conf --sentinel @start "Redis (Sentinel): 26380" /min ..\3.0.503\redis-server.exe sentinel-26380.conf --sentinel @start "Redis (Sentinel): 26381" /min ..\3.0.503\redis-server.exe sentinel-26381.conf --sentinel popd
啟動之后可以發現7011是從節點,7010是主節點
然后通過以下命令進入到26379哨兵查看主從節點狀態
redis-cli -p 26379
然后我們將主節點7010關閉,可以發現,哨兵就重新將7011選為主節點了(當然這里只啟動了兩個,可以多啟動幾個節點,測試效果更佳),而當之前關閉的主節點重啟之后,就會變成從節點
這是重啟后的,會連接到現在的主節點7011
哨兵模式的優缺點
優點:哨兵模式可以算主從模式的升級吧,主從的優點都有,而且哨兵還有監控的功能,當主節點宕機之后哨兵會推選一個健康的從節點做主節點,這樣提高了軟件的可用性
缺點:主從模式的缺點都有,而且配置哨兵啥的比較麻煩,而且在重新選舉主節點期間,無法確定主從,無法工作
三、cluster
集群采用了多主多從,按照一定的規則進行分片,將數據分別存儲,一定程度上解決了哨兵模式下單機存儲有限的問題。
集群模式一般是3主3從,且需要ruby輔助搭建。
1:復制5個redis出來,作為3主3從,端口可以自定義
2:修改配置:cluster-enabled yes
3:安裝 Ruby
4:安裝redis驅動: 地址:https://rubygems.org/gems/redis/versions/3.3.2
將下載的Redis驅動文件redis-3.3.2.gem復制到Ruby安裝目錄下(即:C:Ruby30-x64),打開CMD,運行如下命令:
gem install --local C:Ruby30-x64redis-3.3.2.gem
5:下載集群管理工具,將擴展名為rb的文件拷貝到6379文件夾中
6:將6個redis啟動,在6379的文件夾下cmd,輸入命令:
//replicas 1 表示為集群中的每個主節點創建1個從節點
redis-trib.rb create --replicas 1 127.0.0.1:6379 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
接着執行就是了,這里要選yes
以上,集群搭建完畢。我們可以登錄6379查看集群狀態
redis-cli -p 6378
cluster nodes
從上面我們可以看到集群中3個主節點被分成了3個分區,可以來單獨存儲自己的數據。然后我們設置一個值,會自動跳轉到相應的節點。
在部署集群的時候我踩了以下幾個坑,希望能夠注意下!
1:invalid byte sequence in UTF-8 解決:文件夾不能含中文
2:Node 127.0.0.1:6379 is not configured as a cluster node 解決:將cluster-enabled yes的注釋取消
3: Node 127.0.0.1:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0 解決:清除dump和aof文件
4: ERR Slot 5798 is already busy (Redis::CommandError) 解決:挨個登錄客戶端,執行flushall和cluster reset命令,然后重新執行命令創建集群
5:(error) MOVED 6918 127.0.0.1:6380 解決:redis-cli啟動時使用 -c -p
6:銷毀之前的集群 解決:將node.conf刪除
集群的優缺點
優點:配置了多主多從,可以使數據分區,去中心化,減小了單台機子的負擔,且可用性更高於哨兵模式
缺點:搭建麻煩