Redis集群主備模式部署


網上有非常多用Ruby安裝Redis-cluster的文章。可是在實際環境下不想安裝Ruby,所以本文主要介紹了用Redis命令部署Redis集群。而且為集群中每個master實例添加一個slave實例。


0 編譯安裝

$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar xzvf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make all
$ make install # use sudo user.

也能夠去github下載最新代碼:https://github.com/antirez/redis.git


1 創建文件夾

$ mkdir 7000 7001 7002 7003

2 改動例如以下配置redis.conf

port 7000                               #7000改動為相應的700170027003
daemonize yes
cluster-enabled yes
cluster-config-file nodes-7000.conf     #7000改動為相應的700170027003
luster-node-timeout 15000

將改動好的配置文件放到對用的文件夾下:./7000, ./7001, ./7002, ./7003 。


3 啟動redis服務

$ cd 7000
$ redis-server ./redis.conf 
$ cd ../7001
$ redis-server ./redis.conf
$ cd ../7002
$ redis-server ./redis.conf
$ cd ../7003
$ redis-server ./redis.conf
$ # 檢查redis啟動情況
$ ps -ef | grep redis | grep -v grep
cjf        5834      1  0 16:33 ?        00:00:00 redis-server 127.0.0.1:7000 [cluster]
cjf        5839      1  0 16:34 ?

00:00:00 redis-server 127.0.0.1:7001 [cluster] cjf 5843 1 0 16:34 ? 00:00:00 redis-server 127.0.0.1:7002 [cluster] cjf 5847 1 0 16:34 ? 00:00:00 redis-server 127.0.0.1:7003 [cluster]


4 將redis實例添加到集群中

主要是通過用cluster meet <host> <port>給集群添加節點,例如以下:

$ redis-cli -p 7000
127.0.0.1:7000> cluster nodes
14d4071b97121e703e44bbc834f42d1b31c8ea95 :7000 myself,master - 0 0 0 connected
127.0.0.1:7000> cluster meet 127.0.0.1 7001
OK
127.0.0.1:7000> cluster meet 127.0.0.1 7002
OK
127.0.0.1:7000> cluster meet 127.0.0.1 7003
OK
127.0.0.1:7000> cluster nodes
75334aae3ced44cf0e8416691aeef8249e7a0621 127.0.0.1:7002 master - 0 1438850262990 0 connected
14d4071b97121e703e44bbc834f42d1b31c8ea95 127.0.0.1:7000 myself,master - 0 0 1 connected
8b721ff1ac2e383ffcbcf133d502c6957f8df713 127.0.0.1:7003 master - 0 1438850265007 0 connected
2875f2155e3214d7950dd5916f5ecf5edd3d9fee 127.0.0.1:7001 master - 0 1438850263998 2 connected
127.0.0.1:7000> 

假設cluster nodes出現上面的四行記錄就表示meet成功,標識myself的是client正在連接的redis實例。
能夠通過cluster forget清除集群中的某個實例。


5 分配slots

redis-cluster總共同擁有16384個槽位(0-16383),按例如以下方式改動槽位:

