Redis 集群
为什么须要搭建集群:
通常,为了进步网站响应速度,总是把热点数据保留在内存中而不是间接从后端数据库中读取。Redis 是一个很好的 Cache 工具。大型网站利用,热点数据量往往微小,几十 G 上百 G 是很失常的事儿。因为内存大小的限度,应用一台 Redis 实例显然无奈满足需要,这时就须要应用多台 Redis 作为缓存数据库。然而如何保证数据存储的一致性呢, 这时就须要搭建 redis 集群. 采纳正当的机制, 保障用户的失常的拜访需要.
采纳 redis 集群, 能够保证数据扩散存储, 同时保证数据存储的一致性. 并且在外部实现高可用的机制. 实现了服务故障的主动迁徙.
集群搭建打算测试
主从划分:3 台主机 3 台从机共 6 台 端口划分 7000-7005
集群搭建
1. 创立集群文件夹:Mkdir cluster
2. 在文件夹中创立多个文件:mkdir 7000 7001 7002 7003 7004 7005
复制配置文件
将 redis 根目录中的 redis.conf 文件复制到 cluster/7000/ 并以原名保留
cp redis.conf cluster/7000/
编辑配置文件
1. 正文本地绑定 IP 地址
2. 敞开保护模式
3. 批改端口号
4. 启动后盾启动
5. 批改 pid 文件
6. 批改长久化文件门路
7. 设定内存优化策略
8. 敞开 AOF 模式
9. 开启集群配置
10. 开启集群配置文件
11. 批改集群超时工夫
复制批改后的配置文件
将 7000 文件夹下的 redis.conf 文件别离复制到 7001-7005 中
批量批改
别离将 7001-7005 文件中的 7000 改为对应的端口号的名称,
批改时留神方向键的应用
通过脚本编辑启动 / 敞开指令
1. 创立启动脚本 vim start.sh
2. 编辑敞开的脚本 vim shutdown.sh
3. 启动 redis 节点:sh start.sh
4. 查看 redis 节点启动是否失常:ps -ef | grep redis
创立 redis 集群
指令:redis-cli –cluster create –cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005
Redis 集群高可用测试
1. 敞开 redis 主机. 查看是否主动实现故障迁徙.
2. 再次启动敞开的主机. 查看是否可能实现主动的挂载.
个别状况下 可能实现主从挂载
个别情况:宕机后的节点重启,可能挂载到其余主节点中(7001-7002)正确的.
Redis 集群原理
Reids 集群高可用推选原理
原理解析:
Redis 的所有节点都会保留以后 redis 集群中的全副主从状态信息. 并且每个节点都可能互相通信. 当一个节点产生宕机景象. 则集群中的其余节点通过 PING-PONG 检测机制查看 Redis 节点是否宕机. 当有半数以上的节点认为宕机. 则认为主节点宕机. 同时由 Redis 残余的主节点 进入选举机制. 投票选举链接宕机的主节点的从机. 实现故障迁徙.
Redis 进群宕机条件
特点:集群中如果主机宕机,那么从机能够持续提供服务,当主机中没有从机时,则向其它主机借用多余的从机. 持续提供服务. 如果主机宕机时没有从机可用,则集群解体.
Redis hash 槽贮存数据原理
RedisCluster 采纳此分区,所有的键依据哈希函数(CRC16[key]%16384)映射到 0 -16383 槽内,共 16384 个槽位,每个节点保护局部槽及槽所映射的键值数据. 依据主节点的个数,平衡划分区间.
算法:哈希函数:Hash()=CRC16[key]%16384
当向 redis 集群中插入数据时,首先将 key 进行计算. 之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据 set 到治理该槽的节点中.
在 IDEA 代码中引入
1. 编辑 pro 配置文件
配置 redis 集群
redis.nodes=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005
2. 编辑配置类
@Configuration // 标识我是一个配置类 个别与 @Bean 注解联用
@PropertySource(“classpath:/properties/redis.properties”)
public class RedisConfig {
@Value("${redis.nodes}")
private String nodes; //node,node,node
@Bean
public JedisCluster jedisCluster(){Set<HostAndPort> nodesSet = new HashSet<>();
String[] nodeArray = nodes.split(",");
for (String node : nodeArray){ //host:port
String host = node.split(":")[0];
int port = Integer.parseInt(node.split(":")[1]);
HostAndPort hostAndPort = new HostAndPort(host, port);
nodesSet.add(hostAndPort);
}
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(1000);
config.setMaxIdle(60);
config.setMinIdle(20);
return new JedisCluster(nodesSet,config);
}
}
3. 编辑 CacheAOP