當前位置:
首頁 > 最新 > Redis集群搭建

Redis集群搭建

作者:單曲循環

知音專欄

Redis 是一個開源的 key-value 存儲系統,由於出眾的性能,大部分互聯網企業都用來做伺服器端緩存。Redis 在3.0版本前只支持單實例模式,雖然支持主從模式、哨兵模式部署來解決單點故障,但是現在互聯網企業動輒大幾百G的數據,可完全是沒法滿足業務的需求,所以,Redis 在 3.0 版本以後就推出了集群模式。

Redis 集群採用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 個 slot,每個 Redis 實例負責其中一部分 slot 。集群中的所有信息(節點、埠、slot等),都通過節點之間定期的數據交換而更新。

Redis 客戶端可以在任意一個 Redis 實例發出請求,如果所需數據不在該實例中,通過重定向命令引導客戶端訪問所需的實例。

安裝環境

OS: centos 7.2.1511

redis : 最新版 v4.0.1

單台redis安裝

下載

如果是離線安裝,則需要從官網下載指定版本,然後上傳到生產環境。這裡安裝的是最新版redis,指定安裝路徑 /usr/local/redis/

編譯安裝

安裝完成,這時候會在/usr/local/bin/目錄下看到redis-server、redis-cli等可執行腳本,進入看一下,如果沒有,就要去解壓目錄複製進去了。

配置redis.conf

redis.conf在默認在安裝目錄下

這裡要修改兩個地方,一個bind和daemonize就行。

要注意的點:

bind這裡配置要注意,默認是只有一個127.0.0.1,這個時候只能自己連接,其他區域網內是連接不上的。所以,需要配置多個 IP ,這樣就可以區域網內進行連接了。我設置的0.0.0.0,雖然這不太安全,方便我在其它地方連接。

daemonize是設置是否後台啟動 Redis,默認no,正常都需要以服務形式啟動 Redis,所以這裡設置為yes。

可以設置密碼 requirepass mypassord

redis v3.0+版本增加了保護機制,默認protected-mode yes, 這樣目標機器調用可能會報錯,需要設置為no

關於更多配置文件參數的解釋,可以參考:

https://github.com/linli8/cnblogs/blob/master/redis%E5%89%AF%E6%9C%AC.conf

啟動redis

測試redis服務

埠已開啟:

命令行連接:

關閉服務

可以通過殺進程的方式強制關閉服務,也可以通過命令:

通過 netstat 可以看出來埠已經是TIME_WAIT狀態了

以上是centos7單機部署redis的過程,下面集群搭建和上述類似,不過在目錄結構和配置文件不同,當然,遇到的坑也多,主要配置集群依賴一些外部包,但說實話光搭建個集群是沒有啥技術含量但.....

redis集群搭建

簡介

redis-cluster架構設計

架構細節:

所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位協議優化傳輸速度和帶寬.

節點的fail是通過集群中超過半數的節點檢測失效時才生效.

客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可

redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護nodeslotkey

Redis集群預分好16384個桶,當需要在 Redis 集群中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。

環境準備

Redis集群中要求奇數節點,所以至少要有三個節點,並且每個節點至少有一備份節點,所以至少需要6個redis服務實例。

這裡演示的是我搭的生產環境redis集群,3台伺服器,每台起3個服務,共9個節點,生產環境搭建的很順利,但測試環境一台伺服器開6個埠遇到了很多問題,各種依賴包問題,後續會說明。

三台伺服器

按照上面搭建單台redis服務的方式在三台伺服器分別安裝redis,從配置文件開始會有所不同。下面會說明搭建過程。

依賴包安裝

注意,下述均安裝最新版本,否則會和redis版本不匹配

開始集群搭建

1. 準備目錄結構

三台機器一樣,建立如下目錄結構:

分別進入每個埠目錄創建配置文件:

注意,上述有些配置項要對應服務和目錄,三個目錄按照上述配置好後,啟動服務

3.啟動/關閉集群服務

可以在每個伺服器上寫一個啟動腳本start-redis.sh:

關閉服務類似:

$IP分別為三台伺服器IP。

這時只是啟動了9個單獨的redis服務,它們還不是一個集群,下面就說明創建集群

4.創建集群

注意:在任意一台上運行 不要在每台機器上都運行,一台就夠了

