Redis集群是Redis分布式解決方案,解決了單機中心化的問題
一、理論基礎(chǔ)
主要包括2部分:節(jié)點主從、哈希Slot(槽)
節(jié)點主從:
1、master可由有多個slaver,slaver可以有自己的slaver,主從關(guān)系手動指定,當master下線后slaver會自動升為master;
2、讀寫分離,master負責寫以及數(shù)據(jù)同步給slaver,slaver負責讀,slaver擴容提高讀效率;
3、slaver獲取master數(shù)據(jù)后壓入磁盤,再load進內(nèi)存,client端從內(nèi)存中讀取數(shù)據(jù),當增加一個slaver,會主動通知master,master將全量數(shù)據(jù)發(fā)送給slaver,數(shù)據(jù)量大將影響性能;
優(yōu)點:讀寫分離,增加slaver提交讀的并發(fā)能力;
缺點:master寫是瓶頸;
hash slot
1、對象保存前先進行CRC16哈希到指定slot(節(jié)點);
2、每個節(jié)點分配一個slot段,slot不能缺失也不能重復(fù);
3、node之間相互監(jiān)聽,一旦有node退出或加入,會按照slot為單位做數(shù)據(jù)遷移;
優(yōu)點:每個node互相監(jiān)聽,高并發(fā)數(shù)據(jù)寫入、讀出,任務(wù)繁重;
優(yōu)點:將寫操作分攤到了多個節(jié)點,提高寫并發(fā),擴容簡單;
節(jié)點主從 && 哈希slot
1、主從和hash相互彌補優(yōu)缺點;
2、先hash分邏輯節(jié)點,每個節(jié)點內(nèi)部主從;
3、擴展并發(fā)讀添加slaver,擴展并發(fā)寫添加master;
二、集群搭建
集群操作:
//集群(cluster)?
CLUSTER INFO 打印集群的信息?
CLUSTER NODES 列出集群當前已知的所有節(jié)點(node),以及這些節(jié)點的相關(guān)信息。??
//節(jié)點(node)?
CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節(jié)點添加到集群當中,讓它成為集群的一份子。?
CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節(jié)點。?
CLUSTER REPLICATE <node_id> 將當前節(jié)點設(shè)置為 node_id 指定的節(jié)點的從節(jié)點。?
CLUSTER SAVECONFIG 將節(jié)點的配置文件保存到硬盤里面。??
//槽(slot)?
CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節(jié)點。?
CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節(jié)點的指派。?
CLUSTER FLUSHSLOTS 移除指派給當前節(jié)點的所有槽,讓當前節(jié)點變成一個沒有指派任何槽的節(jié)點。?
CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節(jié)點,如果槽已經(jīng)指派給另一個節(jié)點,那么先讓另一個節(jié)點刪除該槽>,然后再進行指派。?
CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節(jié)點的槽 slot 遷移到 node_id 指定的節(jié)點中。?
CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節(jié)點中導(dǎo)入槽 slot 到本節(jié)點。?
CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的導(dǎo)入(import)或者遷移(migrate)。??
//鍵 (key)?
CLUSTER KEYSLOT <key> 計算鍵 key 應(yīng)該被放置在哪個槽上。?
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數(shù)量。?
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。
1、安裝redis鏡像
yimaoqian@yimaoqian ~ docker pull redis
2、修改配置文件
下載redishttp://download.redis.io/releases/,解壓后得到redis.conf,添加或修改如下配置:
bind 0.0.0.0
daemonize no
requirepass 123456
masterauth 123456
cluster-enabled?yes
cluster-config-file?nodes-6379.conf
cluster-node-timeout 15000
3、運行redis集群
使用6個redis節(jié)點,3主3從
docker run --privileged=true --name redis1 --net redis-net -p 6001:6379 -v $PWD/6001/conf/redis.conf:/data/config/redis.conf -v $PWD/6001/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes
docker run --privileged=true --name redis2 --net redis-net -p 6002:6379 -v $PWD/6002/conf/redis.conf:/data/config/redis.conf -v $PWD/6002/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes
docker run --privileged=true --name redis3 --net redis-net -p 6003:6379 -v $PWD/6003/conf/redis.conf:/data/config/redis.conf -v $PWD/6003/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes
docker run --privileged=true --name redis4 --net redis-net -p 6004:6379 -v $PWD/6004/conf/redis.conf:/data/config/redis.conf -v $PWD/6004/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes
docker run --privileged=true --name redis5 --net redis-net -p 6005:6379 -v $PWD/6005/conf/redis.conf:/data/config/redis.conf -v $PWD/6005/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes
docker run --privileged=true --name redis6 --net redis-net -p 6006:6379 -v $PWD/6006/conf/redis.conf:/data/config/redis.conf -v $PWD/6006/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes
4、查看容器狀態(tài)
yimaoqian@yimaoqian ~ docker ps
CONTAINER ID? ? ? ? IMAGE? ? ? ? ? ? ? ? COMMAND? ? ? ? ? ? ? ? ? CREATED? ? ? ? ? ? STATUS? ? ? ? ? ? ? ? PORTS? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES
264773dfc76a? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6006->6379/tcp? ? ? ? ? ? ? redis6
cf017727c5e1? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6005->6379/tcp? ? ? ? ? ? ? redis5
ab6041e6e5c2? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6004->6379/tcp? ? ? ? ? ? ? redis4
8faeccf80150? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6003->6379/tcp? ? ? ? ? ? ? redis3
bdb2a392c8c9? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 3 hours? ? ? ? ? ? 0.0.0.0:6002->6379/tcp? ? ? ? ? ? ? redis2
a986b0a1a4d8? ? ? ? redis:latest? ? ? ? "docker-entrypoint.s…"? 3 hours ago? ? ? ? Up 37 minutes? ? ? ? ? 0.0.0.0:6001->6379/tcp? ? ? ? ? ? ? redis1
5、運行redis集群容器
查看容器IP:
yimaoqian@yimaoqian ~/wutong/specialGroup/redis docker inspect redis1 redis2 redis3 redis4 redis5 redis6|grep IPA
? ? ? ? ? ? "SecondaryIPAddresses": null,
? ? ? ? ? ? "IPAddress": "",
? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,
? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.2",
? ? ? ? ? ? "SecondaryIPAddresses": null,
? ? ? ? ? ? "IPAddress": "",
? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,
? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.3",
? ? ? ? ? ? "SecondaryIPAddresses": null,
? ? ? ? ? ? "IPAddress": "",
? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,
? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.4",
? ? ? ? ? ? "SecondaryIPAddresses": null,
? ? ? ? ? ? "IPAddress": "",
? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,
? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.5",
? ? ? ? ? ? "SecondaryIPAddresses": null,
? ? ? ? ? ? "IPAddress": "",
? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,
? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.6",
? ? ? ? ? ? "SecondaryIPAddresses": null,
? ? ? ? ? ? "IPAddress": "",
? ? ? ? ? ? ? ? ? ? "IPAMConfig": null,
? ? ? ? ? ? ? ? ? ? "IPAddress": "172.20.0.7",
集群感知:
localhost:6001> CLUSTER MEET 172.20.0.3 6379
OK
localhost:6001> CLUSTER MEET 172.20.0.4 6379
OK
localhost:6001> CLUSTER MEET 172.20.0.5 6379
OK
localhost:6001> CLUSTER MEET 172.20.0.6 6379
OK
localhost:6001> CLUSTER MEET 172.20.0.7 6379
OK
localhost:6001> cluster nodes
a4cfac29113a66a278c37268d2ca49fb62873e93 172.20.0.7:6379@16379 master - 0 1572328475000 5 connected
e3316f5cdc75a7e7ea259c3b9a00dee4dc6afb4c 172.20.0.5:6379@16379 master - 0 1572328476000 3 connected
8a5363c38e406227ffcc89080edd4b84d0d22ba4 172.20.0.2:6379@16379 myself,master - 0 1572328474000 1 connected
a179d778c65c3caeeaca5f095fb4a1380453a07a 172.20.0.4:6379@16379 master - 0 1572328476510 2 connected
fdddf383f8bf53447926e5efb80a7405ec85294d 172.20.0.3:6379@16379 master - 0 1572328474495 0 connected
383bd17b9a8c3a64f664637dd7cdb764a17324b8 172.20.0.6:6379@16379 master - 0 1572328475000 4 connected
分配slot:
查看槽信息
localhost:6001>?CLUSTER INFO
cluster_state:fail
cluster_slots_assigned:0?# 被分配槽的個數(shù)為0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:2
cluster_stats_messages_ping_sent:260418
cluster_stats_messages_pong_sent:260087
cluster_stats_messages_meet_sent:10
cluster_stats_messages_sent:520515
cluster_stats_messages_ping_received:260086
cluster_stats_messages_pong_received:260328
cluster_stats_messages_meet_received:1
cluster_stats_messages_received:520415
分配槽位:
#!/bin/bash
# node1 localhost:6001? 172.20.0.2
n=0
for ((i=n;i<=5461;i++))
do
? /usr/local/bin/redis-cli -h localhost -p 6001 -a 123456? CLUSTER ADDSLOTS $i
done
# node2 localhost:6002? ? 172.20.0.3
n=5462
for ((i=n;i<=10922;i++))
do
? /usr/local/bin/redis-cli -h localhost -p 6002 -a 123456 CLUSTER ADDSLOTS $i
done
# node3 localhost:6003? ? 172.20.0.4
n=10923
for ((i=n;i<=16383;i++))
do
? /usr/local/bin/redis-cli -h localhost -p 6003 -a 123456 CLUSTER ADDSLOTS $i
done
6、高可用
添加從節(jié)點:
#!/bin/bash
/usr/local/bin/redis-cli -h localhost -p 6004 -a 123456 CLUSTER REPLICATE 8a5363c38e406227ffcc89080edd4b84d0d22ba4
/usr/local/bin/redis-cli -h localhost -p 6005 -a 123456 CLUSTER REPLICATE fdddf383f8bf53447926e5efb80a7405ec85294d
/usr/local/bin/redis-cli -h localhost -p 6006 -a 123456 CLUSTER REPLICATE a179d778c65c3caeeaca5f095fb4a1380453a07a
1、備用節(jié)點不允許分配槽位;
2、在當前節(jié)點操作,將當前節(jié)點添加為node_id的副本節(jié)點;
3、從節(jié)點需要運行在cluster模式下,先添加到集群,再做復(fù)制;
查看節(jié)點信息:3主3從高可用
ocalhost:6004> cluster nodes
a4cfac29113a66a278c37268d2ca49fb62873e93 172.20.0.7:6379@16379 slave a179d778c65c3caeeaca5f095fb4a1380453a07a 0 1572332713422 5 connected
a179d778c65c3caeeaca5f095fb4a1380453a07a 172.20.0.4:6379@16379 master - 0 1572332714428 2 connected 10923-16383
fdddf383f8bf53447926e5efb80a7405ec85294d 172.20.0.3:6379@16379 master - 0 1572332712417 0 connected 5462-10922
383bd17b9a8c3a64f664637dd7cdb764a17324b8 172.20.0.6:6379@16379 slave fdddf383f8bf53447926e5efb80a7405ec85294d 0 1572332713000 4 connected
e3316f5cdc75a7e7ea259c3b9a00dee4dc6afb4c 172.20.0.5:6379@16379 myself,master - 0 1572332712000 6 connected 0-5461
8a5363c38e406227ffcc89080edd4b84d0d22ba4 172.20.0.2:6379@16379 slave e3316f5cdc75a7e7ea259c3b9a00dee4dc6afb4c 0 1572332712000 6 connected