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@Beanpublic 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