Redis 官方提供了 redis-trib.rb 這個工具,就在解壓目錄的 src 目錄中

在其中一台執行:

敲完這個命令後會提示是否按照默認的推薦方式配置集群主從,一般選yes就行了

截圖中看出,推薦了4個masters,5個從節點

下面這個顯示了集群和slot分配結果

5.集群驗證

參數 -C 可連接到集群,因為 redis.conf 將 bind 改為了ip地址,所以 -h 參數不可以省略,-p 參數為埠號

可以看到在29的7000上設置了name,重定向到了30的7000節點。到此為止集群搭建成功!

友情提示:

當出現集群無法啟動時,刪除集群配置文件,再次重新啟動每一個redis服務,然後重新構件集群環境。

redis-trib.rb命令常見用法

1)列出集群節點-cluster nodes

2)查看集群信息- cluster info

3)檢查集群狀態-check

下面內容是測試環境搭建的,一台伺服器6個節點

4)其它常用命令

create:創建一個集群環境host1:port1 ... hostN:portN(集群中的主從節點比例)

call:可以執行redis命令

add-node:將一個節點添加到集群里,第一個參數為新節點的ip:port,第二個參數為集群中任意一個已經存在的節點的ip:port

del-node:移除一個節點

reshard:重新分片

集群操作

向集群中添加節點或刪除節點

我們新建兩個服務,按照之前搭建的集群方式新增倆個節點:(一主一從 master、slave)。

Mater:7007 slave:7008

創建7007/7008文件夾。拷貝redis.conf文件到對於的7007,7008目錄下 ,再進行修改配置文件。

啟動7007和7008倆個服務並查看服務狀態。

1. 集群中添加一個主節點

步驟一:使用add-node命令:綠色為新增節點,紅色為已知存在節點

注意:當添加節點成功以後,新增的節點不會有任何數據,因為他沒有分配任何slot。需要為新節點手動分配slot。

步驟二:reshard命令,分配slot:

提示一

提示二

提示三

提示一:是希望你需要多少個槽移動到新的節點上,可以自己設置,比如200個槽。

提示二:是你需要把這200個slot槽移動到那個節點上去(需要指定節點id),並且下個提示是輸入all為從所有主節點(7001 7002 7003)中分別抽取相應的槽數(一共為200個槽到指定的新節點中!,並且會列印執行分片的計劃。)

提示三:輸入yes確認開始執行分片任務

2. 集群中添加一個從節點

步驟一:使用add-node命令:綠色為新增節點,紅色為已知存在節點

步驟二:首先需要登錄到7008節點的客戶端,然後使用集群命令,執行replicate命令來指定當前節點的主節點id為哪一個。把當前的7008(slave)節點指定到一個主節點下(這裡使用之前創建的7007主節點,綠色表示節點id)。

3.集群中刪除一個主節點

如果主節點有從節點,將從節點轉移到其他主節點。如果主節點有slot,先將主節點裡的slot分配到其他可用節點中,然後再刪除節點才行,否則會有數據的丟失。

步驟一:刪除7007(master)節點之前,我們需要先把其全部的數據(slot槽)移動到其他節點上去(目前只能把master的數據遷移到一個節點上,暫時做不了平均分配功能)。

步驟二:最後我們直接使用del-node命令刪除7007主節點即可(藍色表示7007的節點id)。

4.集群中刪除一個從節點

步驟一:刪除從節點7008,輸入del-node命令,指定刪除節點ip和埠,以及節點id(藍色為7008節點id),移除了7008 slave節點,前節點的服務進程也會隨之銷毀。

nodejs連接redis集群示例

目前用得最多的 Node.js Redis 庫是 node redis,不過這個庫基本已經不再維護了,存在很多 bug(在生產環境中碰到過),也缺失了很多功能(如 pipeling 和腳本優化)。而 ioredis 不僅支持了 Cluster 和 Sentinel,還在 API 層面和 node redis 保持了兼容。

你以為結束了?其實還沒有!

集群搭建過程的各種奇葩錯誤這裡匯總,當然下面錯誤不是一定會遇到,但不保證一定不會不遇到。生產環境我搭的挺順利,但是測試環境幾乎所有能遇到的問題全都遇到了,最後都解決了,特此記錄!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java知音 的精彩文章:

SpringBoot自動配置原理

TAG:Java知音 |