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
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
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 集群
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:
# 构建集群 cluster-replicas集群中每个主节点下的从节点个数
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
# 移动slot块,host:port接收slot块的机器,--cluster-from + 节点id --cluster-to + 节点id --cluster-slots + 移动slot的个数
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
# 向集群内新增节点,默认为master节点,可以设置--cluster-slave和--cluster-master-id + master节点id 设置为某个master的从节点
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
#节点信息
#408ea1f10e9ebf9f3a73476b2665d10f3a5b9f63 192.168.127.101:9001@19001 slave 6e87ff294285323ddd93e2efbca612293b784f52 0 1653238473477 3 connected
#d1ddf38af632537f6d39fce455bbd593d13c12ad 192.168.127.101:8004@18004 master - 0 1653238473073 7 connected
#c3d36ae04031340b86c767998632d0fdecfc19c8 192.168.127.101:9002@19002 slave 8bb4c6f2de60d75837a0763aa6b3f6ee33ea349d 0 1653238473980 1 connected
#abe75cb0770fca55dfc2fd5a308f9636f62ba907 192.168.127.101:8002@18002 master - 0 1653238473000 2 connected 5461-10922
#d70d692a366a93f501ff991442866529d87f380e 192.168.127.101:9003@19003 slave abe75cb0770fca55dfc2fd5a308f9636f62ba907 0 1653238473000 2 connected
#8bb4c6f2de60d75837a0763aa6b3f6ee33ea349d 192.168.127.101:8001@18001 myself,master - 0 1653238473000 1 connected 0-5460
#6e87ff294285323ddd93e2efbca612293b784f52 192.168.127.101:8003@18003 master - 0 1653238474484 3 connected 10923-16383
#分配0-3000 slot块
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
#408ea1f10e9ebf9f3a73476b2665d10f3a5b9f63 192.168.127.101:9001@19001 slave 6e87ff294285323ddd93e2efbca612293b784f52 0 1653238578316 3 connected
#d1ddf38af632537f6d39fce455bbd593d13c12ad 192.168.127.101:8004@18004 master - 0 1653238580333 7 connected 0-2999
#c3d36ae04031340b86c767998632d0fdecfc19c8 192.168.127.101:9002@19002 slave 8bb4c6f2de60d75837a0763aa6b3f6ee33ea349d 0 1653238579324 1 connected
#abe75cb0770fca55dfc2fd5a308f9636f62ba907 192.168.127.101:8002@18002 master - 0 1653238579828 2 connected 5461-10922
#d70d692a366a93f501ff991442866529d87f380e 192.168.127.101:9003@19003 slave abe75cb0770fca55dfc2fd5a308f9636f62ba907 0 1653238580000 2 connected
#8bb4c6f2de60d75837a0763aa6b3f6ee33ea349d 192.168.127.101:8001@18001 myself,master - 0 1653238580000 1 connected 3000-5460
#6e87ff294285323ddd93e2efbca612293b784f52 192.168.127.101:8003@18003 master - 0 1653238579000 3 connected 10923-16383
测试节点:
练习:把新添加的master节点删除掉
# 1. 首先把待删除节点上的slot块进行移除
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
#408ea1f10e9ebf9f3a73476b2665d10f3a5b9f63 192.168.127.101:9001@19001 slave 6e87ff294285323ddd93e2efbca612293b784f52 0 1653238921020 3 connected
#d1ddf38af632537f6d39fce455bbd593d13c12ad 192.168.127.101:8004@18004 master - 0 1653238920013 7 connected
#c3d36ae04031340b86c767998632d0fdecfc19c8 192.168.127.101:9002@19002 slave 8bb4c6f2de60d75837a0763aa6b3f6ee33ea349d 0 1653238919509 8 connected
#abe75cb0770fca55dfc2fd5a308f9636f62ba907 192.168.127.101:8002@18002 master - 0 1653238920000 2 connected 5461-10922
#d70d692a366a93f501ff991442866529d87f380e 192.168.127.101:9003@19003 slave abe75cb0770fca55dfc2fd5a308f9636f62ba907 0 1653238920517 2 connected
#8bb4c6f2de60d75837a0763aa6b3f6ee33ea349d 192.168.127.101:8001@18001 myself,master - 0 1653238918000 8 connected 0-5460
#6e87ff294285323ddd93e2efbca612293b784f52 192.168.127.101:8003@18003 master - 0 1653238920517 3 connected 10923-16383
#删除节点
redis-cli --cluster del-node 192.168.127.101:8004 d1ddf38af632537f6d39fce455bbd593d13c12ad
测试:
4. 故障转移
#在slave节点上执行此命令。会把slave变为 master节点
CLUSTER FAILOVER [FORCE|TAKEOVER]
Promote current replica node to being a master
参数说明:
- 缺省。默认会按照下图的顺序进行执行
- FORCE。会省去和master节点offset比对和同步的过程
- TAKEOVER。直接接管,直接成为master,向集群进行广播。
执行流程: