Redis集群搭建及java连接redis
Redis集群搭建及java连接redisRedis集群分为三种:1、主从关系模式2、Sentinel哨兵关系模式3、Cluster去中心化模式1、主从关系模式1.1、什么是主从模式?(1)主节点只有一个,从节点可以有多个(即一个主节点可以有多个对应的从节点)。(2)主节点值负责写入操作,从节点负责读取操作(从节点无法使用写入操作)。(3)主节点宕机后,从节点会等待主节点修复归来,整个集群无法使用
Redis集群搭建及java连接redis
Redis集群分为三种:
1、主从关系模式
2、Sentinel哨兵关系模式
3、Cluster去中心化模式
1、主从关系模式
1.1、什么是主从模式?
(1)主节点只有一个,从节点可以有多个(即一个主节点可以有多个对应的从节点)。
(2)主节点值负责写入操作,从节点负责读取操作(从节点无法使用写入操作)。
(3)主节点宕机后,从节点会等待主节点修复归来,整个集群无法使用。而一个从节点宕机,不会影响到其他节点的运行。
1.2、主从模式的搭建
(1)redis安装目录下创建master-slave目录,将redis.conf文件复制三份进去(假设有一个主节点,两个从节点)
创建master-slave目录用于存放主从的redis文件
mkdir master-slave
复制三个redis.conf到创建的文件中
cp redis.conf /home/redis/master-slave/redis7001.conf
cp redis.conf /home/redis/master-slave/redis7002.conf
cp redis.conf /home/redis/master-slave/redis7003cd.conf
(2)修改master-slave中的redis文件:
①编辑redis7001.conf文件。
vi redis7001.conf
②找到端口号的位置并修改为7001(自定义端口号)
③修改持久化文件的名称(RDB文件)
④关闭AOF的持久化:
(3)启动redis时指定上面的三个配置文件
redis-server redis7001.conf
redis-server redis7002.conf
redis-server redis7003.conf
(4)分别登录redis7001、7002、7003账号(注意分界面操作)
redis-cli -h ip(自己的ip) -p7001
redis-cli -h ip(自己的ip) -p7002
redis-cli -h ip(自己的ip) -p7003
(5)设置7001为主节点
查看当前节点主从信息
info replication
从节点中设置7001为主节点(两个从节点都要配置)
slaveof ip(主节点所在的ip) 7001
主从节点中分别使用读写操作,发现:
1、主节点只负责写,但是可以进行读操作。
2、从节点中可以进行读操作,但是无法使用写操作。
3、新增一个从节点,会发现数据与其余节点数据一致。
将主节点关闭发现从节点无法进行读取操作,查看主从信息显示主节点处于down状态。
将主节点开启,关闭其中一个从节点,发现主从节点均不受影响。
因此:
1、主节点宕机,集群会处于无法操作状态,从节点不能进行操作。
2、从节点宕机,其余从节点及主节点均不受影响
2、Sentinel哨兵关系模式:
哨兵可以有多个,主节点每隔一段时间会向哨兵发送“状态信息”,一旦超过规定时间未发送信息,哨兵会认为主节点宕机,随后在从节点中选取一个节点作为主节点,主节点再次上线后会成为新的主节点的从节点。
2.1哨兵模式的搭建
1、使用主从模式的redis(不再重新创建主从节点)。
2、修改sentinel文件中的配置
vi sentinel
# 192.168.31.166表示redis主节点的ip (本机的可以为127.0.0.1)
# 7001 表示主节点的端口号
# 1 表示有多少个哨兵选取redis从节点后,该从节点可以当选为主节点。
sentinel monitor mymaster 192.168.31.166 7001 1
3、启动哨兵
redis-sentinel sentinel.conf
4、测试
将7001关闭,,哨兵选取了7002为主节点。
哨兵解决了主从模式中主节点宕机,从节点等待造成的集群停止运行的缺点。
但是哨兵依然没有解决单节点的问题,且持久化文件始终在一个服务器上。
3、Cluster去中心化集群
解决了单节点的问题。使用了分槽的概念。去中心化可以说是sentinel哨兵模式和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。
3.1、创建集群并配置(必须保证aof开启,并保证redis中没有数据)
1、创建three-master-three-slave文件夹
mkdir three-master-three-slave
2、将redis.conf文件复制到three-master-three-slave中
cp redis.conf /home/redis/three-master-three-slave/redis8001.conf
cp redis.conf /home/redis/three-master-three-slave/redis8002.conf
cp redis.conf /home/redis/three-master-three-slave/redis8003.conf
cp redis.conf /home/redis/three-master-three-slave/redis8004.conf
cp redis.conf /home/redis/three-master-three-slave/redis8005.conf
cp redis.conf /home/redis/three-master-three-slave/redis8006.conf
3、分别修改redis8001.conf。。。。的配置
#修改端口号为8001:
port 8001
#修改为其他用户可以连接:
bind * -::*
#修改为后台运行:
daemonize yes
#修改为AOF,改为开启状态:
appendonly yes
#开启集群
cluster-enabled yes 833行
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-8001.conf 841行
# 集群的超时时间
cluster-node-timeout 5000 847行
3.2、启动所有redis并分配槽
(1)启动所有redis
redis-server redis8001.conf
redis-server redis8002.conf
redis-server redis8003.conf
redis-server redis8004.conf
redis-server redis8005.conf
redis-server redis8006.conf
(2)为主节点分配槽以及随机分配从节点,cluster-replica:表示每个主节点跟随的从节点的个数
redis-cli --cluster create --cluster-replicas 1 192.168.31.166:8001 192.168.31.166:8002 192.168.31.166:8003 192.168.31.166:8004 192.168.31.166:8005 192.168.31.166:8006
(3)使用客户端访问
redis-cli -c -h 192.168.31.166 -p 8001
4、java连接redis(maven项目)—jedis
(1)创建maven项目
(2)引入Jedis依赖
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
(3)使用jedis连接redis
public class TestJedis {
public static void main(String[] args) {
Jedis jedis=new Jedis("192.168.31.166",6379);//必须运行远程连接 必须防火墙放行该端口号
//关于字符串
jedis.set("k1","v1");
jedis.set("k8","18");
jedis.mset("k2","v2","k3","v3","k4","v4");
jedis.setnx("k1","12");
jedis.decr("k8");
//操作key
Set<String> keys = jedis.keys("*");
System.out.println("所有的key:"+keys);
jedis.del("k1");
jedis.expire("k2",60);
jedis.ttl("k2");
}
}
(4)使用jedis连接池
public class TestPoolJedis {
public static void main(String[] args) {
//连接池的配置
JedisPoolConfig config=new JedisPoolConfig();
//设置连接池的最大连接数
config.setMaxTotal(100);
//设置最大空闲的个数
config.setMaxIdle(10);
//在从连接池这种获取连接对象前是否测试该对象可以。
config.setTestOnBorrow(true);
//创建连接池对象
JedisPool jedisPool=new JedisPool(config,"192.168.31.166",6379);
//获取jedis对象
Jedis jedis = jedisPool.getResource();
System.out.println(jedis.get("k3"));
//释放资源
jedis.close();
}
}
);
//创建连接池对象
JedisPool jedisPool=new JedisPool(config,"192.168.31.166",6379);
//获取jedis对象
Jedis jedis = jedisPool.getResource();
System.out.println(jedis.get("k3"));
//释放资源
jedis.close();
}
}
更多推荐
所有评论(0)