Redis的三種集群方式


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刪除

集群的優缺點

優點:配置了多主多從,可以使數據分區,去中心化,減小了單台機子的負擔,且可用性更高於哨兵模式

缺點:搭建麻煩


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM