Redis 集羣搭建

Redis 集羣搭建

前言

最近通過看視頻學習了一下 Redis,前天使用 CentOS 7 配置了一下 Redis 4.0.9 單機版(相關鏈接:CentOS 7 配置 Redis 4.0.9),今天則通過之前的筆記,視頻以及 redis 官網上集羣搭建的教程(https://redis.io/topics/cluster-tutorial) 的資料來搭建一下 Redis 集羣。

本次則是在上次 CentOS 7 配置 Redis 4.0.9 的環境下繼續搭建集羣


配置運行在集羣模式的 Redis 實例

最少選項的集羣的配置文件:

# 端口號
port 7000
# 開啓集羣模式
cluster-enabled yes
# 設置保存節點配置文件的路徑,默認值爲 nodes.conf。節點配置文件無須人爲修改
cluster-config-file nodes.conf
# 設置節點超時時間
cluster-node-timeout 5000
# 設置是否開啓 aof 模式,對數據庫完整性要求比較高可以開啓
appendonly no

爲了外部訪問,需要配置一下 IP 地址以及關閉防火牆。例如 bind 192.168.229.162來綁定 IP 地址。這裏我以我運行 Redis 實例的虛擬機的 IP 地址爲例。CentOS 7 停止防火牆:systemctl stop firewalld.service;禁止防火牆開機啓動:systemctl disable firewalld.service

Redis 持久化方案有兩種,默認開啓的是 rdb 模式,定期把內存中的數據保存到磁盤;另一種則是 aof 模式,會頻繁進行保存,會影響性能。自己練手時,推薦使用 rdb 模式即可。

順帶記得設置一下後端啓動,代碼如下:

# 設置爲後端啓動
daemonize yes

我的配置如下:

# IP
bind 192.168.229.162
# 端口號
port 7001
# 開啓集羣模式
cluster-enabled yes
# 設置保存節點配置文件的路徑,默認值爲 nodes.conf。節點配置文件無須人爲修改
cluster-config-file nodes.conf
# 設置節點超時時間
cluster-node-timeout 5000
# 設置是否開啓 aof 模式,對數據庫完整性要求比較高可以開啓
appendonly no
# 設置爲後端啓動
daemonize yes

配置集羣前期準備

集羣正常運行至少需要 3個節點,不過剛開始使用集羣功能時,推薦使用 6個節點:3個主節點,3個從節點。

集羣正常運行至少需要 3個節點,是因爲 Redis 集羣有個投票機制(容錯機制),來判斷某個節點是否掛了,當超過半數認爲該節點掛了,則認定該節點掛了,此時則切換到該節點的從節點。

如上,若一個節點掛了,找不到從節點,無法切換,則數據不完整,則整個 Redis 集羣就掛了。故爲了實現高可用,每個節點至少配置一個從節點。

在 /usr/local 下創建文件夾 redis-cluster-test。使用命令:mkdir redis-cluster-test。然後在 redis-cluster-test 下創建六個以端口號爲名字的子目錄

cd redis-cluster-test
mkdir 7000 7001 7002 7003 7004 7005

在這六個子目錄之中,各創建一個 redis.conf 配置文件,配置內容爲上面最少選項的集羣的配置文件,端口改爲對應的目錄名字。或者是從 Redis 源碼裏面拷貝一份 redis.conf 配置文件出來並修改對應的參數。

將編譯好的 redis-server(從上回配置單機版 redis 的文件夾下拷貝,路徑爲 /usr/local/redis/bin 下) 可執行文件複製到 redis-cluster-test 文件夾下,使用以下命令,分別開啓實例:

cd 7000
../redis-server ./redis.conf

因爲 nodes.conf 文件不存在, 所以每個節點都爲它自身指定了一個新的 ID

當然,我們可以寫一個腳本文件,來一鍵開啓 6個 Redis 實例。在 redis-cluster-test 文件夾下,運行命令:vi start-all.sh,會自動在 redis-cluster-test 文件夾下生成一個 start-all.sh 文件,在裏面輸入以下代碼:

cd 7000
../redis-server ./redis.conf
cd ..
cd 7001
../redis-server ./redis.conf
cd ..
cd 7002
../redis-server ./redis.conf
cd ..
cd 7003
../redis-server ./redis.conf
cd ..
cd 7004
../redis-server ./redis.conf
cd ..
cd 7005
../redis-server ./redis.conf
cd ..

然後保存退出即可(按 ESC 鍵後,輸入:wq,回車即可),保存後對該腳本文件進行授權:chmod u+x start-all.sh。(同理,我們也可以配置一個關閉 redis 服務的腳本,先從之前的 /usr/local/redis/bin 中拷貝 redis-cli 來關閉,參考之前配置單機版 redis 的文章)

運行命令:./start-all.sh,此時,我們通過查看進程(命令:ps aux|grep redis),可以看到運行着 6個 Redis 實例。


搭建集羣

Ruby 環境

官方默認提供了 Redis 集羣命令行工具 redis-trib.rb。redis-trib.rb 位於 Redis 源碼的 src 文件夾中, 它是一個 Ruby 程序, 這個程序通過向實例發送特殊命令來完成創建新集羣, 檢查集羣, 或者對集羣進行重新分片(reshared)等工作。

爲了方便之後的使用,我們可以使用命令將它複製到 redis-cluster-test 文件夾之中。進入 Redis (之前,我們是將源碼從本地上傳到虛擬機中的 root 目錄下,路徑爲 /root/redis-4.0.9)源碼的 src 文件夾後,使用命令:cp redis-trib.rb /usr/local/redis-cluster-test

因爲這是個 Ruby 程序,所以我們需要先配置一下 Ruby 環境和 redis-trib.rb 腳本運行使用的包(redis-X.X.X.gem,官方地址:https://rubygems.org/gems/redis) 。這之間走了一些彎路,這裏就不細講了。

進入 /usr/local/redis-cluster-test,通過命令配置 Redis 集羣:

./redis-trib.rb create --replicas 1 192.168.229.162:7000 192.168.229.162:7001 192.168.229.162:7002 192.168.229.162:7003 192.168.229.162:7004 192.168.229.162:7005

注:參數 –replicas 1 表示爲集羣中的每個主節點創建一個從節點,之後跟着是這個集羣實例的地址列表,先是主節點,然後是從節點。

其中會讓你確認配置是否有問題,輸入 yes 即可。redis-trib.rb 就會配置好一切,讓各個節點之間相互通信。


測試集羣

可以使用 redis 默認提供的客戶端 —— redis-cli 來進行測試(先從之前的 /usr/local/redis/bin 中拷貝 redis-cli)。

連接集羣:./redis-cli -c -h 192.168.229.162 -p 7000
注:這與平時直接連接 redis 實例有所不同,需要加上 -c 這個參數,代表連接的是 Redis 集羣
連接成功後,試着往裏面添加一些數據,如下圖:

如上圖,在添加數據的時候,會對每個 key 進行 CRC16 校驗後對 16384 取模來決定放在哪個哈希槽,然後存儲到對應的節點上。到此 Redis 集羣就搭建完成了。

後記

目前 Redis 集羣的客戶端使用最多的是 Java 客戶端 —— Jedis。之後也會對 Jedis 的使用做一些筆記。

在實踐中學習。

HochenChong

2018-04-27

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章