模仿的過程中,加入自己的思考和理解,也會有進步和收獲。
在這個互聯網時代,在高並發和高流量可能隨時爆發的情況下,單機版的系統或者單機版的應用已經無法生存,越來越多的應用開始支持集群,支持分布式部署了。而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. 集群准備
(1)安裝文檔 Redis Cluster
(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)其他准備
- redis-trib.rb文件准備, redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源碼src目錄下,是基於redis提供的集群命令封裝成簡單、便捷、實用的操作工具。下載地址
- 在准備啟動腳本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>
參考博文
附件
如果想直接使用本篇講解使用的主從配置!我已經打包好了 點擊 下載地址 進行下載!
本系列文章:
第一篇:Redis集群主從復制(一主兩從)搭建配置教程【Windows環境】
第二篇:Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows環境】
**如果您覺得這篇博文對你有幫助,請點個贊,謝謝!** **如果帥氣(美麗)、睿智(聰穎),和我一樣簡單善良的你看到本篇博文中存在問題,請指出,我虛心接受你讓我成長的批評,謝謝閱讀!
祝你今天開心愉快!**
歡迎訪問我的csdn博客,我們一同成長!
"不管做什么,只要堅持下去就會看到不一樣!在路上,不卑不亢!"