目標:在linux一台機器上安裝redis,並部署6節點集群
1.下載redis,安裝redis
cd /data/redis-server
wget http://download.
redis.io/releases/redis-4.0.1.tar.gz
tar -zxvf redis-4.0.1.tar.gz
cd redis-4.0.1
make && make install
|
若無redis-server目錄,mkdir redis-server
2.創建redis節點
在redis-4.0.1目錄下 創建目錄
mkdir redis_cluste
cd redis_cluste
|
在redis_cluste目錄中創建6個節點目錄
mkdir 7000 7001 7002 7003 7004 7005
|
退出到redis-4.0.1目錄下,將redis.conf配置文件拷貝到各節點目錄下
cp redis.conf redis_cluster/7000
cp redis.conf redis_cluster/7001
cp redis.conf redis_cluster/7002
cp redis.conf redis_cluster/7003
cp redis.conf redis_cluster/7004
cp redis.conf redis_cluster/7005
|
對應修改各節點下的redis.conf文件如下:
port:7000 //對應相應節點的端口號
//默認情況下,redis 在 server 上所有有效的網絡接口上監聽客戶端連接。
//你如果只想讓它在一個網絡接口上監聽,那你就綁定一個IP或者多個IP,此處綁定本機ip。
bind:127.0.0.1
//默認情況下 redis 不是作為守護進程運行的,如果你想讓它在后台運行,你就把它改成 yes。
//當redis作為守護進程運行的時候,它會寫一個 pid 到 /var/run/redis_700x.pid 文件里面。
daemonize yes
//根據對應節點的端口號,自定義作為守護線程后台運行的redis的pid文件存儲位置
pidfile /var/run/redis_7000.pid
cluster-config-file nodes-7000.conf //集群配置
cluster-node-timeout 5000 //請求超時時間
appendonly yes //aof日志開啟,會在每次寫數據時,記錄日志
//dir 設置的是節點的文件存放目錄 存放文件:appendonly.aof dump.rdb nodes-7000.conf redis.conf
dir /data/redis-server/redis-4.0.1/redis_cluster/7000/
3.啟動集群中的各個節點
進入redis-4.0.1/src目錄下分別執行以下命令,啟動各個節點
./redis-server ../redis_cluster/7000/redis.conf
./redis-server ../redis_cluster/7001/redis.conf
./redis-server ../redis_cluster/7002/redis.conf
./redis-server ../redis_cluster/7003/redis.conf
./redis-server ../redis_cluster/7004/redis.conf
./redis-server ../redis_cluster/7005/redis.conf
|
啟動后 ps -ef|grep redis 查看各節點啟動情況
root 2542 1 0 13:59 ? 00:00:00 ./redis-server 127.0.0.1:7000 [cluster]
root 2707 1 0 14:00 ? 00:00:00 ./redis-server 127.0.0.1:7001 [cluster]
root 2750 1 0 14:00 ? 00:00:00 ./redis-server 127.0.0.1:7002 [cluster]
root 2794 1 0 14:01 ? 00:00:00 ./redis-server 127.0.0.1:7003 [cluster]
root 2861 1 0 14:01 ? 00:00:00 ./redis-server 127.0.0.1:7004 [cluster]
root 3343 1 0 14:01 ? 00:00:00 ./redis-server 127.0.0.1:7005 [cluster]
root 3570 1326 0 14:01 pts/2 00:00:00 grep --color=auto redis
|
4.創建集群
參考redis官方集群教程(
http://www.redis.cn/topics/cluster-tutorial.html)
進入/data/redis-server/redis-4.0.1/src目錄下,執行以下腳本構建集群
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
PS前面的的步驟都如此順滑,以至於想象着要大功告成了,但萬萬沒想到,噩夢才剛剛開始,當去執行這個腳本的時候出錯了,報的錯誤信息,大致是找不到ruby,於是參考網上資料,原來是需要先安裝ruby。於是,按照攻略用如下腳本執行安裝
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
|
在執行第二步的時候完美出錯。
[root@localhost Redis]# gem install redis-4.0.0.gem
ERROR: Error installing redis-4.0.0.gem:
redis requires Ruby version >= 2.2.2.
錯誤信息顯示本地ruby版本低於最低要求版本。於是我決定卸載本地的1.8版本的ruby,重裝一個高版本的
yum -y remove ruby
|
以上命令卸載本地ruby后,接下來通過下方命令獲取一個高版本的ruby安裝
wget https://cache.
ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz
|
然后這一步果斷失敗了,ruby的默認源簡直慢到爆炸,於是在網上找了個ruby-2.4.1.tar.gz的包,通過ftp上傳到/data/ruby/目錄下
執行下面的命令編譯安裝
tar xzvf ruby-2.4.1.tar.gz
cd ruby-2.4.1
./configure
make
make install
|
這個過程也是異常的慢,而且,還失敗了。好了,現在低版本的ruby也沒了,高版本的也沒安上
於是,在去網上需求方案,得到的思路是通過安裝ruby的管理工具rvm來安裝ruby 於是,執行以下命令
curl -L
get.rvm.io | bash -s stable
|
依然報錯,錯誤信息大致是簽名失效之類的,按照錯誤信息里的提示改用以下命令執行
curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
|
依然報錯,到這里已經折騰許久了,而且參考網上經驗,都是到這一步往下就順滑了,可我卡在這里走不下去了,什么鬼。沒辦法又去在網上找了一通,依舊沒有找到類似的情況。鬼使神差的我又執行了遍 curl -L
get.rvm.io | bash -s stable ,居然成功了。此刻我仿佛看到了勝利的曙光。
安裝rvm成功后,執行
find / -name
rvm.sh
source /etc/profile.d/rvm.sh
|
其中find命令查找
rvm.sh腳本的文件位置。 然后source 此文件位置,讓rvm配置生效
rvm -v
//查看rvm版本,驗證rvm安裝成功 顯示 rvm 1.29.3 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [
https://rvm.io]
接下來,開始暢想着通過rvm來安裝ruby,然后redis集群就可以起飛了,於是我歡快的敲下如下命令
rvm install 2.3.3
|
//此刻是北京時間晚上9點,下載包總大小23M,下載速度穩定在6~7,單位kb,預計時間一個小時。然后我想着等到十點吧,就下完了。想象總是美好的,當下到一半的時候,已經耗時半個多點了,這當然不是最重要的,最重要的是,連接超時,下載失敗了,重新下載。幾經折騰。也去找了國內的下載源。各種問題替換不了下載源。最后晚上在家,下載安裝成功,此刻曙光終於來臨
ruby -v
|
查看ruby版本 顯示ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
gem -v
|
查看gem版本 顯示 2.6.14
如果此處高版本ruby安裝不成功,考慮以下兩種方案
1.因為上述的以下的兩個命令安裝的ruby版本,應該是支持reids3.0版本的。所以可以降低redis版本到3.0
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
2.redis集群文檔里提供了一個快速開啟集群的簡單腳本方法,即在redis-4.0.1/utils/create-cluster 目錄下有一個簡單的處理腳本create-cluster,可以快速的開啟三主三從的集群
開啟方式如下
create-cluster start
create-cluster create
此處期間,會列出集群配置,回復yes確定,而如果想要關閉集群,執行
create-cluster stop
//正常情況,我們已經安裝好了ruby和gem,接下來切入主題,進入/data/redis-server/redis-4.0.1/src/
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
|
出現如下提示
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: c9eb555f3940e3357fed95e408acc831f075c5ea 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: bd22616bb1e8dcb87118849f58786b80dddfa64b 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: 18a51268926237775f2bbdfd1dd659f8354e506f 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
S: 589fc4792a5e7702dbdcd5ed3b636989d6fc849e 127.0.0.1:7003
replicates c9eb555f3940e3357fed95e408acc831f075c5ea
S: d4155a184e1d4acee1bade09fbed3d8e6819ca9a 127.0.0.1:7004
replicates bd22616bb1e8dcb87118849f58786b80dddfa64b
S: 99d139a77b3393fd4432c545a2d6cc8898ef01a7 127.0.0.1:7005
replicates 18a51268926237775f2bbdfd1dd659f8354e506f
Can I set the above configuration? (type 'yes' to accept):
|
此為腳本給出主從配置,回復yes 確認配置
從這個list里可以得到如下信息 7000節點為主節點,擁有5461個槽,槽位從0-5460,其從節點為7003
7000的節點id為c9eb555f3940e3357fed95e408acc831f075c5ea
7003replicates c9eb555f3940e3357fed95e408acc831f075c5ea即7003是7000的從節點
其他節點與此類似
此刻,我們在查看下相應的7000文件夾下的nodes-7000.conf集群節點配置文件
d4155a184e1d4acee1bade09fbed3d8e6819ca9a 127.0.0.1:7004@17004 slave bd22616bb1e8dcb87118849f58786b80dddfa64b 0 1511417184031 5 connected
99d139a77b3393fd4432c545a2d6cc8898ef01a7 127.0.0.1:7005@17005 slave 18a51268926237775f2bbdfd1dd659f8354e506f 0 1511417185032 6 connected
c9eb555f3940e3357fed95e408acc831f075c5ea 127.0.0.1:7000@17000 myself,master - 0 1511417183000 1 connected 0-5460
bd22616bb1e8dcb87118849f58786b80dddfa64b 127.0.0.1:7001@17001 master - 0 1511417183530 2 connected 5461-10922
589fc4792a5e7702dbdcd5ed3b636989d6fc849e 127.0.0.1:7003@17003 slave c9eb555f3940e3357fed95e408acc831f075c5ea 0 1511417184031 4 connected
18a51268926237775f2bbdfd1dd659f8354e506f 127.0.0.1:7002@17002 master - 0 1511417183029 3 connected 10923-16383
vars currentEpoch 6 lastVoteEpoch 0
|
此配置文件依然是顯示集群內的主從關系,最后兩個變量 currentEpoch表示當前集群內節點數量,lastVoteEpoch與主節點掛掉,而從節點投票選舉新的主節點相關。
5.測試集群
執行以下命令進入7000節點
[i
nput4hua@node
/data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7000
127.0.0.1:7000> keys *
(empty list or set)
127.0.0.1:7000> set hello redis
OK
127.0.0.1:7000> keys *
1) "hello"
127.0.0.1:7000> get hello
"redis"
127.0.0.1:7000> exit
[i
nput4hua@node
/data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7002
127.0.0.1:7002> keys *
(empty list or set)
127.0.0.1:7002> exit
[i
nput4hua@node
/data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7003
127.0.0.1:7003> keys *
1) "hello"
127.0.0.1:7003> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"redis"
127.0.0.1:7000> exit
[i
nput4hua@node
/data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7002
127.0.0.1:7002> set hello bli
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
127.0.0.1:7000> keys *
1) "hello"
|
//分析以上現象 ,hello作為key值按照redis內部算法特定的存放到了7000節點的866槽位上,並且其從節點7003對hello這個key可見,在7003上獲取get hello,跳轉到其主節點7000上獲取數據
用以下命令來關閉相應節點 模擬主節點掛掉
redis-cli -h 127.0.0.1 -c -p 7000 shutdown
|
[i
nput4hua@node
/data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7003
127.0.0.1:7003> keys *
1) "hello"
127.0.0.1:7003> get hello
"bli"
127.0.0.1:7003> cluster nodes
18a51268926237775f2bbdfd1dd659f8354e506f 127.0.0.1:7002@17002 master - 0 1511429474504 3 connected 10923-16383
bd22616bb1e8dcb87118849f58786b80dddfa64b 127.0.0.1:7001@17001 master - 0 1511429474103 2 connected 5461-10922
99d139a77b3393fd4432c545a2d6cc8898ef01a7 127.0.0.1:7005@17005 slave 18a51268926237775f2bbdfd1dd659f8354e506f 0 1511429473000 6 connected
d4155a184e1d4acee1bade09fbed3d8e6819ca9a 127.0.0.1:7004@17004 slave bd22616bb1e8dcb87118849f58786b80dddfa64b 0 1511429474000 5 connected
589fc4792a5e7702dbdcd5ed3b636989d6fc849e 127.0.0.1:7003@17003 myself,master - 0 1511429473000 7 connected 0-5460
c9eb555f3940e3357fed95e408acc831f075c5ea 127.0.0.1:7000@17000 master,fail - 1511429376707 1511429375000 1 disconnected
127.0.0.1:7003>
127.0.0.1:7003> set we nb
-> Redirected to slot [11725] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set hello redis
-> Redirected to slot [866] located at 127.0.0.1:7003
OK
|
//以上可以看到7003依舊能查詢和寫入數據,並且 通過命令cluster nodes查看集群情況,此時7003已躍居成為主節點,而7000顯示失敗
//為了恢復7000節點,在root用戶權限下恢復7000節點
[input4hua@node /data/redis-server/redis-4.0.1/src]$ ./redis-server ../redis_cluster/7000/redis.conf
24828:C 23 Nov 17:33:08.209 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24828:C 23 Nov 17:33:08.209 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=24828, just started
24828:C 23 Nov 17:33:08.209 # Configuration loaded
root@node3:/data/redis-server/redis-4.0.1/src$redis-cli -h 127.0.0.1 -c -p 7000
127.0.0.1:7000> keys *
1) "hello"
127.0.0.1:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7003
"bli"
|
//看到7000節點此時已恢復,依然可以訪問到key數據,且數據讀取跳轉到主節點7003
127.0.0.1:7003> cluster nodes
18a51268926237775f2bbdfd1dd659f8354e506f 127.0.0.1:7002@17002 master - 0 1511430452706 3 connected 10923-16383
bd22616bb1e8dcb87118849f58786b80dddfa64b 127.0.0.1:7001@17001 master - 0 1511430451503 2 connected 5461-10922
99d139a77b3393fd4432c545a2d6cc8898ef01a7 127.0.0.1:7005@17005 slave 18a51268926237775f2bbdfd1dd659f8354e506f 0 1511430452000 6 connected
d4155a184e1d4acee1bade09fbed3d8e6819ca9a 127.0.0.1:7004@17004 slave bd22616bb1e8dcb87118849f58786b80dddfa64b 0 1511430451703 5 connected
589fc4792a5e7702dbdcd5ed3b636989d6fc849e 127.0.0.1:7003@17003 myself,master - 0 1511430451000 7 connected 0-5460
c9eb555f3940e3357fed95e408acc831f075c5ea 127.0.0.1:7000@17000 slave 589fc4792a5e7702dbdcd5ed3b636989d6fc849e 0 1511430451503 7 connected
127.0.0.1:7003>
|
//查看集群節點信息,7000已恢復成為7003的從節點
//刪除測試數據
127.0.0.1:7000> keys *
1) "hello"
127.0.0.1:7000> del hello
-> Redirected to slot [866] located at 127.0.0.1:7003
(integer) 1
127.0.0.1:7003> keys *
(empty list or set)
127.0.0.1:7003> exit
127.0.0.1:7000> keys *
(empty list or set)
|
//上面7000節點已經沒有數據了,此時在7000節點下 get we ,而we存放在7002節點下,槽位11725,此處也說明在redis集群下任意節點都可以得到集群下的所有數據,如下所示:
127.0.0.1:7000> get we
-> Redirected to slot [11725] located at 127.0.0.1:7002
"nb"
127.0.0.1:7002>
|