Redis建立高可用叢集教程【Windows環境】
在這個網際網路時代,在高併發和高流量可能隨時爆發的情況下,單機版的系統或者單機版的應用已經無法生存,越來越多的應用開始支援叢集,支援分散式部署了。而Redis作為快取伺服器的比較出色的一員,它在出生的時候就被設定支援叢集,本篇就是介紹Redis叢集的介紹和搭建過程!使用的平臺是Windows,搭建的思路和Linux上基本一致!
Redis建立叢集簡單介紹
Redis 叢集由多個執行在叢集模式(cluster mode)下的 Redis 例項組成, 例項的叢集模式需要通過配置來開啟, 開啟叢集模式的例項將可以使用叢集特有的功能和命令。
要讓叢集正常運作至少需要三個主節點, 本篇是簡單的學習叢集搭建,所以選擇使用六個節點: 其中三個為主節點, 而其餘三個則是各個主節點的從節點。
Redis建立叢集搭建過程
因為linux安裝官網都有詳細介紹和說明,Linux環境Redis下載和安裝。
這裡介紹Windows環境的安裝!
環境介紹
1.win10 64位
2.Redis-x64-3.2.100
# redis windows版下載地址
# https://github.com/MicrosoftArchive/redis/releases
3.ruby 環境
1. ruby環境準備
Redis Cluster的安裝需要的安裝ruby環境。
(1)下載Ruby的安裝包,下載地址:Ruby安裝包下載,下載適合自己系統的版本!我下載的是Ruby 2.3 (x64)!
(2)安裝Ruby,下面三個不用配置環境變數
(3)驗證,開啟cmd,輸入ruby –version,檢視安裝Ruby的版本。
C:\Users\acer>ruby --version
ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]
(4)安裝RubyGems
由於牆的問題,Ruby自帶的源下載很慢,可能導致RubyGems安裝不成功!之前可以使用淘寶的ruby映象源但是目前不在維護https://ruby.taobao.org/,現在修改為 Ruby China http://gems.ruby-china.org/ 。
在Window上的話,也是類似的方法,win+r,輸入cmd
# 1.刪除Ruby自帶的源
$ gem sources --remove https://rubygems.org/
# 2. 新增Ruby China源,使用 -a,不要使用-add,否則出錯!
$ gem sources --a https://gems.ruby-china.org/
# 3.檢視現有的源,確保只有 gems.ruby-china.org
$ gem sources -l
# 4.安裝redis依賴
gem install redis
# 1.刪除Ruby自帶的源
C:\Users\acer>gem sources --remove https://rubygems.org/
https://rubygems.org/ removed from sources
# 2. 新增Ruby China源,使用 -a,不要使用-add,否則出錯
C:\Users\acer>gem sources --add https://gems.ruby-china.org/
Error fetching https://gems.ruby-china.org/:
SSL_connect returned=1 errno=0 state=error: certificate verify failed (https://gems.ruby-china.org/specs.4.8.gz)
C:\Users\acer>gem sources -a http://gems.ruby-china.org/
http://gems.ruby-china.org/ added to sources
# 3.檢視現有的源,確保只有 gems.ruby-china.org
C:\Users\acer>gem sources -l
*** CURRENT SOURCES ***
http://gems.ruby-china.org/
# 4.安裝redis依賴
C:\Users\acer>gem install redis
Fetching: redis-4.0.1.gem (100%)
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 7 seconds
1 gem installed
2. 叢集準備
(2)因為最少需要六個節點,建立6個資料夾分別被Redis-x64-3.2.20000-Redis-x64-3.2.20005,在每個資料夾放一份之前下載好的Redis。
注:請忽略dump.rdb檔案,你解壓後應該是沒有dump.rdb檔案的,因為我執行過Redis才有此檔案!
(3)在每個資料夾下面建立配置檔案 redis.conf,修改對應的埠即可,最少選項的叢集配置檔案示例為Redis-x64-3.2.20000資料夾:
port 20000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
配置中引數的介紹:
cluster-enabled :選項用於開例項的叢集模式,
cluster-conf-file : 選項則設定了儲存節點配置檔案的路徑, 預設值為nodes.conf(啟動時候自動生成) 。
nodes.conf : 節點配置檔案無須人為修改, 它由 Redis 叢集在啟動時建立, 並在有需要時自動進行更新。
appendonly :用於開啟AOF模式
(4)建立啟動指令碼startRedisClusterServer.bat
好處就是點選就可以啟動,不用這樣不用總是敲命令啟動 每個資料夾下面都放一份!
@echo off
redis-server.exe redis.conf
@pause
注:請忽略dump.rdb檔案,你解壓後應該是沒有dump.rdb檔案的,因為我執行過Redis才有此檔案!
(5)其他準備
1. redis-trib.rb檔案準備, redis-trib.rb是redis官方推出的管理redis叢集的工具,整合在redis的原始碼src目錄下,是基於redis提供的叢集命令封裝成簡單、便捷、實用的操作工具。下載地址
2. 在準備啟動指令碼start20000.cmd,其他20001~20005同理!
@echo off
cd Redis-x64-3.2.20000
startRedisClusterServer.bat
- 在準備一個啟動建立叢集的指令碼createCluster.bat
@echo
redis-trib.rb create --replicas 1 127.0.0.1:20000 127.0.0.1:20001 127.0.0.1:20002 127.0.0.1:20003 127.0.0.1:20004 127.0.0.1:20005
@pause
最終的目錄:
3. 建立叢集過程
一臺機器中進行搭建,跟在多臺真機上搭建其實沒有什麼區別,只要保證網路通訊ok就可以了!
本次搭建一個偽叢集。在一個伺服器上建立多個redis例項。埠號如下所示
主節點:127.0.0.1:20000 127.0.0.1:20001 127.0.0.1:20002
從節點:127.0.0.1:20003 127.0.0.1:20004 127.0.0.1:20005
(1)執行 start20000.cmd- start20005.cmd指令碼啟動六個redis例項
(2)執行createCluster.bat指令碼
redis-trib.rb
create, 這表示我們希望建立一個新的叢集。
選項 --replicas 1 表示我們希望為叢集中的每個主節點建立一個從節點。
之後跟著的其他引數則是例項的地址列表, 我們希望程式使用這些地址所指示的例項來建立新叢集。
執行情況如下:
F:\nosql_learn\Redis-Cluster>redis-trib.rb create --replicas 1 127.0.0.1:20000 127.0.0.1:20001 127.0.0.1:20002 127.0.0.1:20003 127.0.0.1:20004 127.0.0.1:20005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:20000
127.0.0.1:20001
127.0.0.1:20002
Adding replica 127.0.0.1:20003 to 127.0.0.1:20000
Adding replica 127.0.0.1:20004 to 127.0.0.1:20001
Adding replica 127.0.0.1:20005 to 127.0.0.1:20002
M: 1cd9cbd1ef5fa546b915f2ac72be05f6135ebfaf 127.0.0.1:20000
slots:0-5460 (5461 slots) master
M: 9ed55c7c6037a2222976120dacd1b272369e834e 127.0.0.1:20001
slots:5461-10922 (5462 slots) master
M: 9d68da9eddd4b80b0cb828d598d07088adfc9c04 127.0.0.1:20002
slots:10923-16383 (5461 slots) master
S: a4d586a792c9b7fe8588a3aa632e3d79c7f3a1bd 127.0.0.1:20003
replicates 1cd9cbd1ef5fa546b915f2ac72be05f6135ebfaf
S: 5929158572305fa0cc21d52003a8a5545965d248 127.0.0.1:20004
replicates 9ed55c7c6037a2222976120dacd1b272369e834e
S: 4a3cc7e822a86527beb48333d89f1f1b03336a89 127.0.0.1:20005
replicates 9d68da9eddd4b80b0cb828d598d07088adfc9c04
Can I set the above configuration? (type 'yes' to accept): yes
校驗和後分別儲存這三臺機上。沒問題就輸入 yes!
預設是前三個節點 20000 20001 20002 是主, 後3個節點 20003 20004 20005 是從。
例如 127.0.0.1:20000 這臺機 slots:0-5460 的意思是:
對key 做 CRC16 校驗和後 值在 0-5460範圍內都會存到這臺機器裡
例如 key=288 對應的CRC16校驗和 為 4258,應該存在20000這臺機裡!
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 127.0.0.1:20000)
M: 1cd9cbd1ef5fa546b915f2ac72be05f6135ebfaf 127.0.0.1:20000
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 9d68da9eddd4b80b0cb828d598d07088adfc9c04 127.0.0.1:20002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 4a3cc7e822a86527beb48333d89f1f1b03336a89 127.0.0.1:20005
slots: (0 slots) slave
replicates 9d68da9eddd4b80b0cb828d598d07088adfc9c04
M: 9ed55c7c6037a2222976120dacd1b272369e834e 127.0.0.1:20001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 5929158572305fa0cc21d52003a8a5545965d248 127.0.0.1:20004
slots: (0 slots) slave
replicates 9ed55c7c6037a2222976120dacd1b272369e834e
S: a4d586a792c9b7fe8588a3aa632e3d79c7f3a1bd 127.0.0.1:20003
slots: (0 slots) slave
replicates 1cd9cbd1ef5fa546b915f2ac72be05f6135ebfaf
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
簡單來說, 以上命令的意思就是讓 redis-trib 程式建立一個包含三個主節點和三個從節點的叢集。
看一下node.conf, 裡面記錄了master 和 slave的對應關係!
9d68da9eddd4b80b0cb828d598d07088adfc9c04 127.0.0.1:20002 master - 0 1520005171624 3 connected 10923-16383
4a3cc7e822a86527beb48333d89f1f1b03336a89 127.0.0.1:20005 slave 9d68da9eddd4b80b0cb828d598d07088adfc9c04 0 1520005173128 6 connected
9ed55c7c6037a2222976120dacd1b272369e834e 127.0.0.1:20001 master - 0 1520005170963 2 connected 5461-10922
1cd9cbd1ef5fa546b915f2ac72be05f6135ebfaf 127.0.0.1:20000 myself,master - 0 0 1 connected 0-5460
5929158572305fa0cc21d52003a8a5545965d248 127.0.0.1:20004 slave 9ed55c7c6037a2222976120dacd1b272369e834e 0 1520005172919 5 connected
a4d586a792c9b7fe8588a3aa632e3d79c7f3a1bd 127.0.0.1:20003 slave 1cd9cbd1ef5fa546b915f2ac72be05f6135ebfaf 0 1520005172723 4 connected
vars currentEpoch 6 lastVoteEpoch 0
每個例項會一直使用同一個 ID , 從而在叢集中保持一個獨一無二(unique)的名字。
每個節點都使用 ID 而不是 IP 或者埠號來記錄其他節點, 因為 IP 地址和埠號都可能會改變, 而這個獨一無二的識別符號(identifier)則會在節點的整個生命週期中一直保持不變。
我們將這個識別符號稱為節點ID。
到此我們的Redis叢集建立成功了!
假如對當前叢集不滿意需要重新配置,那麼
如果需要重新分配,則將所有節點停止後,將以下幾個檔案刪除:
appendonly.aof dump.rdb nodes.conf
刪除後再重新執行redis-trib.rb create命令新增組成叢集。
假如在當前叢集情況下,需要增刪節點,那麼參考這篇文章:
Redis叢集客戶端使用
連線叢集的命令
redis-cli -c -h 127.0.0.1 -p 20000
-c : 代表叢集
-h 主機IP -p : 埠
F:\nosql_learn\Redis-Cluster\Redis-x64-3.2.20000>redis-cli -c -p 20000
127.0.0.1:20000>
127.0.0.1:20000> get hello
(nil)
127.0.0.1:20000> set hello
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:20000> set hello world
OK
127.0.0.1:20000>
F:\nosql_learn\Redis-Cluster\Redis-x64-3.2.20000> redis-cli -c -p 20005
127.0.0.1:20005> get hello
-> Redirected to slot [866] located at 127.0.0.1:20000
"world"
127.0.0.1:20000> ^C
F:\nosql_learn\Redis-Cluster\Redis-x64-3.2.20000>redis-cli -c -p 20005
127.0.0.1:20005> set name dufy
-> Redirected to slot [5798] located at 127.0.0.1:20001
OK
127.0.0.1:20001>
參考博文
附件
如果想直接使用本篇講解使用的主從配置!我已經打包好了 點選 下載地址 進行下載!
本系列文章:
如果您覺得這篇博文對你有幫助,請點個贊,謝謝!
如果帥氣(美麗)、睿智(聰穎),和我一樣簡單善良的你看到本篇博文中存在問題,請指出,我虛心接受你讓我成長的批評,謝謝閱讀!
祝你今天開心愉快!