$ cat 7000/nodes-7000.conf #分配slots:0-4095(注意127.0.0.1:7000相應的行尾)
75334aae3ced44cf0e8416691aeef8249e7a0621 127.0.0.1:7002 master - 0 1438850266016 3 connected
14d4071b97121e703e44bbc834f42d1b31c8ea95 127.0.0.1:7000 myself,master - 0 0 1 connected 0-4095
8b721ff1ac2e383ffcbcf133d502c6957f8df713 127.0.0.1:7003 master - 0 1438850265007 0 connected
2875f2155e3214d7950dd5916f5ecf5edd3d9fee 127.0.0.1:7001 master - 0 1438850263998 2 connected
vars currentEpoch 3 lastVoteEpoch 0
$ 
$ cat 7001/nodes-7001.conf #分配slots:4096-8191(注意127.0.0.1:7001相應的行尾)
75334aae3ced44cf0e8416691aeef8249e7a0621 127.0.0.1:7002 master - 0 1438850265714 3 connected
2875f2155e3214d7950dd5916f5ecf5edd3d9fee 127.0.0.1:7001 myself,master - 0 0 2 connected 4096-8191
8b721ff1ac2e383ffcbcf133d502c6957f8df713 127.0.0.1:7003 master - 0 1438850264705 0 connected
14d4071b97121e703e44bbc834f42d1b31c8ea95 127.0.0.1:7000 master - 0 1438850263695 1 connected
vars currentEpoch 3 lastVoteEpoch 0
$ 
$ cat 7002/nodes-7002.conf #分配slots:8192-12287(注意127.0.0.1:7002相應的行尾)
2875f2155e3214d7950dd5916f5ecf5edd3d9fee 127.0.0.1:7001 master - 0 1438850262787 2 connected
14d4071b97121e703e44bbc834f42d1b31c8ea95 127.0.0.1:7000 master - 0 1438850263796 1 connected
75334aae3ced44cf0e8416691aeef8249e7a0621 127.0.0.1:7002 myself,master - 0 0 3 connected 8192-12287
8b721ff1ac2e383ffcbcf133d502c6957f8df713 127.0.0.1:7003 master - 0 1438850264806 0 connected
vars currentEpoch 3 lastVoteEpoch 0
$ 
$ cat 7003/nodes-7003.conf #分配slots:12288-16383(注意127.0.0.1:7003相應的行尾)
2875f2155e3214d7950dd5916f5ecf5edd3d9fee 127.0.0.1:7001 master - 0 1438850264808 2 connected
75334aae3ced44cf0e8416691aeef8249e7a0621 127.0.0.1:7002 master - 0 1438850265819 3 connected
14d4071b97121e703e44bbc834f42d1b31c8ea95 127.0.0.1:7000 master - 0 1438850263798 1 connected
8b721ff1ac2e383ffcbcf133d502c6957f8df713 127.0.0.1:7003 myself,master - 0 0 0 connected 12288-16383
vars currentEpoch 3 lastVoteEpoch 0
$ 

配置改動成功之后。又一次啟動redis:

$ # 停止redis
$ ps -ef|grep redis
cjf        5834      1  0 16:33 ?        00:00:00 redis-server 127.0.0.1:7000 [cluster]
cjf        5839      1  0 16:34 ?        00:00:00 redis-server 127.0.0.1:7001 [cluster]
cjf        5843      1  0 16:34 ?        00:00:00 redis-server 127.0.0.1:7002 [cluster]
cjf        5847      1  0 16:34 ?        00:00:00 redis-server 127.0.0.1:7003 [cluster]
cjf        5921   5252  0 16:46 pts/2    00:00:00 grep redis
$ kill 5834 5839 5843 5847
$ $ # 又一次啟動redis
$ cd 7000
$ redis-server ./redis.conf 
$ cd ../7001
$ redis-server ./redis.conf 
$ cd ../7002
$ redis-server ./redis.conf 
$ cd ../7003
$ redis-server ./redis.conf 
$ $ # 檢查分配的slots是否生效:
$ redis-cli -p 7000
127.0.0.1:7000> cluster nodes
8b721ff1ac2e383ffcbcf133d502c6957f8df713 127.0.0.1:7003 master - 0 1438850861230 0 connected 12288-16383
14d4071b97121e703e44bbc834f42d1b31c8ea95 127.0.0.1:7000 myself,master - 0 0 1 connected 0-4095
2875f2155e3214d7950dd5916f5ecf5edd3d9fee 127.0.0.1:7001 master - 0 1438850860221 2 connected 4096-8191
75334aae3ced44cf0e8416691aeef8249e7a0621 127.0.0.1:7002 master - 0 1438850859209 3 connected 8192-12287
127.0.0.1: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:4
cluster_size:4
cluster_current_epoch:3
cluster_my_epoch:1
cluster_stats_messages_sent:416
cluster_stats_messages_received:73
127.0.0.1:7000> 

