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、6392yzm2 新增 6393、6394yzm3 新增 6395、6396
4.启动redis实例
./bin/redis-server ./conf/redis-6391.conf
./bin/redis-server ./conf/redis-6392.conf
ps -ef|grep redis
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)
登录集群
./bin/redis-cli -c -h 192.168.192.128 -p 6391 -a 3Q3Q
-c 表示集群登录
cluster info 查看集群信息
cluster nodes 查看节点信息
存取数据
可以看到集群存值是不固定,根据算法来确定存储
槽位定位算法:HASH_SLOT = CRC16(key) % 16384
Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。
跳转重定位 :
当客户端向一个节点发出了指令,首先当前节点会计算指令的 key 得到槽位信息,判断计算的槽位是否归当前节点所管理;若槽位不归当前节点管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有 key 将使用新的槽位映射表。
其中slave节点不会提供服务,只是作为对应master节点的一个备份。 当master挂了后,slave自动升级为master关闭master=6395
6395显示fail,6392升级为master
重新启动6395后,挂载在6392下面
6.新增节点
yzm3 新增 6397、6398 cp conf/redis-6396.conf conf/redis-6397.conf 批量替换 :%s/6396/6397/g启动 6397、63986397加入集群 ./bin/redis-cli -a 3Q3Q --cluster add-node 192.168.192.130:6397 192.168.192.128:6391 其中192.168.192.128:6391 可以是集群中的任意一个查看集群节点,可以看到6397已经加入了集群
6398也加入集群(另一种加入集群方式)
cluster meet 192.168.192.130 6398
刚加入的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 可以查看也可以用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 集群中的任意一个节点
#打算分配多少槽位(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
查看分片后的哈希槽
8.删除节点
顺序:清除master节点slots-- > 删除slave节点 --> 删除master节点
./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节点通过 forget 命令移除6397
cluster forget a9a021f109bb368cfed7cdefc6412e540f7ec198