1.集群


2.环境

Redis的集群搭建最少需要3个master节点
master节点进行读写操作,slave节点作为备用节点

机器

节点

yzm1

192.168.192.128 6391(主) 192.168.192.128 6392(从)

yzm2

192.168.192.129 6393(主) 192.168.192.129 6394(从)

yzm3

192.168.192.130 6395(主) 192.168.192.130 6396(从)

3.配置redis.conf

vim conf/redis-6391.conf
------------------------------编辑内容----------------------------------
#端口
port 6391

#绑定IP
bind 192.168.192.128

#关闭保护模式,允许外部访问
protected-mode yes

#授权密码
requirepass 3Q3Q

#守护进程,即后台启动
daemonize yes

#进程ID,默认/var/run/redis.pid
pidfile /var/run/redis-6391.pid

#日志
loglevel notice
logfile "/usr/local/redis/redis-6.2.4/logs/log-6391.log"

#数据文件
dir /usr/local/redis/redis-6.2.4/db/
dbfilename dump-6391.rdb

#数据同步
save 900 1
save 300 10
save 60 10000

#作为slave时,连接master的密码
masterauth "3Q3Q"

#集群
#启动集群
cluster-enabled yes
#集群节点信息文件
cluster-config-file nodes_6391.conf
#集群节点离线的超时时间
cluster-node-timeout 15000
yzm1 新增 6391、6392

redis cluster 升级 redis cluster sentinel_redis cluster 升级


redis cluster 升级 redis cluster sentinel_spring boot_02

yzm2 新增 6393、6394

redis cluster 升级 redis cluster sentinel_redis_03


redis cluster 升级 redis cluster sentinel_redis cluster 升级_04

yzm3 新增 6395、6396

redis cluster 升级 redis cluster sentinel_Redis_05


redis cluster 升级 redis cluster sentinel_redis cluster 升级_06

4.启动redis实例

./bin/redis-server ./conf/redis-6391.conf
 ./bin/redis-server ./conf/redis-6392.conf
 ps -ef|grep redis

redis cluster 升级 redis cluster sentinel_客户端_07


redis cluster 升级 redis cluster sentinel_redis cluster 升级_08


redis cluster 升级 redis cluster sentinel_Redis_09

5.创建集群

./bin/redis-cli -a 3Q3Q --cluster-replicas 1 --cluster create 192.168.192.128:6391 192.168.192.128:6392 192.168.192.129:6393 192.168.192.129:6394 192.168.192.130:6395 192.168.192.130:6396
其中, -a 3Q3Q 表示密码 –cluster-replicas 1 表示每个master下挂载1个slave(2,则表示挂载2个slave)

redis cluster 升级 redis cluster sentinel_客户端_10

登录集群

 ./bin/redis-cli -c -h 192.168.192.128 -p 6391 -a 3Q3Q

 -c 表示集群登录

 cluster info 查看集群信息

 cluster nodes 查看节点信息

redis cluster 升级 redis cluster sentinel_redis_11

存取数据

redis cluster 升级 redis cluster sentinel_redis_12

可以看到集群存值是不固定,根据算法来确定存储

 槽位定位算法:HASH_SLOT = CRC16(key) % 16384

 Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。



跳转重定位 :


当客户端向一个节点发出了指令,首先当前节点会计算指令的 key 得到槽位信息,判断计算的槽位是否归当前节点所管理;若槽位不归当前节点管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有 key 将使用新的槽位映射表。

其中slave节点不会提供服务,只是作为对应master节点的一个备份。 当master挂了后,slave自动升级为master

redis cluster 升级 redis cluster sentinel_redis_13


关闭master=6395


redis cluster 升级 redis cluster sentinel_spring boot_14


redis cluster 升级 redis cluster sentinel_客户端_15


6395显示fail,6392升级为master


重新启动6395后,挂载在6392下面


redis cluster 升级 redis cluster sentinel_客户端_16


redis cluster 升级 redis cluster sentinel_redis cluster 升级_17

6.新增节点

yzm3 新增 6397、6398 cp conf/redis-6396.conf conf/redis-6397.conf 批量替换 :%s/6396/6397/g

redis cluster 升级 redis cluster sentinel_Redis_18


redis cluster 升级 redis cluster sentinel_Redis_19

启动 6397、6398

redis cluster 升级 redis cluster sentinel_Redis_20

6397加入集群 ./bin/redis-cli -a 3Q3Q --cluster add-node 192.168.192.130:6397 192.168.192.128:6391 其中192.168.192.128:6391 可以是集群中的任意一个

redis cluster 升级 redis cluster sentinel_redis_21


查看集群节点,可以看到6397已经加入了集群


redis cluster 升级 redis cluster sentinel_Redis_22


6398也加入集群(另一种加入集群方式)


cluster meet 192.168.192.130 6398


redis cluster 升级 redis cluster sentinel_redis cluster 升级_23


刚加入的6397、6398都是master节点,现将6398作为salve挂载在6397下

./bin/redis-cli -c -a 3Q3Q -h 192.168.192.130 -p 6398 cluster replicate a9a021f109bb368cfed7cdefc6412e540f7ec198
其中 a9a021f109bb368cfed7cdefc6412e540f7ec198 是 6397的ID,通过cluster nodes 可以查看

redis cluster 升级 redis cluster sentinel_客户端_24


redis cluster 升级 redis cluster sentinel_客户端_25


也可以用6398先登录集群


./bin/redis-cli -c -a 3Q3Q -h 192.168.192.130 -p 6398


再执行挂载命令


cluster replicate 746ccd3c686768f8b2247584096aa06446c199e5

7.分配slots

集群中的 哈希曹 是固定的,共16383。由master节点持有。
新添加的节点是没有哈希曹的,所以并不能正常存储数据,需要给新添加的节点分配哈希曹。

给6397分配slots哈希曹 ./bin/redis-cli -a 3Q3Q --cluster reshard 192.168.192.130:6397 其中, reshard 重新分片 192.168.8.130:6397 集群中的任意一个节点

redis cluster 升级 redis cluster sentinel_spring boot_26

#打算分配多少槽位(1~16384),这里选择1000
How many slots do you want to move (from 1 to 16384)? 1000
#1000槽位分配给谁?指定ID即可,这里是6397的ID
What is the receiving node ID? a9a021f109bb368cfed7cdefc6412e540f7ec198
#有两种获取槽位的方式:
#1.all从所有master平均获取
#2.从指定ID获取,这里是从6391获取
#最后都是以done结束
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: c2a1dd1d0ff40f7bbd89098b8af65f2b7c2aa547(或者输入all)
Source node #2: done
查看分片后的哈希槽

redis cluster 升级 redis cluster sentinel_客户端_27

8.删除节点

顺序:
清除master节点slots-- > 删除slave节点 --> 删除master节点

redis cluster 升级 redis cluster sentinel_redis_28


redis cluster 升级 redis cluster sentinel_客户端_29

./bin/redis-cli -a 3Q3Q --cluster del-node 192.168.192.128:6391 f2a2d63df5f28ea35fdbfd22f4526f35e44ee534
del-node 移除节点
192.168.192.128:6391 集群中的任意一个节点
f2a2d63df5f28ea35fdbfd22f4526f35e44ee534 被移除的节点ID,这里是6398 slave节点

redis cluster 升级 redis cluster sentinel_Redis_30


redis cluster 升级 redis cluster sentinel_客户端_31


通过 forget 命令移除6397


cluster forget a9a021f109bb368cfed7cdefc6412e540f7ec198


redis cluster 升级 redis cluster sentinel_spring boot_32