當前情況下,redis-cluster部署完成。


6 給master節點配一個slave節點

在前面。我們配置好了redis的集群並分配了slots,集群已經可用了。集群中如今有4個master節點。全部寫入這個集群中的數據都會分片到這4個redis實例中。可是如今存在這樣一個問題:假設某個master節點掛掉的話,那么這個集群就不可用了,所以我們如今為集群中的4個master實例各啟一個slave實例做主備。

$ mkdir 8000 8001 8002 8003
$ cp 7000/redis.conf 8000
$ cp 7000/redis.conf 8001
$ cp 7000/redis.conf 8002
$ cp 7000/redis.conf 8003

redis.conf中以下兩個配置改動為相應的端口:

port 800X
cluster-config-file nodes-800X.conf

然后啟動這4個實例:

$ cd 8000/ 
$ redis-server ./redis.conf 
$ cd ../8001
$ redis-server ./redis.conf 
$ cd ../8002
$ redis-server ./redis.conf 
$ cd ../8003
$ redis-server ./redis.conf 
$ 
$ ps -ef|grep redis
cjf        5928      1  0 16:47 ?        00:00:02 redis-server 127.0.0.1:7000 [cluster]
cjf        5933      1  0 16:47 ?

00:00:02 redis-server 127.0.0.1:7001 [cluster] cjf 5937 1 0 16:47 ? 00:00:02 redis-server 127.0.0.1:7002 [cluster] cjf 5941 1 0 16:47 ?

00:00:02 redis-server 127.0.0.1:7003 [cluster] cjf 6136 1 0 17:20 ? 00:00:00 redis-server 127.0.0.1:8000 [cluster] cjf 6141 1 0 17:20 ? 00:00:00 redis-server 127.0.0.1:8001 [cluster] cjf 6145 1 0 17:21 ? 00:00:00 redis-server 127.0.0.1:8002 [cluster] cjf 6150 1 0 17:21 ? 00:00:00 redis-server 127.0.0.1:8003 [cluster] cjf 6157 5252 0 17:21 pts/2 00:00:00 grep redis [cjf@host1 8003]$

再將這4個redis實例cluster meet到集群中:

$ redis-cli -p 7000
127.0.0.1:7000> cluster nodes
8b721ff1ac2e383ffcbcf133d502c6957f8df713 127.0.0.1:7003 master - 0 1438852991236 0 connected 12288-16383
14d4071b97121e703e44bbc834f42d1b31c8ea95 127.0.0.1:7000 myself,master - 0 0 1 connected 0-4095
2875f2155e3214d7950dd5916f5ecf5edd3d9fee 127.0.0.1:7001 master - 0 1438852992245 2 connected 4096-8191
75334aae3ced44cf0e8416691aeef8249e7a0621 127.0.0.1:7002 master - 0 1438852993255 3 connected 8192-12287
127.0.0.1:7000> cluster meet 127.0.0.1 8000
OK
127.0.0.1:7000> cluster meet 127.0.0.1 8001
OK
127.0.0.1:7000> cluster meet 127.0.0.1 8002
OK
127.0.0.1:7000> cluster meet 127.0.0.1 8003
OK
127.0.0.1:7000> cluster nodes
79c41ed9454f686fe7c35e0a6c505732b951b226 127.0.0.1:8000 master - 0 1438853011586 4 connected
14d4071b97121e703e44bbc834f42d1b31c8ea95 127.0.0.1:7000 myself,master - 0 0 1 connected 0-4095
8b721ff1ac2e383ffcbcf133d502c6957f8df713 127.0.0.1:7003 master - 0 1438853014613 7 connected 12288-16383
833bb1d37b22b2055d2281a5f2dad3d869195f0d 127.0.0.1:8002 master - 0 1438853012596 6 connected
0d03ff5e90fa369c5c39c9415db39f711b943494 127.0.0.1:8001 master - 0 1438853013605 5 connected
75334aae3ced44cf0e8416691aeef8249e7a0621 127.0.0.1:7002 master - 0 1438853010578 3 connected 8192-12287
a34eb2aa56f309793d78ba2f69141be268a23659 127.0.0.1:8003 master - 0 1438853012092 0 connected
2875f2155e3214d7950dd5916f5ecf5edd3d9fee 127.0.0.1:7001 master - 0 1438853009564 2 connected 4096-8191
127.0.0.1:7000> 

