一、Redis 主从复制
1.作用:
主从复制架构仅仅用来解决数据的冗余备份,从节点仅仅用来同步数据
2.主从复制架构图:
3. 主从复制的搭建
(1)第一步,创建三个目录代表三台机器,master,node1,node2
(2)拷贝源码中的redis.conf分别到master,node1,node2中
(3)3台机器修改配置, 修改端口号,开启远程连接,配置主节点
(4)启动3台机器进行测试
主从复制的不足:容易出现单点故障
二.Redis哨兵机制
1. 哨兵Sentinel机制
Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。简单的说哨兵就是带有自动故障转移功能的主从架构,可以解决单点故障的问题。
无法解决: 1.单节点并发压力问题 2.单节点内存和磁盘物理上限
2 .哨兵架构原理
三. Redis集群
1.概述:
Redis在3.0后开始支持Cluster(模式)模式,目前redis的集群支持节点的自动发现,支持slave-master选举和容错,支持在线分片(sharding shard )等特性。
2.集群架构图:
注意:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3) 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
3.集群的搭建
前提:
判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数,搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。
安装步骤:
第一步环境搭建:
(1)准备环境安装ruby以及redis集群依赖
yum install -y ruby rubygems
(2)2.在一台机器创建7个目录
(3)每个目录复制一份配置文件
(4)修改不同目录配置文件
(5)指定不同目录配置文件启动七个节点并查看进程
第二步创建集群:
1.创建集群
命令:redis-cli --cluster create 192.168.19.100:7000 192.168.19.100:7001 192.168.19.100:7002 192.168.19.100:7003 192.168.19.100:7004 192.168.19.100:7005 --cluster-replicas 1
2.集群创建成功出现如下提示
第三步查看集群状态
(1) 查看集群状态 check [原始集群中任意节点] [无]
redis-cli --cluster check 192.168.220.100:7000
集群节点状态说明
(2) 添加子节点
(3)删除子节点(例如7000),观察集群状态
注意:
观察上述(2)和(3)的图,发现此时原本主节点7000被杀死后,由7000为主7005,7006为从的主从体系变为7006为主7005为从的主从体系,这便是Redis的哨兵机制
这时再去启动节点7000的服务,产看集群的状态:
四.如何使用java连接redis集群
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import java.util.HashSet;
public class RedisCluster {
public static void main(String[] args) {
//如何通过javaAPI连接redis集群
//创建JedisCluster的对象
// public JedisCluster(Set<HostAndPort> nodes)
//需要先将所有集群中的节点封装成一个Set集合
//每一个节点需要先封装成HostAndPort对象
// public HostAndPort(String host, int port)
HashSet<HostAndPort> hostAndPorts = new HashSet<>();
hostAndPorts.add(new HostAndPort("192.168.19.100", 7000));
hostAndPorts.add(new HostAndPort("192.168.19.100", 7001));
hostAndPorts.add(new HostAndPort("19 2.168.19.100", 7002));
hostAndPorts.add(new HostAndPort("192.168.19.100", 7003));
hostAndPorts.add(new HostAndPort("192.168.19.100", 7004));
hostAndPorts.add(new HostAndPort("192.168.19.100", 7005));
hostAndPorts.add(new HostAndPort("192.168.19.100", 7006));
JedisCluster jedisCluster = new JedisCluster(hostAndPorts);
jedisCluster.set("name", "xiaownag");
jedisCluster.set("age", "18");
System.out.println(jedisCluster.get("name"));
//如果两个键不在一个主节点中存储,不能一起删除
// jedisCluster.del("name","age");
//推荐集群模式下的redis,删除键的时候,一个一个删
jedisCluster.del("name");
jedisCluster.del("age");
//关闭连接
jedisCluster.close();
}
}