因为每个master之间都会检测彼此的健康状态,并且客户端请求可以访问集群的任意节点,自动路由到正确的节点上,并且默认是读写分离的,写在master上,读在slaver上,则作用和哨兵模式一样,则分片集群时就不设置哨兵模式。
创建出7001,7002,7003,8001,8002,8003
- cd /tmp
- rm -rf 7001 7002 7003 8001 8002 8003
- mkdir 7001 7002 7003 8001 8002 8003
- port 6379
- #开启集群功能
- cluster-enable 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
- replic-announce-ip 192.168.99.100
- #保护模式
- protected-mode no
- #数据库数量1
- databases 1
- #日志
- logfile /tmp/6379/run.log
拷贝文件到每个目录
- cd /tmp
- echo 7001 7002 7003 8001 8002 8003 |xargs -t -n 1 cp redis.conf
修改每个目录下的redis.conf。将其中的6379修改为与所在目录一致
- cd /tmp
- printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
- cd /tmp
-
- printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf
虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。
需要Redis 5.0以后的版本
redis-cli --cluster create --cluster-replicas 1 192.168.99.100:7001 192.168.99.100:7002 192.168.99.100:7003 192.168.99.100:8001 192.168.99.100:8002 192.168.99.100:8003
命令说明:
redis-cli --cluster :代表集群操作命令
create: 代表创建集群
--replicas 1 或者 --cluster-replicas 1 : 指定集群中每个master的副本个数为1,此时 节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点数列表中的前n个就是master,其他节点都是slaver节点,随机分配到不同的master
redis-cli -p 7001 cluster nodes
Note:集群时在使用redis-cli登录时要带上-c参数表示为集群模式
redis-cli -c -p 7001
难点:怎么让num存储到7004上,因为之前num计算出的插槽在7001上
- cd /tmp
- mkdir 7004
- cp redis.conf 7004
- sed -i s/6379/7004/g 7004/redis.conf
- redis-server 7004/redis.conf
redis-cli --cluster add-node 192.168.99.100:7004 192.168.99.100:7001
查看节点信息:
根据add-node指令在不设置参数的情况下,新增的节点默认是master节点
查看集群信息
但是发现7004没有分配任何的插槽
redis-cli --cluster reshard 192.168.99.100:7001
根据上面get num已经知道num的插槽值为2765
当输入done后,则会将插槽1-2999,从7001 转移到 7004
当转移完毕后再查看节点信息
已删除了7004节点,当前集群信息如下:
- #可以通过watch的方式一直监控集群信息
- watch redis-cli -p 7001 cluster nodes
在另一个窗口执行删除节点的操作,让7002节点宕机
可以发现7002的状态变成disconnected,fail、并且8003节点变成了master节点
此刻让7002再次启动
redis-server 7002/redis.conf
可以发现7002的状态已经变成connected,并且是slave节点,则8003依然是master节点,7002成为8003的slave节点。则分片集群已经实现了哨兵模式提供的功能。
以上是自动的故障转移,就是当服务器发生故障时Redis自动给我们完成,那如果当我们主动想替换一台master节点呢? -- 手动故障转移 -- 数据迁移
cluster failover
执行指令后,7002变成master节点,8003成为7002的slave节点
- #配置分片集群
- spring:
- redis:
- cluster:
- nodes: #配置分片集群的每一个节点信息
- - 192.168.99.100:7001
- - 192.168.99.100:7002
- - 192.168.99.100:7003
- - 192.168.99.100:8001
- - 192.168.99.100:8002
- - 192.168.99.100:8003
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
-
- @Test
- void testString() {
- //写操作将交给主节点
- stringRedisTemplate.opsForValue().set("name", "李四");
- //读操作交给从节点
- String value = stringRedisTemplate.opsForValue().get("name");
- System.out.println(value);
- }
Note:分片集群,默认就是读写分离的,写在master上,读在slaver上。并且根据key计算插槽值的不同会自动切换与插槽值与之对应的服务器。