最后用cluster replicate <nodeid>將8000、8001、8002、8003分別掛到7000、7001、7002、7003上:

$ redis-cli -p 8000
127.0.0.1:8000> cluster replicate 14d4071b97121e703e44bbc834f42d1b31c8ea95
OK
127.0.0.1:8000> 
$ redis-cli -p 8001
127.0.0.1:8001> cluster replicate 2875f2155e3214d7950dd5916f5ecf5edd3d9fee
OK
127.0.0.1:8001> 
$ redis-cli -p 8002
127.0.0.1:8002> cluster replicate 75334aae3ced44cf0e8416691aeef8249e7a0621
OK
127.0.0.1:8002> 
$ redis-cli -p 8003
127.0.0.1:8003> cluster replicate 8b721ff1ac2e383ffcbcf133d502c6957f8df713
OK
127.0.0.1:8003> cluster nodes
14d4071b97121e703e44bbc834f42d1b31c8ea95 127.0.0.1:7000 master - 0 1438853245955 1 connected 0-4095
8b721ff1ac2e383ffcbcf133d502c6957f8df713 127.0.0.1:7003 master - 0 1438853242927 7 connected 12288-16383
2875f2155e3214d7950dd5916f5ecf5edd3d9fee 127.0.0.1:7001 master - 0 1438853242423 2 connected 4096-8191
833bb1d37b22b2055d2281a5f2dad3d869195f0d 127.0.0.1:8002 slave 75334aae3ced44cf0e8416691aeef8249e7a0621 0 1438853245955 6 connected
a34eb2aa56f309793d78ba2f69141be268a23659 127.0.0.1:8003 myself,slave 8b721ff1ac2e383ffcbcf133d502c6957f8df713 0 0 0 connected
0d03ff5e90fa369c5c39c9415db39f711b943494 127.0.0.1:8001 slave 2875f2155e3214d7950dd5916f5ecf5edd3d9fee 0 1438853241925 5 connected
79c41ed9454f686fe7c35e0a6c505732b951b226 127.0.0.1:8000 slave 14d4071b97121e703e44bbc834f42d1b31c8ea95 0 1438853244945 4 connected
75334aae3ced44cf0e8416691aeef8249e7a0621 127.0.0.1:7002 master - 0 1438853243935 3 connected 8192-12287
127.0.0.1:8003> 

如上。配置成功。


附錄:經常使用的Redis-cluster命令

#### 集群(cluster)
CLUSTER INFO 打印集群的信息  
CLUSTER NODES 列出集群當前已知的全部節點(node)。以及這些節點的相關信息。  
#### 節點(node)
CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點加入到集群其中。讓它成為集群的一份子。  
CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節點。  
CLUSTER REPLICATE <node_id> 將當前節點設置為 node_id 指定的節點的從節點。  
CLUSTER SAVECONFIG 將節點的配置文件保存到硬盤里面。  
#### 槽(slot) 
CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。  
CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。  
CLUSTER FLUSHSLOTS 移除指派給當前節點的全部槽,讓當前節點變成一個沒有指派不論什么槽的節點。

CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,假設槽已經指派給還有一個節點。那么先讓還有一個節點刪除該槽>,然后再進行指派。

CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。

CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中導入槽 slot 到本節點。

CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的導入(import)或者遷移(migrate)。

#### 鍵(key) CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。

CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 眼下包括的鍵值對數量。 CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。


ref:http://www.cnblogs.com/tankaixiong/articles/4022646.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM