一、redis的集群搭建:
判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数,搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。
1、安装ruby
# 1.准备环境安装ruby以及redis集群依赖
- yum install -y ruby rubygems
2、在一台机器创建7个配置文件
3、修改不同目录配置文件
记住全部都开启守护进程
4、查看进程
[root@localhost bin]# ps aux|grep redis
结果如下:
二、创建集群:
1.复制集群操作脚本到bin目录中
就是将redis解压文件中的redis-trib.rb复制到redis的bin目录下
[root@master redis-cluster]# cp /usr/local/soft/redis-7.0.0/src/redis-trib.rb /usr/local/soft/redis/bin/
2.创建集群
新的的命令:redis-cli --cluster create 192.168.23.100:6000 192.168.23.100:6001 192.168.23.100:6002 192.168.23.100:6003 192.168.23.100:6004 192.168.23.100:6005 --cluster-replicas 1
3.集群创建成功出现如下提示
三、查看集群状态
1.查看集群状态 check [原始集群中任意节点]
无论查询集群中的哪一个节点,都会显示出整个集群的节点状态
redis-cli --cluster check 192.168.29.100:6000
2.集群节点状态说明
- 主节点
主节点存在hash slots,且主节点的hash slots 没有交叉
主节点不能删除
一个主节点可以有多个从节点
主节点宕机时多个副本之间自动选举主节点
- 从节点
从节点没有hash slots
从节点可以删除
从节点不负责数据的写,只负责数据的同步
2.1哨兵机制(演示其中一个主节点宕机的状态,然后从节点接管)
哨兵机制:当主节点7000崩溃或者进程被杀死,会由他的一个字节点(比如:7004)来替代,成为新的主节点,哪怕后面主节点7000被修复了,也只能成为7004的字节点
3.添加子节点
1.添加主节点 add-node [新加入节点] [原始集群中任意节点]
redis-cli --cluster add-node 192.168.23.100:7006 192.168.23.100:7004 --cluster-slave
- 注意:
1.该节点必须以集群模式启动
2.默认情况下该节点就是以master节点形式添加
4.删除副本节点
1.删除节点 del-node [集群中任意节点] [删除节点id]
- redis-cli --cluster del-node 192.168.169.100:7002 f303c5ae2065accd204c96739fb0bf8e1ba0880e
- 注意:
1.被删除的节点必须是从节点或没有被分配hash slots的节点
用Linux命令行连接redis服务器:
只能单独的连某一个服务器,访问数据的操作都只能去M(master主节点服务器),S(子/从节点服务器)是同步(保存)主节点的数据。
演示如下:
用可视化软件连接redis:
只要连接主节点服务器,就能显示整个集群的数据
用idea连接redis集群:
用idea连接redis集群, 如果用new Jedis()只是单独连redis某个主服务器,如果设置的key的字段不在该主节点的solt范围内,就会报错。要用new JedisCluter(Set<hostAndport>jiqun),里面的set集合是添加redis集群内所有的节点,这样再次进行插值(set xxx xx)就不用考虑在哪个solt(槽),但是用del删除key的时候,需要注意:删除多个key的时候,要保证撒删除的key在同一个solt内,否则就删除失败报错,不知道key的位置,就一个个单独删除。
具体代码如下:
连接redis集群 :
1、先创建一个Set集合,集合的类型是实例类HostAndPort,将所有的redis的host和port存放进去。
HashSet<HostAndPort> hostAndport = new HashSet<>();
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import java.util.HashSet;
public class redis {
public static void main(String[] args) {
// //连接某一个redis服务器
Jedis jedis = new Jedis("192.168.23.100", 6379);
System.out.println("redis数据库连接成功!"+jedis);
System.out.println(jedis.set("name", "猪八戒"));
System.out.println(jedis.get("name"));
//连接redis集群
//TODO:1、先创建一个Set集合,集合的类型是实例类HostAndPort,将所有的redis的host和port存放进去
//TODO:注意redis集群cluster和单个redis服务器(jedis)操作数据基本一样
//TODO:可以将大的集群cluster当做单个jedis使用,但唯一不同的是在del删除键的时候,
//TODO:如果需要同时删除多个key,需要保证这些key在同一个solt范围内,如果不清楚只能一个个单独删除
HashSet<HostAndPort> hostAndport = new HashSet<>();
hostAndport.add(new HostAndPort("192.168.40.100",6000));
hostAndport.add(new HostAndPort("192.168.40.100",6001));
hostAndport.add(new HostAndPort("192.168.40.100",6002));
hostAndport.add(new HostAndPort("192.168.40.100",6003));
hostAndport.add(new HostAndPort("192.168.40.100",6004));
hostAndport.add(new HostAndPort("192.168.40.100",6005));
JedisCluster cluster = new JedisCluster(hostAndport);
cluster.set("age", "23");
cluster.set("name", "zzj");
System.out.println("姓名:"+cluster.mget("name")+","+"年龄:"+cluster.get("age"));
}
}