Redis集群(一):集群搭建
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
概述
這里只記錄操作步驟和集群測(cè)試,保證快速搭建集群環(huán)境。具體原理請(qǐng)查閱官方文檔(中文版):
http://www.redis.cn/topics/cluster-spec.html
集群容災(zāi):Redis集群(二):集群容災(zāi)
準(zhǔn)備工作
-
下載并編譯redis
-
創(chuàng)建6個(gè)以端口號(hào)為名字的目錄,7000~7005,修改redis.conf的端口號(hào)
-
修改配置:
#節(jié)點(diǎn)必須作為集群節(jié)點(diǎn)啟動(dòng),普通的Redis實(shí)例不能成為Redis集群的一部分。cluster-enabled yes
#每個(gè)集群節(jié)點(diǎn)都有一個(gè)集群配置文件,這個(gè)文件不需要手工編輯,它由Redis節(jié)點(diǎn)創(chuàng)建和更新。每個(gè)Redis集群節(jié)點(diǎn)都需要一個(gè)不同的集群配置文件,確保統(tǒng)一系統(tǒng)中運(yùn)行的實(shí)例沒有重復(fù)的集群配置文件名。cluster-config-file nodes-6379.conf
#集群節(jié)點(diǎn)超時(shí)是指當(dāng)一個(gè)節(jié)點(diǎn)超時(shí)達(dá)到指定的毫秒數(shù)時(shí)讓它處于失敗狀態(tài)。大多數(shù)其他內(nèi)部時(shí)間限制是節(jié)點(diǎn)超時(shí)的倍數(shù)。cluster-node-timeout 15000
#以獨(dú)立日志的方式記錄每次寫命令,重啟時(shí)再重新執(zhí)行AOF文件中的命令達(dá)到恢復(fù)數(shù)據(jù)的目的,一定要開啟
appendonly yes -
分別啟動(dòng)這6個(gè)服務(wù):src/redis-server redis.conf
安裝Ruby環(huán)境(5.0版本不再需要)
sudo?apt-get?install?ruby安裝ruby的redis接口:
sudo?gem?install?redis如果不安裝,后面執(zhí)行腳本會(huì)報(bào)錯(cuò):
custom_require.rb:36:in `require': cannot load such file -- redis (LoadError)
from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from ./redis-trib.rb:25:in `<main>'
啟動(dòng)集群
進(jìn)入到redis的src目錄下,執(zhí)行命令:
5.0版本:
redis要求集群至少有3個(gè)節(jié)點(diǎn),這里為了方便,只啟動(dòng)了3個(gè)節(jié)點(diǎn),沒有為每個(gè)節(jié)點(diǎn)做一個(gè)從節(jié)點(diǎn),所以--cluster-replicas為0
./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 0 命令返回信息: >>> Performing hash slots allocation on 3 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 M: 3bcdfbed858bbdd92dd760632b9cb4c649947fed 127.0.0.1:7000slots:[0-5460] (5461 slots) master M: 2a8f29e22ec38f56e062f588e5941da24a2bafa0 127.0.0.1:7001slots:[5461-10922] (5462 slots) master M: 9b022d79cf860c87dc2190cdffc55b282dd60e42 127.0.0.1:7002slots:[10923-16383] (5461 slots) master Can I set the above configuration? (type 'yes' to accept):輸入yes接受redis的上述配置,然后返回信息: >>> 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:7000) M: 3bcdfbed858bbdd92dd760632b9cb4c649947fed 127.0.0.1:7000slots:[0-5460] (5461 slots) master M: 9b022d79cf860c87dc2190cdffc55b282dd60e42 127.0.0.1:7002slots:[10923-16383] (5461 slots) master M: 2a8f29e22ec38f56e062f588e5941da24a2bafa0 127.0.0.1:7001slots:[5461-10922] (5462 slots) master [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.5.0之前的版本:
./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命令的意義如下:
-
給定?redis-trib.rb?程序的命令是?create?, 這表示我們希望創(chuàng)建一個(gè)新的集群。
-
選項(xiàng)?--replicas?1?表示我們希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)。
-
之后跟著的其他參數(shù)則是實(shí)例的地址列表, 我們希望程序使用這些地址所指示的實(shí)例來創(chuàng)建新集群。
查看集群目前狀況
#-c:連接集群結(jié)點(diǎn)時(shí)使用,此選項(xiàng)可防止moved和ask異常。 $?redis-cli?-c?-p?7000 127.0.0.1:7000>?cluster?info 返回信息: cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:3 cluster_size:3 cluster_current_epoch:3 cluster_my_epoch:1 cluster_stats_messages_ping_sent:774 cluster_stats_messages_pong_sent:762 cluster_stats_messages_sent:1536 cluster_stats_messages_ping_received:760 cluster_stats_messages_pong_received:774 cluster_stats_messages_meet_received:2 cluster_stats_messages_received:1536查看節(jié)點(diǎn)基本信息:
127.0.0.1:7002> cluster nodes 返回信息: 節(jié)點(diǎn)id 節(jié)點(diǎn)IP 端口 主從 負(fù)責(zé)的Hash槽 2a8f29e22ec38f56e062f588e5941da24a2bafa0 127.0.0.1:7001@17001 master - 0 1542785512690 2 connected 5461-10922 3bcdfbed858bbdd92dd760632b9cb4c649947fed 127.0.0.1:7000@17000 master - 0 1542785511654 1 connected 0-5460 9b022d79cf860c87dc2190cdffc55b282dd60e42 127.0.0.1:7002@17002 myself,master - 0 1542785510000 3 connected 10923-16383測(cè)試存值取值
注意:使用redic-cli命令連接時(shí),必須加上-c參數(shù),表示以集群的方式連接,這樣在操作數(shù)據(jù)時(shí)會(huì)自動(dòng)跳轉(zhuǎn)到數(shù)據(jù)所在的節(jié)點(diǎn)。否則會(huì)收到類似提示:(error) MOVED 12182 127.0.0.1:7002。
127.0.0.1:7000> set foo bar -> Redirected to slot [12182] located at 127.0.0.1:7002 OK127.0.0.1:7002> set hello world -> Redirected to slot [866] located at 127.0.0.1:7000 OK127.0.0.1:7000> get foo -> Redirected to slot [12182] located at 127.0.0.1:7002 "bar"127.0.0.1:7000> get hello -> Redirected to slot [866] located at 127.0.0.1:7000 "world"添加Master節(jié)點(diǎn)到集群
-
按照Redis集群一的方式,創(chuàng)建端口為7003的新實(shí)例,并啟動(dòng)該實(shí)例
-
將7003添加到集群:
第二個(gè)參數(shù)127.0.0.1:7000為當(dāng)前集群已存在的節(jié)點(diǎn),這里只要是該集群中的任意一個(gè)可用節(jié)點(diǎn)都可以,不要求必須是第一個(gè)。
新節(jié)點(diǎn)不能有數(shù)據(jù),否則會(huì)報(bào)錯(cuò):[ERR] Node 127.0.0.1:7003 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0。一般是直接復(fù)制正在使用的redis目錄導(dǎo)致的,使用redis-cli連接該服務(wù),然后依次執(zhí)行flushall和cluster reset命令。
查看操作后的節(jié)點(diǎn)信息:
./redis-cli -c -p 7003 127.0.0.1:7003> cluster nodes 返回信息: 2a8f29e22ec38f56e062f588e5941da24a2bafa0 127.0.0.1:7001@17001 master - 0 1542787865456 2 connected 5461-10922 a70d7fff6d6dde511cb7cb632a347be82dd34643 127.0.0.1:7003@17003 myself,slave 3bcdfbed858bbdd92dd760632b9cb4c649947fed 0 1542787863000 0 connected 9b022d79cf860c87dc2190cdffc55b282dd60e42 127.0.0.1:7002@17002 master - 0 1542787865000 3 connected 10923-16383 3bcdfbed858bbdd92dd760632b9cb4c649947fed 127.0.0.1:7000@17000 master - 0 1542787862000 1 connected 0-5460可以看到7003節(jié)點(diǎn)的connected后面沒有Hash槽(slot),新加入的加點(diǎn)是一個(gè)主節(jié)點(diǎn), 當(dāng)集群需要將某個(gè)從節(jié)點(diǎn)升級(jí)為新的主節(jié)點(diǎn)時(shí), 這個(gè)新節(jié)點(diǎn)不會(huì)被選中,也不會(huì)參與選舉。
-
給新節(jié)點(diǎn)分配哈希槽:
-
查看操作結(jié)果:
????可以看到返回的集群信息中,7003擁有了0-999哈希槽,而7000變成了1000-5460
添加Slave節(jié)點(diǎn)到集群
-
按照Redis集群一的方式,創(chuàng)建端口為7004的新實(shí)例,并啟動(dòng)該實(shí)例
-
將7004添加到集群:
由于沒有指定master節(jié)點(diǎn),所以redis會(huì)自動(dòng)分配master節(jié)點(diǎn),這里把7000作為7004的master。
注意:add-node命令后面的127.0.0.1:7000并不是指7000作為新節(jié)點(diǎn)的master。
-
也可以添加時(shí)指定master節(jié)點(diǎn):
--cluster-master-id為master節(jié)點(diǎn)的 id
-
更改master節(jié)點(diǎn)為7002:
刪除一個(gè)Slave節(jié)點(diǎn)
#redis-trib?del-node?ip:port?'<node-id>' #這里移除的是7004 ./redis-cli --cluster del-node 127.0.0.1:7000 74957282ffa94c828925c4f7026baac04a67e291 返回信息: >>> Removing node 74957282ffa94c828925c4f7026baac04a67e291 from cluster 127.0.0.1:7000 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.刪除一個(gè)Master節(jié)點(diǎn)
刪除master節(jié)點(diǎn)之前首先要使用reshard移除master的全部slot,然后再刪除當(dāng)前節(jié)點(diǎn)(目前只能把被刪除master的slot遷移到一個(gè)節(jié)點(diǎn)上)
./redis-cli --cluster reshard 127.0.0.1:7000 #根據(jù)提示選擇要遷移的slot數(shù)量(7003上有1000個(gè)slot全部轉(zhuǎn)移) How?many?slots?do?you?want?to?move?(from?1?to?16384)??1000 #選擇要接受這些slot的node-id What?is?the?receiving?node?ID??3bcdfbed858bbdd92dd760632b9cb4c649947fed #選擇slot來源: #all表示從所有的master重新分配, #或者數(shù)據(jù)要提取slot的master節(jié)點(diǎn)id,最后用done結(jié)束 Please?enter?all?the?source?node?IDs.Type?'all'?to?use?all?the?nodes?as?source?nodes?for?the?hash?slots.Type?'done'?once?you?entered?all?the?source?nodes?IDs. Source?node?#1:a70d7fff6d6dde511cb7cb632a347be82dd34643 Source?node?#2:done #打印被移動(dòng)的slot后,輸入yes開始移動(dòng)slot以及對(duì)應(yīng)的數(shù)據(jù). #Do?you?want?to?proceed?with?the?proposed?reshard?plan?(yes/no)??yes #結(jié)束#刪除空master節(jié)點(diǎn) ./redis-cli --cluster del-node 127.0.0.1:7000?'a70d7fff6d6dde511cb7cb632a347be82dd34643'故障測(cè)試
?啟動(dòng)一個(gè)集群,其中7004節(jié)點(diǎn)是7003節(jié)點(diǎn)的從節(jié)點(diǎn):
127.0.0.1:7003> cluster nodes ea4e0dcf8dbf6d4611659b5abbd6563926224f0f 127.0.0.1:7004@17004 slave e852e07181f20dd960407e5b08f7122870f67c89 0 1542793126295 4 connected 3bcdfbed858bbdd92dd760632b9cb4c649947fed 127.0.0.1:7000@17000 master - 0 1542793125260 1 connected 1000-5460 2a8f29e22ec38f56e062f588e5941da24a2bafa0 127.0.0.1:7001@17001 master - 0 1542793124000 2 connected 5461-10922 e852e07181f20dd960407e5b08f7122870f67c89 127.0.0.1:7003@17003 myself,master - 0 1542793124000 4 connected 0-999 9b022d79cf860c87dc2190cdffc55b282dd60e42 127.0.0.1:7002@17002 master - 0 1542793126000 3 connected 10923-16383在集群中添加了key:"hello",該key被放到了7003節(jié)點(diǎn)
127.0.0.1:7002> set hello world -> Redirected to slot [866] located at 127.0.0.1:7003 OK讓7003節(jié)點(diǎn)崩潰:
./redis-cli -p 7003 debug segfault Error: Server closed the connection查看節(jié)點(diǎn)狀態(tài),發(fā)現(xiàn)7003狀態(tài)為fail,7004被提升為master
127.0.0.1:7000> cluster nodes 9b022d79cf860c87dc2190cdffc55b282dd60e42 127.0.0.1:7002@17002 master - 0 1542793571000 3 connected 10923-16383 3bcdfbed858bbdd92dd760632b9cb4c649947fed 127.0.0.1:7000@17000 myself,master - 0 1542793570000 1 connected 1000-5460 2a8f29e22ec38f56e062f588e5941da24a2bafa0 127.0.0.1:7001@17001 master - 0 1542793571422 2 connected 5461-10922 ea4e0dcf8dbf6d4611659b5abbd6563926224f0f 127.0.0.1:7004@17004 master - 0 1542793572442 5 connected 0-999 e852e07181f20dd960407e5b08f7122870f67c89 127.0.0.1:7003@17003 master,fail - 1542793477237 1542793474000 4 disconnected從集群獲取"hello",被轉(zhuǎn)發(fā)到7004
127.0.0.1:7000> get hello -> Redirected to slot [866] located at 127.0.0.1:7004 "world"重新啟動(dòng)7003,發(fā)現(xiàn)7003自動(dòng)加入集群,并變成了slave
127.0.0.1:7004> cluster nodes ea4e0dcf8dbf6d4611659b5abbd6563926224f0f 127.0.0.1:7004@17004 myself,master - 0 1542793764000 5 connected 0-999 3bcdfbed858bbdd92dd760632b9cb4c649947fed 127.0.0.1:7000@17000 master - 0 1542793765000 1 connected 1000-5460 2a8f29e22ec38f56e062f588e5941da24a2bafa0 127.0.0.1:7001@17001 master - 0 1542793765560 2 connected 5461-10922 9b022d79cf860c87dc2190cdffc55b282dd60e42 127.0.0.1:7002@17002 master - 0 1542793764529 3 connected 10923-16383 e852e07181f20dd960407e5b08f7122870f67c89 127.0.0.1:7003@17003 slave ea4e0dcf8dbf6d4611659b5abbd6563926224f0f 0 1542793766585 5 connected獲取"hello",被轉(zhuǎn)發(fā)到master節(jié)點(diǎn)7004
127.0.0.1:7002> get hello -> Redirected to slot [866] located at 127.0.0.1:7004 "world"將7003和7004都下線,然后再獲取"hello",報(bào)錯(cuò)提示集群已下線
127.0.0.1:7000> cluster nodes 9b022d79cf860c87dc2190cdffc55b282dd60e42 127.0.0.1:7002@17002 master - 0 1542794095233 3 connected 10923-16383 3bcdfbed858bbdd92dd760632b9cb4c649947fed 127.0.0.1:7000@17000 myself,master - 0 1542794094000 1 connected 1000-5460 2a8f29e22ec38f56e062f588e5941da24a2bafa0 127.0.0.1:7001@17001 master - 0 1542794096261 2 connected 5461-10922 ea4e0dcf8dbf6d4611659b5abbd6563926224f0f 127.0.0.1:7004@17004 master,fail - 1542794075628 1542794074000 5 disconnected 0-999 e852e07181f20dd960407e5b08f7122870f67c89 127.0.0.1:7003@17003 slave,fail ea4e0dcf8dbf6d4611659b5abbd6563926224f0f 1542794070058 1542794067000 5 disconnected127.0.0.1:7000> get hello (error) CLUSTERDOWN The cluster is down啟動(dòng)7003,報(bào)錯(cuò),原因是7003下線時(shí)是7004的從節(jié)點(diǎn),啟動(dòng)后默認(rèn)去主節(jié)點(diǎn)同步數(shù)據(jù)。
Connecting to MASTER 127.0.0.1:7004 MASTER <-> REPLICA sync started Error condition on socket for SYNC: Connection refused啟動(dòng)7004,獲取"hello",恢復(fù)正常
127.0.0.1:7002> get hello -> Redirected to slot [866] located at 127.0.0.1:7004 "world"集群故障修復(fù)
現(xiàn)在有7000~7003共4個(gè)節(jié)點(diǎn)的集群,其中0~999slot在7003上,"set hello world"并被分配到7003。
127.0.0.1:7000> cluster nodes e852e07181f20dd960407e5b08f7122870f67c89 127.0.0.1:7003@17003 master - 0 1542852396911 6 connected 0-999 9b022d79cf860c87dc2190cdffc55b282dd60e42 127.0.0.1:7002@17002 master - 0 1542852395887 3 connected 10923-16383 2a8f29e22ec38f56e062f588e5941da24a2bafa0 127.0.0.1:7001@17001 master - 0 1542852394863 2 connected 5461-10922 3bcdfbed858bbdd92dd760632b9cb4c649947fed 127.0.0.1:7000@17000 myself,master - 0 1542852395000 1 connected 1000-5460關(guān)閉7003之后,在集群做任何存取值操作都會(huì)報(bào)錯(cuò):(error) CLUSTERDOWN The cluster is down。原因是0~999 sloat在7003上,Redis認(rèn)為slot不完整,所以報(bào)錯(cuò)。
127.0.0.1:7000> get hello (error) CLUSTERDOWN The cluster is down 127.0.0.1:7000> get foo (error) CLUSTERDOWN The cluster is down執(zhí)行fix命令,提示無法連接,因?yàn)?003已經(jīng)被關(guān)閉了[Facepalm]
./redis-cli --cluster fix 127.0.0.1:7003 Could not connect to Redis at 127.0.0.1:7003: Connection refused重新開啟7003恢復(fù)正常。
轉(zhuǎn)載于:https://my.oschina.net/tongyufu/blog/406829
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Redis集群(一):集群搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取iOS 设备上崩溃日志 (Crash
- 下一篇: mysql 批量更新和批量插入