1. 分片集群搭建
ip port role
192.168.127.101 8001 master
192.168.127.101 8002 master
192.168.127.101 8003 master
192.168.127.101 9001 slave
192.168.127.101 9002 slave
192.168.127.101 9003 slave
配置文件Redis.conf
port 6379
cluster-enabled yes
cluster-config-file /tmp/6379/nodes.conf
cluster-node-timeout 5000
dir /tmp/6379
bind 0.0.0.0
daemonize yes
replica-announce-ip 192.168.150.101
protected-mode no
databases 1
logfile /tmp/6379/run.log
操作指令
mkdir 8001 8002 8003 9001 9002 9003
cp redis.conf 8001/
cp redis.conf 8002/
cp redis.conf 8003/
cp redis.conf 9001/
cp redis.conf 9002/
cp redis.conf 9003/
redis-server ./8001/redis.conf
redis-server ./8002/redis.conf
redis-server ./8003/redis.conf
redis-server ./9001/redis.conf
redis-server ./9002/redis.conf
redis-server ./9003/redis.conf\
redis-cli --cluster create --cluster-replicas 1 192.168.127.101:8001 192.168.127.101:8002 192.168.127.101:8003 192.168.127.101:9001 192.168.127.101:9002 192.168.127.101:9003
- redis-cli --cluster或者./redis-trib.rb:代表集群操作命令
- create:代表是创建集群
- –replicas 1或者–cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master
测试: 注意:集群操作时,需要给redis-cli加上-c参数才可以:
2. 散列插槽
在构建redis集群时,会生成16384(0-16383)个插槽(slot),这些插槽会被分成几部分存储在每个master节点上,每个master之间存储的slot块是不重复的。 当我们在集群中进行存取数据时,首先根据key中是否包含{ },如果包含{ },会把{}内的内容进行某种hash运算得到一个数值,然后在和16384进行取余,就会得到这个key所在的slot块。如果key中不包含{ },就会把整个key的值进行某种hash运算得到一个数值,然后进行和16384进行取余,得到所对应的slot块。
set a 100
get a
set num 200
get num
set {a}bc 100
get {a}bc
set {num}a 300
get {num}a
如果slot不在本台机器,redis会自动路由到对应slot块的机器上
3. 集群伸缩
由于分片集群中数据是和slot块进行绑定的,而不是和机器强相关的。我们只需操作slot块,就可以实现redis集群的伸缩。
redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 ... hostN:portN
--cluster-replicas <arg>
check host:port
--cluster-search-multiple-owners
info host:port
fix host:port
--cluster-search-multiple-owners
--cluster-fix-with-unreachable-masters
reshard host:port
--cluster-from <arg>
--cluster-to <arg>
--cluster-slots <arg>
--cluster-yes
--cluster-timeout <arg>
--cluster-pipeline <arg>
--cluster-replace
rebalance host:port
--cluster-weight <node1=w1...nodeN=wN>
--cluster-use-empty-masters
--cluster-timeout <arg>
--cluster-simulate
--cluster-pipeline <arg>
--cluster-threshold <arg>
--cluster-replace
add-node new_host:new_port existing_host:existing_port
--cluster-slave
--cluster-master-id <arg>
del-node host:port node_id
call host:port command arg arg .. arg
--cluster-only-masters
--cluster-only-replicas
set-timeout host:port milliseconds
import host:port
--cluster-from <arg>
--cluster-from-user <arg>
--cluster-from-pass <arg>
--cluster-from-askpass
--cluster-copy
--cluster-replace
backup host:port backup_directory
练习:向搭建的集群中新增一个master节点(192.168.127.101:8004),并且把0-3000的slot块分给这个master节点
mkdir 8004
cp redis.conf 8004/
vi 8004/redis.conf
redis-server 8004/redis.conf
redis-cli --cluster add-node 192.168.127.101:8004 192.168.127.101:8001
redis-cli -p 8001 cluster nodes
redis-cli --cluster reshard 192.168.127.101:8004 --cluster-from 8bb4c6f2de60d75837a0763aa6b3f6ee33ea349d --cluster-to d1ddf38af632537f6d39fce455bbd593d13c12ad --cluster-slots 3000 --cluster-yes
redis-cli -p 8001 cluster nodes
测试节点:
练习:把新添加的master节点删除掉
redis-cli --cluster reshard 192.168.127.101:8001 --cluster-from d1ddf38af632537f6d39fce455bbd593d13c12ad --cluster-to 8bb4c6f2de60d75837a0763aa6b3f6ee33ea349d --cluster-slots 3000 --cluster-yes
redis-cli -p 8001 cluster nodes
redis-cli --cluster del-node 192.168.127.101:8004 d1ddf38af632537f6d39fce455bbd593d13c12ad
测试:
4. 故障转移
CLUSTER FAILOVER [FORCE|TAKEOVER]
Promote current replica node to being a master
参数说明:
- 缺省。默认会按照下图的顺序进行执行
- FORCE。会省去和master节点offset比对和同步的过程
- TAKEOVER。直接接管,直接成为master,向集群进行广播。
执行流程:
|