1 集群分片slot
1.槽位最大16384,建议最大节点1000以内
2.分片:Redis集群时我们会将存储的数据分散到多台redis机器上,则称为分片。
3.如何找到给定key分片:为了找到给定keyu分片,我们对key进行CRC16(KEY)算法处理并通过对总分片数量取模。然后使用确定性哈希函数,这意味着给定key将多此始终映射到同一个分片,我们可以推断将来读取特定key的位置。
4.slot槽位映射,一般业界有3种解决方案:
a哈希取余分区 缺点:每次扩容和缩容麻烦
b一致性哈希算法分区:
三步骤:1.算法=构建一致性哈希环;2.服务器ip节点映射;3.key落到服务器的落键规则。
优点:容错性,扩展性
缺点:容易数据倾斜
c哈希槽分区
为什么redis槽位是16384
1.心跳包,如果槽位是65536,这个ping的消息的消息头就太大了,浪费带宽。
16384/8/1024=2kb
65536/8/1024=8kb
2.redis的集群节点不可能超过1000
3.槽位越小,节点越少的情况下,压缩比高,容易传输
redis集群不保证强一致性,这意味着在特定的条件下,rendis集群可能会丢掉一些被系统收到的写入请求命令。
2案例
2.1. 3主3从的rendis集群配置
1.新建目录 mkdir -p/myreids/cluster
2.redisCluster6381.conf到redisCluster6386.conf
bind 0.0.0.0
daemonize yes
protected-mopde no
port 6381
logfile "/myredis/cluster/cluster6381.log"
pidfile "/myredis/cluster6381.pid"
dir /myredis/cluster
dbfilename dump6381.rdb
appendfilename "appendonly6381.aof"
requirepass 111111
masterauth 111111
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000
启动命令
redis server /maredis/cluster/redisCluster6381.conf
redis server /maredis/cluster/redisCluster6382.conf
redis server /maredis/cluster/redisCluster6383.conf
redis server /maredis/cluster/redisCluster6384.conf
redis server /maredis/cluster/redisCluster6385.conf
redis server /maredis/cluster/redisCluster6386.conf
启动集群
redis -cli -a 111111 -cluster create --cluster-replicas 1 192.168.111.185:6381 192.168.111.185:6382
192.168.111.182:6383 192.168.111.182:6384 192.168.111.184:6385 192.168.111.184:6386
查看集群
info replication
cluster nodes
cluster info
2. 2 3主3从集群读写
一定注意槽位的范围区间,需要路由到位。
集群连接
redis-cli -a 111111 -p 6381 -c
2.3 主从容错切换迁移案例
主从关系互换
在从主机上输入
cluster failover
2.4 主从扩容案例
配置redis新主机redisCluster6387.conf 和redisCluster6388.conf
bind 0.0.0.0
daemonize yes
protected-mopde no
port 6387
logfile "/myredis/cluster/cluster6387.log"
pidfile "/myredis/cluster6387.pid"
dir /myredis/cluster
dbfilename dump6387.rdb
appendfilename "appendonly6387.aof"
requirepass 111111
masterauth 111111
cluster-enabled yes
cluster-config-file nodes-6387.conf
cluster-node-timeout 5000
新节点加入集群
reids-cli -a 111111 --clister add-node 192.111.184:6387 192.168.111.185:6381
新加节点的IP和端口 引进节点的ip和端口
重新分配槽位
redis-cli -a 111111 --cluster reshard 192.168.111.185:6381
4096
6387的哈希地址
重写肥胖成本太高所以每一master拿出一点来分配
把6388挂给6387
redis-cli -a 111111 --cluster add-node 192.168.111.184:6388 192.168.111.184:6387 --cluster-slave -clustrer-master-id 6387的id值
检查是否成功
redis-cli -a 111111 --cluster check 192.168.111.185:63381
2.5 主从缩容案例
1.检查集群情况第一次,先获得从节点6388的节点ID
reids-cli -a 111111 --cluster check 192.168.111.184:6388 ID
2.从集群中将4号从节点6388删除
3.将63387的槽位号清空,重新分配
4.检查集群情况
redis-cli -a 111111 --cluster check 192.168.111.175:6381
5.将6387移除
redis-cli -a 111111 --cluster del-node 192.168.111.184:6387 ID
6.检查集群是否移除6387和6388
redis-cli -a 111111 --cluster check 192.168.111.175:6381
批量操作
mset k1{z} z1 k2{z} z2 k3{z} z3
集权是否完整才能对外提供服务 cluster-require-full-coverage
cluster countkeysinslot 槽位号 看槽位是否被占用
cluster keyslot 键名称=cluster keyslot k1