Redis集群(一):集群搭建
2019獨角獸企業重金招聘Python工程師標準>>>
概述
這里只記錄操作步驟和集群測試,保證快速搭建集群環境。具體原理請查閱官方文檔(中文版):
http://www.redis.cn/topics/cluster-spec.html
集群容災:Redis集群(二):集群容災
準備工作
-
下載并編譯redis
-
創建6個以端口號為名字的目錄,7000~7005,修改redis.conf的端口號
-
修改配置:
#節點必須作為集群節點啟動,普通的Redis實例不能成為Redis集群的一部分。cluster-enabled yes
#每個集群節點都有一個集群配置文件,這個文件不需要手工編輯,它由Redis節點創建和更新。每個Redis集群節點都需要一個不同的集群配置文件,確保統一系統中運行的實例沒有重復的集群配置文件名。cluster-config-file nodes-6379.conf
#集群節點超時是指當一個節點超時達到指定的毫秒數時讓它處于失敗狀態。大多數其他內部時間限制是節點超時的倍數。cluster-node-timeout 15000
#以獨立日志的方式記錄每次寫命令,重啟時再重新執行AOF文件中的命令達到恢復數據的目的,一定要開啟
appendonly yes -
分別啟動這6個服務:src/redis-server redis.conf
安裝Ruby環境(5.0版本不再需要)
sudo?apt-get?install?ruby安裝ruby的redis接口:
sudo?gem?install?redis如果不安裝,后面執行腳本會報錯:
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>'
啟動集群
進入到redis的src目錄下,執行命令:
5.0版本:
redis要求集群至少有3個節點,這里為了方便,只啟動了3個節點,沒有為每個節點做一個從節點,所以--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?, 這表示我們希望創建一個新的集群。
-
選項?--replicas?1?表示我們希望為集群中的每個主節點創建一個從節點。
-
之后跟著的其他參數則是實例的地址列表, 我們希望程序使用這些地址所指示的實例來創建新集群。
查看集群目前狀況
#-c:連接集群結點時使用,此選項可防止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查看節點基本信息:
127.0.0.1:7002> cluster nodes 返回信息: 節點id 節點IP 端口 主從 負責的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測試存值取值
注意:使用redic-cli命令連接時,必須加上-c參數,表示以集群的方式連接,這樣在操作數據時會自動跳轉到數據所在的節點。否則會收到類似提示:(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節點到集群
-
按照Redis集群一的方式,創建端口為7003的新實例,并啟動該實例
-
將7003添加到集群:
第二個參數127.0.0.1:7000為當前集群已存在的節點,這里只要是該集群中的任意一個可用節點都可以,不要求必須是第一個。
新節點不能有數據,否則會報錯:[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。一般是直接復制正在使用的redis目錄導致的,使用redis-cli連接該服務,然后依次執行flushall和cluster reset命令。
查看操作后的節點信息:
./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節點的connected后面沒有Hash槽(slot),新加入的加點是一個主節點, 當集群需要將某個從節點升級為新的主節點時, 這個新節點不會被選中,也不會參與選舉。
-
給新節點分配哈希槽:
-
查看操作結果:
????可以看到返回的集群信息中,7003擁有了0-999哈希槽,而7000變成了1000-5460
添加Slave節點到集群
-
按照Redis集群一的方式,創建端口為7004的新實例,并啟動該實例
-
將7004添加到集群:
由于沒有指定master節點,所以redis會自動分配master節點,這里把7000作為7004的master。
注意:add-node命令后面的127.0.0.1:7000并不是指7000作為新節點的master。
-
也可以添加時指定master節點:
--cluster-master-id為master節點的 id
-
更改master節點為7002:
刪除一個Slave節點
#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.刪除一個Master節點
刪除master節點之前首先要使用reshard移除master的全部slot,然后再刪除當前節點(目前只能把被刪除master的slot遷移到一個節點上)
./redis-cli --cluster reshard 127.0.0.1:7000 #根據提示選擇要遷移的slot數量(7003上有1000個slot全部轉移) 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重新分配, #或者數據要提取slot的master節點id,最后用done結束 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 #打印被移動的slot后,輸入yes開始移動slot以及對應的數據. #Do?you?want?to?proceed?with?the?proposed?reshard?plan?(yes/no)??yes #結束#刪除空master節點 ./redis-cli --cluster del-node 127.0.0.1:7000?'a70d7fff6d6dde511cb7cb632a347be82dd34643'故障測試
?啟動一個集群,其中7004節點是7003節點的從節點:
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節點
127.0.0.1:7002> set hello world -> Redirected to slot [866] located at 127.0.0.1:7003 OK讓7003節點崩潰:
./redis-cli -p 7003 debug segfault Error: Server closed the connection查看節點狀態,發現7003狀態為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",被轉發到7004
127.0.0.1:7000> get hello -> Redirected to slot [866] located at 127.0.0.1:7004 "world"重新啟動7003,發現7003自動加入集群,并變成了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",被轉發到master節點7004
127.0.0.1:7002> get hello -> Redirected to slot [866] located at 127.0.0.1:7004 "world"將7003和7004都下線,然后再獲取"hello",報錯提示集群已下線
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啟動7003,報錯,原因是7003下線時是7004的從節點,啟動后默認去主節點同步數據。
Connecting to MASTER 127.0.0.1:7004 MASTER <-> REPLICA sync started Error condition on socket for SYNC: Connection refused啟動7004,獲取"hello",恢復正常
127.0.0.1:7002> get hello -> Redirected to slot [866] located at 127.0.0.1:7004 "world"集群故障修復
現在有7000~7003共4個節點的集群,其中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關閉7003之后,在集群做任何存取值操作都會報錯:(error) CLUSTERDOWN The cluster is down。原因是0~999 sloat在7003上,Redis認為slot不完整,所以報錯。
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執行fix命令,提示無法連接,因為7003已經被關閉了[Facepalm]
./redis-cli --cluster fix 127.0.0.1:7003 Could not connect to Redis at 127.0.0.1:7003: Connection refused重新開啟7003恢復正常。
轉載于:https://my.oschina.net/tongyufu/blog/406829
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Redis集群(一):集群搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取iOS 设备上崩溃日志 (Crash
- 下一篇: mysql 批量更新和批量插入